Customized Bind 9

05/17

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
$ 

うまくいっているようだ。


コメント: