自宅に導入したAlpine Linux仮想マシンで稼働する、 Unbound DNS サーバに DNS ベースの 広告ブロック を設定して、ネットワーク内の全てのデバイスへ、 広告ブロック を提供できるようにします。
Alpine Linux に導入したUnbound
以前、Alpine Linux 3.17.1仮想マシンに構築した、UnboundによるDNSフルサービスリゾルバは、
[b]
その後、Celeron J4125ミニPCで構築した、VMware ESXi 8.0ホストごと自宅へ導入、運用開始しています。
unbound.confの記述
UnboundにおけるDNSベースの広告ブロックは、 その内容を記したインクルードファイルを作成し、それを unbound.conf へ以下のようにして組み込むだけ。
1 2 3 |
## INCLUDES server: include: /etc/unbound/adblock.conf |
肝となる広告ブロック手法について、今回は以下の2種類の方法を試してみます。
1) Steve Blackさんのブロックリスト
Unboundにおいて、任意のサイトの名前解決をブロックする単純な手段は、設定ファイルの中でドメインを名指しで列記して REFUSE 扱いとするか、ダミーIPアドレス 0.0.0.0 を記述してしまうものです。
1 |
local-zone: "ads-r-us.com" refuse |
このときワイルカードを使えないので、サブドメインがある場合は面倒でもその全てを列記する必要があります。
1 2 3 4 |
local-zone: "abc.ads-r-us.com" refuse local-zone: "def.ads-r-us.com" refuse local-zone: "ghi.ads-r-us.com" refuse local-zone: "xyz.ads-r-us.com" refuse |
ネタ元となる広告サイトリストでポピュラーなのは、以前記事にしたAndroid向けの広告ブロックアプリAdAwayでも参照されている、Steve Blockさんのリスト。
彼のGitHubページで得られるホスト一覧を元に、上記のようなUnboundが解釈できる文型へ変換するスクリプトは次の通りです。
これはAlpine LinuxのWikiページの解説を参考にしつつも、インクルードする設定ファイルはroot権限の必要があるため、 >> ではなく sudo tee で出力しています。
1 2 3 4 5 6 7 8 |
$ curl -s https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | \ grep ^0.0.0.0 - | \ sed 's/ #.*$//; s/^0.0.0.0 \(.*\)/local-zone: "\1" refuse/' | \ sudo tee -a /etc/unbound/adblock.conf $ ls -l /etc/unbound/adblock_plain.conf -rw-r--r-- 1 root root 8846389 Mar 2 16:10 adblock.conf |
できあがったのは、18万行、8MBを超える大きなブロックリストファイルでした。
このままUnboundに読み込ませて適用する前に、日頃のブログ管理で必要な次のサイトをコメントアウトして、ブロック除外としました。
- A8.Net管理ページ
- ブログ村管理ページ
- Google Analytics管理サイト
- Amazonアフィリエイト
1 2 3 4 5 6 7 8 |
$ cat /etc/unbound/adblock_plain.conf | grep "^#" #local-zone: "a8.net" refuse #local-zone: "amazon-adsystem.com" refuse #local-zone: "assoc-amazon.com" refuse #local-zone: "blog.with2.net" refuse #local-zone: "rcm-fe.amazon-adsystem.com" refuse #local-zone: "rcm-jp.amazon.co.jp" refuse #local-zone: "analytics.google.com" refuse |
設定の編集を終えたら、 unbound-control コマンドで再読込を促します。
1 2 3 4 5 |
$ sudo unbound-checkconf unbound-checkconf: no errors in /etc/unbound/unbound.conf $ sudo unbound-control reload ok |
8MBを超える設定ファイルもすんなり読み込んでもらえました。もちろんDNSサービスも広告ブロックも、滞りなくこなしてくれます。
ブロック除外設定を別インクルードに
頻繁に更新される広告リストを元にスクリプトで生成した、広告ブロック設定ファイル adblock.conf を更新したいと思った時に弊害となるのが、先ほどコメントアウトしたブロック除外サイトです。
更新の度に一つ一つ探してコメントアウトするわけにもいかないので、ブロック除外対象だけを定義した次のインクルードを作ってみました。
1 2 3 4 5 6 7 |
local-zone: "a8.net" transparent local-zone: "amazon-adsystem.com" transparent local-zone: "assoc-amazon.com" transparent local-zone: "blog.with2.net" transparent local-zone: "rcm-fe.amazon-adsystem.com" transparent local-zone: "rcm-jp.amazon.co.jp" transparent local-zone: "analytics.google.com" transparent |
これを unbound.conf の中で広告ブロック設定よりも後方でインクルードします。
1 2 3 4 |
## INCLUDES server: include: /etc/unbound/adblock.conf include: /etc/unbound/adblock_bypass.conf |
これで今後、広告ブロック設定を自動更新するようなバッチ処理を設定しても、ブロック除外サイトへのアクセスが阻害されることはないでしょう。
2) Pete Loweさんのブロックリスト
Unboundにおける広告ブロックのもう1つの手法が、 local-zone redirect と local-data を使ったもので、その利点は上述のようなサブドメインがいくつもあるサイトも、次の通りまとめて処理できることです。
1 2 |
local-zone: "ads-r-us.com" redirect local-data: "ads-r-us.com" A 0.0.0.0 |
広告サイトの情報を集めたPeter Loweさんのこちらのサイトでは、Unboundのこの手法に則った書式で、リストを直接ダウンロードすることが可能です。
ダウンロード時にURIのクエリ文字列の連結が誤って解釈されてしまうので、必ずクォートで囲むようにします(さもないとhtml形式で出力されてしまう)。
1 2 3 |
$ sudo curl -sS -o /etc/unbound/adblock_pgl.conf "https://pgl.yoyo.org/as/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext" または、 $ sudo wget -qO /etc/unbound/adblock_pgl.conf "https://pgl.yoyo.org/as/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext" |
得られた設定ファイルをインクルードする手順は同じです。
実際に使ってみた感じでは、こちらのリストの方がやや「緩い」のかな、と言う気がしました。
効果のほどは
自宅LANのDNSサーバへDNSベースの広告ブロックの機能を追加することにより、ネットワーク内のPCやスマートフォンが、特に何もせずとも等しくその恩恵を受けることができるのは、思っていた以上に快適なことです。