WindowsでもUnboundで広告ブロック

広告ブロックを行いたいと思ったときにブラウザであればその手のプラグインを使うというのがあるけどあまり自由度がないし、ブラウザ以外には効果がない。好き勝手やりたいならDNSサーバを使うのが簡単だけどWindowsはどうするの?となるとやはりこちらもUnboundあたりが比較的簡単かなと。そこで、WindowsにUnboundをインストールして広告ブロックを行ってみた。
一応、今回使用したのはWindows 10 Home 64bit Insider Preview Build16237.rs_prerelease.とUnbound 1.6.4

Unboundのインストール

Windows版unboundのインストール・設定 1
Unboundの公式サイトからWindows用のインストーラーをダウンロードする。基本64ビット版をダウンロードでOK.(特別な理由があって32ビット版Windowsを使ってるなら32ビット版をダウンロード)

Windows版unboundのインストール・設定 2
ダウンロードしたファイルを実行。
[Next]をクリック。

Windows版unboundのインストール・設定 3
License Agreementを読んで同意できるなら[I Agree]をクリック。

Windows版unboundのインストール・設定 4
[Next]をクリック。

Windows版unboundのインストール・設定 5
[Next]をクリック。

Windows版unboundのインストール・設定 6
[Install]をクリック。

Windows版unboundのインストール・設定 7
[Finish]をクリック。
インストール完了。

Windows版unboundのインストール・設定 8
インストール先を特に変更していなければUnboundはC:\Program Files\Unboundにインストールされた筈だが、このフォルダはユーザーが普通にファイルを変更できないのでフォルダ内の設定ファイルを変更できない。
そこでフォルダのセキュリティを変更する。(Unboundが正常に動くようになったら戻してね)
エクスプローラーでC:\Program Files\Unboundのフォルダを右クリック。[プロパティ]を開く。

Windows版unboundのインストール・設定 9
「Unboundのプロパティ」画面の上部にある[セキュリティ]タグを選択。
中段右側にある[編集]をクリック。

Windows版unboundのインストール・設定 10
上段のグループ名/ユーザー名のリストからUsers(hoge\Users)を選択。
下段のアクセス許可の「変更」行の「許可」にチェックを付ける。[OK]をクリック。

Unboundの設定

C:\Program Files\Unbound\service.confがメインの設定ファイルになる。変更には改行コードを正しく認識できるエディタを使う。Windowsに付いてる「メモ帳」はダメ。

C:\Program Files\Unbound\service.conf
server:
    verbosity: 0        #ログを取らない

    interface: ::1      #IPv6
    interface: ::0      #IPv6
    interface:127.0.0.1 #IPv4
    interface: 0.0.0.0  #IPv4

    access-control: 0.0.0.0/0 refuse         #IPv4 WANから使わせない
    access-control: ::0/0 refuse             #IPv6 WANから使わせない
    access-control: 127.0.0.0/8 allow        #IPv4 自身は許可
    access-control: ::1 allow                #IPv6 自身は許可
    access-control: 192.168.0.0/24 allow     #IPv4 LANは許可 (自分のLANアドレスに書き換える)
    access-control: fdc0:1:1:0::/64 allow    #IPv6 LANは許可 (自分のLANアドレスに書き換える)

    #INCLUDE FILES
    include: "C:\Program Files\Unbound\local_zone_ipv6.conf" #IPv6+IPv4用  IPv4のみの環境ならこの行は削除 (下の行と排他)
    include: "C:\Program Files\Unbound\local_zone.conf"      #IPv4だけの環境用 IPv6ありの環境ならこの行は削除 (上の行と排他)

    include: "C:\Program Files\Unbound\local_data_ipv6.conf" #IPv4のみの環境ならこの行は削除
    include: "C:\Program Files\Unbound\local_data.conf"      #この行は消さない

    include: "C:\Program Files\Unbound\local_data_malware_ipv6.conf"  #IPv4のみの環境ならこの行は削除
    include: "C:\Program Files\Unbound\local_data_malware.conf"       #この行は消さない

forward-zone:
    name: "."
    forward-addr: 2001:4860:4860::8888   # IPv6 Google public DNS#1 or your ISP's DNS (1st)
    forward-addr: 2001:4860:4860::8844   # IPv6 Google public DNS#2 or your ISP's DNS (2nd)
    forward-addr: 8.8.8.8                # IPv4 Google public DNS#1 or your ISP's DNS (1st) 
    forward-addr: 8.8.4.4                # IPv4 Google public DNS#2 or your ISP's DNS (2nd)

server: auto-trust-anchor-file: "C:\Program Files\Unbound\root.key"

インクルードファイルの部分の5つのファイルは悪いインターネット 広告除去用HOSTSファイルから取得する。広告ブロック用とマルウエアブロック用。

forward-zoneは上のインクルードしたホストリストにひっかからなかったホストを問い合わせる先になるのでプロバイダのDNSサーバや公共DNSサーバを指定する。
なお、IPv4専用のネットワーク環境であるならAAAAレコード(IPv6アドレス)を返答してこないDNSの方が無難なのでプロバイダが提供しているDNSがAAAAフィルタ付きDNSサーバであればそれを利用する方が良いかと。上の例ではGoogleの公共DNSを記載しているけどこれはAAAAレコードを返すので使わないべき。

ゾーンファイルは1つのドメインにアホみたいに大量のホストが存在してそれらをブロックするのにホスト単位でリスト化するのが無駄なのでドメイン単位でブロックするためのリスト。

これでWindowsを再起動したらUnboundがキャッシュサーバとして動く筈。もしくはコマンドプロンプトやPowershellからunbound-control.exeを操作する。起動だけならエクスプローラーからunbound.exeをダブルクリックでも。

Unboundフォルダ内の各exeファイル(の幾つか)を実行すると、ファイアウォールの画面が表示される筈なので全部許可する。(これ忘れると通信できないので動かないように見える)

リゾルバの変更

DNSサーバが準備できてもそれを使う設定をしないと当然使われない。家庭用のLAN環境であればルーターなどのDHCPサーバのDNSサーバの指定項目にunboundを設置したWindows PCのアドレスを書いてやればDHCP配下の端末はUnboundを使うようになってくれる。
端末ごとに手動設定するのであれば、UNIX系であれば/etc/resolv.confにUnboundを設置したWindows PCのアドレスを書く。
ここまでは迷う部分は無い筈。

問題はWindowsの場合。Unboundを設置したWindows PCも忘れずに変えないと。

Windows版unboundのインストール・設定 11
「ネットワーク接続」から使用中のネットワークアダプタを右クリックして[プロパティ]をクリック。
上の例では無線LANの方を選んでいる。

Windows版unboundのインストール・設定 12
「ネットワーク」タグが選択されていることを確認して「インターネットプロトコルバージョン4 (TCP/IPv4)」を選択して[プロパティ]をクリック。

Windows版unboundのインストール・設定 13
「次のDNSサーバーのアドレスを使う」にを付ける。
「優先DNSサーバー」に 127.0.0.1 を指定する。[OK]をクリック。
LAN内の他のホストでは127.0.0.1ではなくUnboundをインストールしたホストのIPアドレスを指定。

Windows版unboundのインストール・設定 14
「ネットワーク」タグが選択されていることを確認して「インターネットプロトコルバージョン6 (TCP/IPv6)」を選択して[プロパティ]をクリック。

Windows版unboundのインストール・設定 15
「次のDNSサーバーのアドレスを使う」にを付ける。
「優先DNSサーバー」に ::1 を指定する。[OK]をクリック。
LAN内の他のホストでは ::1 ではなくUnboundをインストールしたホストのIPv6アドレスを指定。
なお、IPv4専用環境ではこれは不要。

本来ならこれで終わりの筈。
だけど、これだと不具合が発生する場合があるみたい。設定した無線LAN,有線LANが使用不能になるなど。なんか、DHCP環境でDNSだけ手動指定でなるっぽい。
そこで、PC起動時はDNSはDHCPから振られたものを使用し、起動後にDNSを変更するバッチファイルを作成。

C:\Program Files\Unbound\change_dns.bat
@echo off

netsh interface ipv6 set dns name="Wi-Fi" source=dhcp register=non validate=no
netsh interface ipv4 set dns name="Wi-Fi" source=dhcp register=non validate=no

rem netsh interface ipv6 set dns name="イーサネット" source=dhcp register=non validate=no
rem netsh interface ipv4 set dns name="イーサネット" source=dhcp register=non validate=no


timeout 30 /nobreak

netsh interface ipv6 set dns name="Wi-Fi" source=static addr="::1" register=non validate=no
netsh interface ipv4 set dns name="Wi-Fi" source=static addr="127.0.0.1" register=non validate=no

rem netsh interface ipv6 set dns name="イーサネット" source=static addr="::1" register=non validate=no
rem netsh interface ipv4 set dns name="イーサネット" source=static addr="127.0.0.1" register=non validate=no

exit

行頭に rem が付いているのはコメント。だから上の例では有線LANはコメントになっているので実行されない。

上で作成したバッチファイルがWindows起動時に実行されるようにタスクを登録する。で、最近のWindowsのタスク スケジューラはUI操作でタスクを登録してもなかなか思い通りに実行されない代物なのでタスクをコマンドで作成する。(コマンドでタスクを作成すると何故か正常に動くことが多い)

コマンドプロンプトを管理者権限で起動。
これはスタートボタンを右クリックで表示されるリストにコマンドプロンプト(管理者)があればそれ。Windows10の最新環境だとスタートボタンを左クリックして「Windows システムツール」内にある「コマンドプロンプト」を右クリックして「その他」⇢「管理者として実行」

schtasks /create /tn DNS変更 /tr "C:\Program Files\Unbound\change_dns.bat" /sc onstart /rl highest /F

Windows版unboundのインストール・設定 16
作成したタスクが登録されていることを確認する。
スタートボタンを右クリックで「コントロールパネル」から「タスク スケジューラ」を起動。またはWindows10の最新環境ならスタートボタンを左クリックで「Windows 管理ツール」から「タスク スケジューラ」を起動。
左列の「タスク スケジューラ ライブラリ」を選択。中央列上段のリストに「DNS変更」タスクが登録されていることを確認。

Windowsを再起動してログインし、30秒以上待ってからPowerShellまたはコマンドプロンプトを開き、 ipconfig /all を実行する。
「DNSサーバー」の項目を探し ::1 と 127.0.0.1 の2つが表示されていることを確認する。
nslookup www.google.com を実行する。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\foobar> nslookup www.google.com
サーバー:  localhost
Address:  ::1

権限のない回答:
名前:    www.google.com
Addresses:  2404:6800:400a:806::2004
          172.217.27.164

PS C:\Users\foobar>

こんな感じになればOK.
上の例はUnboundを動かしているWindows PCで実行したので「サーバー」がlocalhostになっている。

広告(迷惑)ホストの確認も行う。nslookup baidu.com を実行。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\foobar> nslookup baidu.com
サーバー:  localhost
Address:  ::1

権限のない回答:
名前:    baidu.com
Addresses:  ::
          0.0.0.0

PS C:\Users\foobar>

IPv6では :: に、IPv4では 0.0.0.0 になればOK.

関連記事:


3件のコメント

  1. Windows用Unboundで設定の変更を反映させるにはどうしたら良いんでしょうか?
    こちらで紹介されているファイルを利用させていただいているのですが、
    一通り設定をしてUnboundを実行させた後、ゾーンファイルから適宜コメントアウトで
    特定のホストにアクセスできるよう設定を変更したものの反映方法がわからず困っています。
    コントロールパネル>管理ツール>サービスからUnbound DNS validatorを選択し
    サービスの再起動を行ってもダメで、
    PowerShellからunbound-controlでreloadを実行してもダメでした。
    (unbound-controlの方はstopをかけても直後にstatusでrunningとなっているのが
    確認できたので何がどうなっているのかわからないという感じもしました
    http://i.imgur.com/ydvXzip.png)
    OSの再起動をすると変更が反映されるのは確認できましたが、OSの再起動となると
    細かい設定変更の反映が手間になってしまうので他の方法があれば教えていただきたいです。

  2. unboundの設定変更後、サービスの再起動でその設定は有効になります。
    DNSキャッシュサーバとしては新しい設定で動いているのですが、それを利用するクライアント側はそれとは別にDNSリゾルバキャッシュを持っています。(Windowsの場合)
    クライアントというのはunboundに問い合わせる全てのPCやその他端末ですが、そこにはunboundが動いているWindows PC自身も含まれます。
    名前解決が必要なとときに毎回DNSサーバに対して問い合わせを行うよりも一度問い合わせた結果を自身で溜めておいてそれを利用した方が効率が良いからということのようです。
    弊害もあるのでどうかなとは思いますが。
    Windowsの場合はコマンドプロンプトやPowerShellの管理者権限で、ipconfig /flushdns を行うことでそのWindows PCが起動後直近24時間以内に溜めていたDNSリゾルバキャッシュをフラッシュすることができます。
    hostsファイルの変更はファイル保存後特に何もしなくてもすぐに更新した内容が有効になりますが、DNSではキャッシュをフラッシュするという1手間が必要です。これはDNSサーバが何であっても同じです。
    急ぎでなければ24時間経つと取得済のDNSリゾルバキャッシュは無効になって新たにDNSサーバに問い合わせを行うのでその時点で新しいホスト情報が有効になります。
    ちなみにipconfig /displaydnsを行うとその時点で持っているDNSリゾルバキャッシュを表示することができます。

  3. サービスの再起動を行っておけばOKで、すぐに確認したい場合はipconfig /flushdnsを行えば良いということですね。
    突然のコメントにもかかわらず懇切丁寧でわかりやすい解説をしていただき大変助かりました。ありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です