WindowsでもUnboundで広告ブロック

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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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つのドメインにアホみたいに大量のホストが存在してそれらをブロックするのにホスト単位でリスト化するのが無駄なのでドメイン単位でブロックするためのリスト。

最後の33行目は1行目からのServer:セクションと同じ。別セクションの後に追記するような場合はこんな書き方。あまり褒められないかも。上の例だとforward-zoneセクションの前あたりに行頭の「Server:」を除いて置いてやった方が同じセクションの設定が飛び飛びになるより良いかも。

これで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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
@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>

こんな感じにIPv6, IPv4ともにアドレスが正しく入っていれば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.

関連記事:

コメント: WindowsでもUnboundで広告ブロック

  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を行えば良いということですね。
    突然のコメントにもかかわらず懇切丁寧でわかりやすい解説をしていただき大変助かりました。ありがとうございました!

  4. がと様

    はじめまして。当HPで手順を見て設定をしたのですが、うまくいかないところがございます。

    nslookupの手順でつまづいていて、nslookupに失敗しているのです。
    問題切り分けをしたところ、unbound-control.exe reloadをCMDで実行したところ、
    以下のエラーメッセージが出ております。

    [1633750260] unbound-control[4452:0] error: connect: Connection refused.
    for 127.0.0.1 port 8953

    内容としては、127.0.0.1がport8953に対して疎通性がとれないということの認識ですが、
    どのようにしたら解決できますでしょうか?

    お忙しいところ恐縮です。ご確認いただけますでしょうか

  5. Winedows用のUnboundは4年ほど前に記事に書いた頃とだいぶ変わっているようです。記事の内容はだいぶ手直しが必要な感じです。
    nslookupが失敗するようでしたら、とりあえずWindowsの管理機能の「サービス」でUnboundサービスが起動していることを確認してみてください。
    起動していないようであれば「サービス」でUnboundを起動してnslookupを試してください。それで問題ないようであれば、Unboundがサービスの自動起動失敗する部分を直すことになるかと思います。(その部分を確認中です)

  6. がと様

    タカシジャンボイモです。

    お早い回答いただき、誠にありがとうございました。
    いただいたアドバイスにもとづき確認をしたところ、うまくいきました。

    ご参考までに、下名が対応した手順をお伝えいたします。

    [1]Windowsの管理機能の「サービス」を開く
    [2]プログラム「Unbound DNS validator」を起動する。
     #デフォルトだと、この部分が無効になっていました。
    [3]起動したことを確認する。
     その後はコマプロのnslookup http://www.google.comの確認 ⇒ 想定通り回答あり
     nslookup http://www.baidu.com ⇒ 想定通り回答無し
    [4]DNSの設定を各PCやスマホに実施
    [5]googleの閲覧をし、アクセス可能であることを確認。
    [6]baiduの閲覧をし、アクセス不可であることを確認。
      

  7. 無事動いたようで良かったです。Unboundは4年前からのChangelogを見るとかなり多くの変更・修正点がありましたが、「がとらぼ」の超基本的な設定部分では特に大きな影響はなかったようです。ただ、この記事で触れてなかったremote-controlコマンドは、設定で許可しておかないと利用できないのでその部分のとっかかりになる点についてだけ記事を作りました。WindowsでもUnbound (Remote controlの準備)になります。

コメントは締め切られています。