4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 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などを利用してください。

4
6
0

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
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?