LoginSignup
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-12

【追記: 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

注釈

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4