広告ブロックを行いたいと思ったときにブラウザであればその手のプラグインを使うというのがあるけどあまり自由度がないし、ブラウザ以外には効果がない。好き勝手やりたいならDNSサーバを使うのが簡単だけどWindowsはどうするの?となるとやはりこちらもUnboundあたりが比較的簡単かなと。そこで、WindowsにUnboundをインストールして広告ブロックを行ってみた。
一応、今回使用したのはWindows 10 Home 64bit Insider Preview Build16237.rs_prerelease.とUnbound 1.6.4
Unboundのインストール
Unboundの公式サイトからWindows用のインストーラーをダウンロードする。基本64ビット版をダウンロードでOK.(特別な理由があって32ビット版Windowsを使ってるなら32ビット版をダウンロード)
ダウンロードしたファイルを実行。
[Next]をクリック。
License Agreementを読んで同意できるなら[I Agree]をクリック。
[Next]をクリック。
[Next]をクリック。
[Install]をクリック。
[Finish]をクリック。
インストール完了。
インストール先を特に変更していなければUnboundはC:\Program Files\Unboundにインストールされた筈だが、このフォルダはユーザーが普通にファイルを変更できないのでフォルダ内の設定ファイルを変更できない。
そこでフォルダのセキュリティを変更する。(Unboundが正常に動くようになったら戻してね)
エクスプローラーでC:\Program Files\Unboundのフォルダを右クリック。[プロパティ]を開く。
「Unboundのプロパティ」画面の上部にある[セキュリティ]タグを選択。
中段右側にある[編集]をクリック。
上段のグループ名/ユーザー名のリストから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も忘れずに変えないと。
「ネットワーク接続」から使用中のネットワークアダプタを右クリックして[プロパティ]をクリック。
上の例では無線LANの方を選んでいる。
「ネットワーク」タグが選択されていることを確認して「インターネットプロトコルバージョン4 (TCP/IPv4)」を選択して[プロパティ]をクリック。
「次のDNSサーバーのアドレスを使う」にを付ける。
「優先DNSサーバー」に 127.0.0.1 を指定する。[OK]をクリック。
LAN内の他のホストでは127.0.0.1ではなくUnboundをインストールしたホストのIPアドレスを指定。
「ネットワーク」タグが選択されていることを確認して「インターネットプロトコルバージョン6 (TCP/IPv6)」を選択して[プロパティ]をクリック。
「次の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
作成したタスクが登録されていることを確認する。
スタートボタンを右クリックで「コントロールパネル」から「タスク スケジューラ」を起動。または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.
関連記事: