Edited at
DNSDay 18

PowerDNS と Knot DNS で DNS 権威サーバーを組んでみた話

More than 3 years have passed since last update.


【追記: 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 などでポートフォワードしてあげる必要があります。


pdns.conf

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



knot.conf

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]



pf.conf

# 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


console

$ drill @<NS_MASTER_IP> <domain>

$ drill @<NS_SLAVE_IP> -p 10053 <domain>

権威サーバーで名前が引けていればひとまず OK です。


Tricky Config

ちなみに自分の場合、VPS を使ってセカンダリ DNS を立てたりせず無料のセカンダリ DNS サービスを使っていることもあって pdns.conf と knot.conf を以下のように書き換えています。


pdns.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



knot.conf

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


注釈