Posted at
DNSDay 15

PowerDNSでRFC7706

More than 3 years have passed since last update.


はじめに

DNS Advent Calendar 2015 の15日目の記事です。

RFC 7706(Decreasing Access Time to Root Servers by Running One on Loopback) は、DNSキャッシュサーバのloopbackにてルートサーバ(スレーブ)を動かすことについて記載しています。このRFCのAppendix Bには、


  • Bind

  • Unbound/NSD

  • Microsoft Windows Server 2012

の設定例がありますが、PowerDNSの設定例はありません。ここではPowerDNSでRFC7706を設定してみます。


設定方法


環境

ここでは以下の環境を使用します。


  • CentOS 6.7

  • PowerDNS Authoritative Server 3.4.7

  • PowerDNS Recursor 3.7.3

  • MySQL 5.1.73

  • 192.167.33.0/24に対して、フルリゾルバを提供する。


MySQL

RPMのMySQLパッケージをインストールし、mysqldを起動します。

$ sudo yum install mysql-server

$ sudo service mysqld start
$ sudo chkconfig mysqld on

PowerDNS用データベースを作成します。

$ mysql -uroot 

> CREATE DATABASE pdns;
> GRANT ALL ON pdns.* TO pdns@127.0.0.1 identified by 'pdns_password';
> quit

Generic MySQL and PostgreSQL backends(doc.powerdns.com)の"The default setup conforms to the following schema:"を入力します。powerdns_mysql_backend_schema.sqlはここ(gist)にあります。

$ mysql -h127.0.0.1 -updns -p pdns < powerdns_mysql_backend_schema.sql

ルートゾーンの設定をdomainsテーブルに追加します。この時、


  • マスターサーバには、ルートサーバのIPアドレスをカンマ区切りで指定

  • nameは"."ではなく""(空文字列)を指定


    • nameに"."を指定すると、ルートサーバからゾーン転送でデータを取得してきますが、ゾーン外のデータとして無視されてしまいます。



を指定します。

$ mysql -h127.0.0.1 -updns -p pdns

> INSERT INTO domains
(name,type,master)
values('',
'SLAVE',
'192.228.79.201,192.33.4.12,192.5.5.241,192.112.36.4,193.0.14.129,192.0.47.132,192.0.32.132');
> quit


PowerDNS Authoritative Server

まず、PowerDNS Authoritative Serverをコンパイルするためのライブラリをインストールします。

$ sudo yum install boost-devel mysql-devel

PowerDNS.comからPowerDNS Authoritative Serverをダウンロードします。

$ wget https://downloads.powerdns.com/releases/pdns-3.4.7.tar.bz2

tarballを展開し、コンパイル・インストールします。

$ tar xjf pdns-3.4.7.tar.bz2

$ cd pdns-3.4.7
$ ./configure
$ make
$ sudo make install
$ sudo cp pdns/pdns /etc/init.d/
$ sudo chkconfiig --add pdns

PowerDNS用のユーザを追加します。

$ sudo groupadd pdns

$ sudo useradd -g pdns pdns

PowerDNS Authoritative Serverの設定ファイルを作成します。

$ sudo cp /usr/local/etc/pdns.conf-dist /usr/local/etc/pdns.conf

$ sudo vi /usr/local/etc/pdns.conf

次の設定を追加します。


  • daemonとして動作

  • loopback 127.12.12.12をbind

  • gidはpdns

  • uidはpdns

  • slave機能を有効

  • バックエンドはMySQL

設定ファイルには以下の行を追加します。

daemon=yes

local-address=127.12.12.12
setgid=pdns
setuid=pdns
slave=yes

launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-dbname=pdns
gmysql-password=pdns_password

pdnsを起動します。

$ sudo service pdns start

$ sudo chkconfig pdns on

pdnsは起動後にルートゾーンのゾーン転送を行い、成功すれば以下のようなログを出力します。

$ less /var/log/messagges

Dec 13 13:20:36 localhost pdns[13016]: 1 slave domain needs checking, 0 queued for AXFR
Dec 13 13:20:37 localhost pdns[13016]: Received serial number updates for 1 zones, had 0 timeouts
Dec 13 13:20:37 localhost pdns[13016]: Domain '' is stale, master serial 2015121300, our serial 0
Dec 13 13:20:37 localhost pdns[13016]: Initiating transfer of '' from remote '193.0.14.129'
Dec 13 13:20:37 localhost pdns[13016]: Done launching threads, ready to distributequestions
Dec 13 13:20:37 localhost pdns[13016]: AXFR started for ''
Dec 13 13:20:37 localhost pdns[13016]: Transaction started for ''
Dec 13 13:20:39 localhost pdns[13016]: AXFR done for '', zone committed with serial number 2015121300


PowerDNS Recursor

PowerDNS.comからPowerDNS Recursorをダウンロードします。

$ wget https://downloads.powerdns.com/releases/pdns-recursor-3.7.3.tar.bz2

tarballを展開し、コンパイル・インストールします。

$ tar xjf pdns-recursor-3.7.3.tar.bz2

$ cd pdns-recursor-3.7.3
$ ./configure
$ make
$ sudo make install
$ sudo chkconfig --add pdns-recursor

PowerDNS Recursorの設定ファイルを作成します。

$ sudo cp /etc/powerdns/recursor.conf-dist /etc/powerdns/recursor.conf

$ sudo vi /etc/powerdns/recursor.conf

次の設定を追加します。


  • 127.0.0.0/8, 192.168.33.0/24からの問い合わせを許可する。

  • ルートゾーン(".")は127.12.12.12へ問い合わせる。

  • 127.0.0.1と192.168.33.254をbind

  • gidはpdns

  • uidはpdns

設定ファイルには以下の行を追加します。

allow-from=127.0.0.0/8, 192.168.33.0/24

forward-zones=.=127.12.12.12
local-address=127.0.0.1,192.168.33.254
setgid=pdns
setuid=pdns

PowerDNS Recursorを起動します。

$ sudo service pdns-recursor start

$ sudo chkconfig pdns-recursor on


動作確認

digにてフルリゾルバの動作を確認します。

$ dig @127.0.0.1 qiita.com a

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> @127.0.0.1 qiita.com a
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50249
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;qiita.com. IN A

;; ANSWER SECTION:
qiita.com. 60 IN A 176.34.54.212

;; Query time: 555 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 13 14:20:41 2015
;; MSG SIZE rcvd: 43

tcpdumpにてloopbackのDNSサーバへ問い合わせしていることを確認します。

$ sudo tcpdump -i lo -n port 53

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
14:20:40.867466 IP 127.0.0.1.56788 > 127.0.0.1.domain: 50249+ A? qiita.com. (27)
14:20:40.867654 IP 127.12.12.12.11423 > 127.12.12.12.domain: 64624 A? qiita.com. (27)
14:20:40.872687 IP 127.12.12.12.domain > 127.12.12.12.11423: 64624- 0/13/13 (483)
14:20:41.151102 IP 127.12.12.12.45802 > 127.12.12.12.domain: 46524 A? ns-1049.awsdns-03.org. (39)
14:20:41.154018 IP 127.12.12.12.domain > 127.12.12.12.45802: 46524- 0/6/12 (441)
14:20:41.422804 IP 127.0.0.1.domain > 127.0.0.1.56788: 50249 1/0/0 A 176.34.54.212 (43)


最後に

これでキャッシュサーバとして利用できます。ただし、PowerDNS Recursor 3.7.3にはDNSSEC Validationの機能はありませんので、必要な場合はunboundなどを利用してください。