BIND9 の Response Policy Zone 設定

日本では、児童ポルノサイトのアクセスブロックに使われることの多い RPZ を設定してみる。
目的は、勝手に情報送信されそうなサイトへのアクセスをブロックすること。
今回は自宅ネットワークから Baidu へのアクセスを遮断してみたい。

注意点

ある意味ではドメインを騙るので、下手なブロックをすると意図しない挙動を示す。
特に Web サイト(ポート80)だけをブロックするわけではない*1ことを知らない人もいる。
また、今回の設定では実際に運用されているドメインの応答を書き換えるので、存在しないドメインは応答できない。
ついでに言うと DNSSEC を考慮していないので、DNSSEC 検証とかは必ず失敗する。

実際の設定 (ゾーンファイル)

先に、ブロックしたいドメインを記述したゾーンファイルを作る。
本来的には named.conf を書き換えてからゾーンファイルを準備するんだろうけど…
bind9 が読み込むときに全部揃っていれば済む話なわけで、気分的に。

$ su -
# cd /var/chroot/bind9/etc/bind/files; pwd
# cp -p localhost.zone rpz.zone
# vi rpz.zone
:%s/^localhost./baidu.com/
・・・他、記述

ということで、localhost用ゾーンをテンプレート代わりにゾーン作成。
中身は、こんな感じにしてみた。

;; Response Policy Zone
$TTL 86400
@ IN SOA localhost. root.localhost. (
			2015041100	; Serial
			10800		; Refresh after 3 Hours
			3600		; Retry after 1 Hour
			604800		; Expire after 1 Week
			86400 )		; Minimum TTL of 1 Day
			IN	NS	localhost.

baidu.com		IN	A	192.168.1.101
*.baidu.com		IN	A	192.168.1.101
baidu.jp		IN	A	192.168.1.101
*.baidu.jp		IN	A	192.168.1.101
baidu.co.jp		IN	A	192.168.1.101
*.baidu.co.jp		IN	A	192.168.1.101


ちなみに 192.168.1.101 には、急遽 apache2 をインストールしておいた。

実際の設定 (named.conf)

RPZ 機能を使うことを named.conf の options ステートメントに書く。

# cd /var/chroot/bind9/etc/bind; pwd
# [ -d backup ] || mkdir backup
# cp -p named.conf backup/named.conf.$(date +'%Y%m%d')
# vi named.conf
-----
	response-policy { zone "rpz.zone"; };
-----


ここで宣言しているゾーン名は、たぶん任意。

# diff named.conf backup/named.conf.$(date +'%Y%m%d')
**d**
<	response-policy { zone "rpz.zone"; };
#


自分の named.conf は、多少脚色*2しているけどこんな感じ。

// home network dns

acl "homenetwork" {
	192.168.1.0/24;
};

acl "bogon" {
	0.0.0.0/8;
	10.0.0.0/8;
	169.254.0.0/16;
	172.16.0.0/12;
	192.0.2.0/24;
	192.168.0.0/24;
	192.168.2.0/23;
	192.168.4.0/22;
	192.168.8.0/21;
	192.168.16.0/20;
	192.168.32.0/19;
	192.168.64.0/18;
	192.168.128.0/17;
	224.0.0.0/3;
};

options {
	directory "/etc/bind";
	allow-transfer { none; };
	listen-on port 53 { 127.0.0.1; homenetwork; };
	dump-file "/var/dump/cache.dump.db";
	statistics-file "/var/dump/named_stats.db";
	blackhole { bogon; };
	recursion yes;
	version "unknown";
	allow-update { none; };
	response-policy { zone "rpz.zone"; };
};

include "named.conf.rndc";
include "named.conf.local";
include "named.conf.zones";


options ステートメントで「RPZ を、この "rpz.zone" ゾーンで使うよ」と宣言した。
次は「"rpz.zone" ゾーンは、このファイルで使うよ」と宣言する。

"named.conf.local" にするか "named.conf.zones" にするかで迷ったけど、一度書いたら書き換える機会がそうそうない "named.conf.local" に書いておく。
これは root.hint とか localhost とか、書いているファイルなので…。
type は master で良い。
file は、さっき作った files/rpz.zone で記述。

# cd /var/chroot/bind9/etc/bind; pwd
# cp -p named.conf.local backup/named.conf.local.$(date '+%Y%m%d')
# vi named.conf.local
# diff named.conf.local backup/named.conf.local.$(date '+%Y%m%d')
4,6d3
< // Response Policy Zone ////////////////////////////////////
< zone "rpz.zone" {type master; file "files/rpz.zone"; };
<
# named-checkconf -t /var/chroot/bind9
# rndc reload
rndc: connection to remote host closed
This may indicate that
* the remote server is using an older version of the command protocol,
* this host is not authorized to connect,
* the clocks are not synchronized, or
* the key is invalid.


・・・!!?!!????
named-checkconf は OK なのに rndc がダメとか、どういうこと?

# service bind9 restart
[....] Stopping domain name service...: bind9rndc: connect failed: 127.0.0.1#953: connection refused
. ok
[ ok ] Starting domain name service...: bind9.
# rndc status
version: 9.8.4-rpz2+rl005.12-P1 (unknown)
CPUs found: 4
worker threads: 4
number of zones: 21
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
# rndc reload
server reload successful
# vi /var/chroot/bind9/etc/bind/files/rpz.zone
-----
シリアル値をひとつ上げて保存
-----
# rndc reload
rndc: connection to remote host closed
This may indicate that
* the remote server is using an older version of the command protocol,
* this host is not authorized to connect,
* the clocks are not synchronized, or
* the key is invalid.
#


どうやら、rpz.zone のシリアルが上がると rndc コマンドが使えなくなるみたい… orz
なんだこれ?
起動は OK なのに rndc コマンドが使えなくなるって…意味がわからない。


とりあえず、クライアント側でアクセスを試みてみると、192.168.1.101 の Web サイトが表示される。

# tail /var/log/syslog
Apr 11 13:58:31 raspberrypi named[15566]: client 192.168.1.2#59496: rpz QNAME Local-Data rewrite baidu.co.jp via baidu.co.jp.rpz.zone


うん、ログもきちんと rewrite してくれているのを出している。
service bind9 restart をすれば、とりあえず問題は出ないのを確認。


でも、もうちょっと設定を見直さないと、まずいかもしれないなぁ…

*1:特定ドメインへアクセスする前の名前解決時点でアクセス先 IP アドレスが書き換わるため、クライアントからは ftp だろうが ssh だろうが、全部書き換わったIPアドレスとやり取りしようとする。

*2:脚色と言っても、不要な設定をコメントアウトしている部分を削除したとか、bogon の中身を見やすいように上下入れ替えたりとかしたくらい。