【追記: 2015/12/18】まずは
DNS Advent Calendar 2015 の18日目の記事です。
こういった Advent Calendar には初めて参加するので誤字脱字、いろんな箇所で至らない点がありますが、コメントでのご指摘など頂ければと思います。
もちろんリファレンスなどで書いてあることも含まれていますので「こんなおかしなことしてるんだな」と思いながら見ていただければと思います。
事の始まり
- 自分「ここ最近 VALUE-DOMAIN で障害1やらなんやらで騒がしいなぁと思い InterLink の固定 IP もあるし思い切って自前で DNS のサービスを提供するかー」
- 自分「PowerDNS と NSD を用いたページ2はあれど PowerDNS と Knot DNS を用いたページはないし、NSD を Slave で使うとシリアルの値を比較しない3というのを(検討当時)見たのでじゃあ Knot DNS でやってみよう」
ネットワーク構成
DB - NS Master - NS Slave -|- The Internet
ソフト構成
- DB
- FreeBSD(10.2-RELEASE amd64)
- MySQL(5.6.26)
- NS Master
- Raspbian(8.0 Jessie)
- PowerDNS Authoritative Server(3.4.1)
- NS Slave
- FreeBSD(10.1-RELEASE amd64)
- Knot DNS(2.0.1)
- PF(BB ルーター(NAT 箱)兼用)
Install
基本的に FreeBSD ports や aptitude でインストールしたため割愛。4
Config
とりあえず関係のある部分だけ。基本的にはリファレンスを見て自分の環境に合わせて書き換えてます(がもしかしたら間違いもあるかもしれません【追記】2015/11/13 20:12)。なお NS Slave は BB ルーターを兼用していて Unbound をインストールしているため PF や ipfw などでポートフォワードしてあげる必要があります。
allow-axfr-ips=127.0.0.0/8,172.16.0.0/12
allow-dnsupdate-from=127.0.0.0/8
daemon=yes
master=yes
launch+=gmysql
gmysql-host=<DB_IP>
gmysql-port=
gmysql-dbname=<DB_TABLE>
gmysql-user=<DB_USER>
gmysql-password=<DB_PASSWD>
gmysql-dnssec=yes
server:
listen: <NS_SLAVE_IP>@10053
listen: 127.0.0.1@10053
log:
- target: syslog
any: debug
server: info
zone: info
remote:
- id: master
address: <NS_MASTER_IP>@53
acl:
- id: acl_master
address: <NS_MASTER_IP>
action: notify
- id: lan
address: 172.16.0.0/12
action: [transfer, notify]
template:
- id: default
storage: "/var/db/knot"
zone:
- domain: <domain>
master: master
acl: [acl_master, lan]
# macros
int_if = "re2"
ext_ifv4 = "ng0"
rdr on $ext_ifv4 proto tcp from any to $ext_ifv4 port 53 -> <NS_SLAVE_IP> port 10053
rdr on $ext_ifv4 proto udp from any to $ext_ifv4 port 53 -> <NS_SLAVE_IP> port 10053
Check
$ drill @<NS_MASTER_IP> <domain>
$ drill @<NS_SLAVE_IP> -p 10053 <domain>
権威サーバーで名前が引けていればひとまず OK です。
Tricky Config
ちなみに自分の場合、VPS を使ってセカンダリ DNS を立てたりせず無料のセカンダリ DNS サービスを使っていることもあって pdns.conf と knot.conf を以下のように書き換えています。
allow-axfr-ips=127.0.0.0/8,172.16.0.0/12,<2ndDNS_SRV_IP>/32
allow-dnsupdate-from=127.0.0.0/8
daemon=yes
master=yes
launch+=gmysql
gmysql-host=<DB_IP>
gmysql-port=
gmysql-dbname=<DB_TABLE>
gmysql-user=<DB_USER>
gmysql-password=<DB_PASSWD>
gmysql-dnssec=yes
server:
listen: <NS_SLAVE_IP>@10053
listen: 127.0.0.1@10053
log:
- target: syslog
any: debug
server: info
zone: info
remote:
- id: master
address: <NS_MASTER_IP>@53
acl:
- id: acl_master
address: <NS_MASTER_IP>
action: notify
- id: lan
address: 172.16.0.0/12
action: [transfer, notify]
- id: <2ndDNS_SRV_NAME>
address: [<2ndDNS_SRV_IP>]
action: [transfer, notify]
template:
- id: default
storage: "/var/db/knot"
zone:
- domain: <domain>
master: master
acl: [acl_master, lan, <2ndDNS_SRV_NAME>]
LINK
- リファレンス
- PowerDNS
- Knot DNS
- 出会い
- 【ぷろじぇくと ぞうさん】 ~E-Bananaサーバ 構築日記~ 第61日目:【障害復旧対応】花子救出大作戦 with Mumumu
- Knot DNSを使ってみた -権威DNSサーバでのDDoS対策おまけつき
注釈
-
自分の場合は ports で Knot DNS をインストールする時にオプションを全選択してインストールしました。 ↩