BINDのカスタマイズ
目次
AdGuardHomeの代替
家の中では、内向きDNSにAdGuard Homeを使っていた。
ただ最近動作がもっさりしてきたり、そもそも思った通りの動作にならなかったりしていた。
そこで、動作原理は知っていたので、同じことがBindでもできないかなと調べていたら、見つけた。
早速、自分の家用に構築してみる。
構築
仕組みを見てみると、有志が作っている広告サイトの一覧をゾーン定義ファイルやiptablesのルールとして提供している。
それをBindやiptablesに適用して、広告サイトのIPアドレスを0.0.0.0で返答させたり、パケットをREJECTさせたりする。
よく考えられてる。
さて、準備をしていく。前提としてDebianのBind 9に適用していく。
まずゾーン定義ファイルをインクルードするところを。
下記ファイルの最終行にこれを追記。
/etc/bind/named.conf.local
//for ad-block list
include "/etc/bind/ad-blacklist";
次に広告サイトのIPを0.0.0.0で返すゾーンファイルを作る。
これを全ての広告サイトのゾーンファイルとすることになる。
NSレコードは適宜変更する必要がある。
/etc/bind/null.zone.file
$TTL 86400 ;one day
@ IN SOA ads.example.com. root.example.com. (
1 ;Serial
28800 ;Refresh
7200 ;Retry
864000 ;Expire
86400 ) ;Negative Cache TTL
;
NS internal.yf-19.net.
A 0.0.0.0
@ IN A 0.0.0.0
* IN A 0.0.0.0
さてここからが本番。
ゾーン定義ファイルをダウンロードするスクリプトを作成する。
こちらはGoogle Analyticsを使っているので、そこは除外することにする。
update_adserver_list_for_bind9.sh
#!/bin/bash
WGETBIN=$(which wget)
ADBLACKLIST=/etc/bind/ad-blacklist
SOURCEURL='http://pgl.yoyo.org/adservers/serverlist.php?hostformat=bindconfig&showintro=0&mimetype=plaintext'
BUFFERFILE=/tmp/$(basename ${ADBLACKLIST})
SERVICE=named
if [ "x${WGETBIN}" == "x" ];
then
echo "wget was not found"
exit 1
fi
${WGETBIN} -q -O $BUFFERFILE ${SOURCEURL} && \
if [ -f $BUFFERFILE ];
then
sed -i -e 's/null/\/etc\/bind\/null/; /analytics\.google\.com/d;' ${BUFFERFILE}
mv -v $BUFFERFILE $ADBLACKLIST
systemctl restart $SERVICE
fi
これを実行してみる。
$ sudo update_adserver_list_for_bind9.sh
早速結果を確認する。
$ dig +short valuecommerce.com
0.0.0.0
$
うまくいっているようだ。