Edited at

DNS unboundサーバ構築手順(yumでインストール)

More than 3 years have passed since last update.


■はじめに

AWSのEC2インスタンス(Amazon Linux)にDNSキャッシュサーバとして、unboundをセットアップする手順になります。

諸事情により、Amazon Route53に作成したPrivateなゾーンについて、Amazon VPC外のサーバからも名前解決する必要が生じた為、Amazon VPC内のEC2インスタンス(Amazon Linux)にDNSキャッシュサーバとしてunboundをインストールしました。

Amazon VPC外のサーバから、unboundサーバを指定して、PrivateなRoute53ゾーンの名前解決を行えるようにする手順になります。


■追記

本文の例に不適切な箇所がありますので本文修正します。申し訳ありませんが、修正まで少々お待ち下さい。

  ↓

http://qiita.com/iwaim@github 様に例示用ドメインをRFC 6761準拠のものに修正して頂きました。逆引きのIPアドレスも例示用のIPアドレスに修正しました。例示用ドメインとして不適切なドメイン名を記載してしまい問題ございませんでした。

また、本文の修正ありがとうございました。

  ↓

yumでunboundをインストールした後で、インストールされたunboundのバージョン(unbound 1.4系)にセキュリティ脆弱性があるのに気がつきました。以下の記事でunbound 1.5.1をインストールしなおしました。詳細につきましては、以下をご参照下さい。

http://qiita.com/na0AaooQ/items/ac0e2f0588c70a12f0c5

  ↓

Route53にPrivateな正引きと逆引きゾーンを作成する手順、Route53にAレコードとPTRレコードを追加する手順については、以下をご参照下さい。

http://qiita.com/na0AaooQ/items/f89788e2e57263209860


■unboundサーバ作成時に使用したAMI

・Amazon Linux AMI 2014.09.1 x86_64 HVM


■その他

・Route53には

route53-test.example.orgというAレコード、10.100.51.198.in-addr.arpaというPTRレコードを登録しているという例になります。

・セキュリティグループで、unboundサーバを指定して名前解決を行うVPC外のサーバからのUDP53番ポートの通信を許可しておきます。


■参考サイト

以下のサイトを参考にさせて頂きました。

http://unbound.jp/unbound/unbound-conf/

http://unbound.jp/unbound/howto_optimise/


■unboundサーバ構築手順

はじめにAmazon LinuxでEC2インスタンスを新規作成します。インスタンスが出来たらec2-userでログインします。

$ sudo su -

# yum update
# yum --enablerepo=epel install -y unbound

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

PEERDNS=yes
 ↓
PEERDNS=no

# vi /etc/sysconfig/unbound
 (末尾に以下を追加)
ulimit -n 8290

# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

cp: overwrite ‘/etc/localtime’? y
[root@ip-192-168-250-8 ~]# date
Fri Dec 12 14:27:01 JST 2014
#

# vi /etc/sysconfig/clock
ZONE="UTC"
UTC=true
 ↓
ZONE="Asia/Tokyo"
UTC=false
ARC=false
#

# mkdir /etc/unbound/local.d/BACKUP
# mkdir /etc/unbound/conf.d/BACKUP
#
# mv /etc/unbound/conf.d/example.com.conf /etc/unbound/conf.d/BACKUP/
#
# mv /etc/unbound/local.d/block-example.com.conf /etc/unbound/local.d/BACKUP/
#

unboundによる名前解決先のDNSサーバを指定するDNSフォワード設定ファイルを作成する。

example.orgドメインの名前解決をRoute53にフォワードさせたい場合、forward-addrでexample.orgドメインを紐付けたVPCのAmazonProvidedDNSを指定する。

# vi /etc/unbound/conf.d/example.org.conf

forward-zone:
name: "example.org."
forward-addr: XX.XX.XX.2 (unboundサーバを作成したVPCのAmazonProvidedDNSを指定する)
#

逆引きゾーンの名前解決をRoute53へフォワードさせたい場合、forward-addrで逆引きゾーンを紐付けたVPCのAmazonProvidedDNSを指定する。

# vi /etc/unbound/conf.d/100.51.198.in-addr.arpa.conf

forward-zone:
name: "100.51.198.in-addr.arpa."
forward-addr: XX.XX.XX.2 (unboundサーバを作成したVPCのAmazonProvidedDNSを指定する)
#

# vi /etc/unbound/local.d/100.51.198.in-addr.arpa.conf

local-zone: "100.51.198.in-addr.arpa." transparent
#

# vi /etc/unbound/local.d/example.org.conf
local-zone: "example.org." transparent
#

unboundを動かす為、unbound.confに最低限の設定を追加・編集する。

※unboundサーバをDNSキャッシュサーバとして利用するサーバ台数が多い場合、適宜パラメータチューニングした方が良いかもしれません。

# cp -p /etc/unbound/unbound.conf /etc/unbound/unbound.conf.ORG

# diff /etc/unbound/unbound.conf /etc/unbound/unbound.conf.ORG
#

# vi /etc/unbound/unbound.conf /etc/unbound/unbound.conf.ORG

unbound.confの変更後の差分は以下の通り。

# diff /etc/unbound/unbound.conf /etc/unbound/unbound.conf.ORG

49,50d48
< interface: 0.0.0.0@53
< interface: ::0@53
63d60
< port: 53
115d111
< msg-buffer-size: 1311240
163d158
< do-ip4: yes
167d161
< do-ip6: no
173d166
< do-udp: yes
177d169
< do-tcp: no
196,205d187
< access-control: 198.51.100.0/24 allow
< access-control: 192.0.2.0/24 allow
< access-control: 127.0.0.1/32 allow
< access-control: ::1 allow
< access-control: ::ffff:127.0.0.1 allow
< access-control: 0.0.0.0/0 deny
246d227
< logfile: "/var/log/unbound.log"
251d231
< use-syslog: no
258d237
< log-queries: yes
266d244
< root-hints: "/etc/unbound/named.cache"
270d247
< hide-identity: yes
274d250
< hide-version: yes
431,432c407
< ### val-permissive-mode: no
< val-permissive-mode: yes
---
> val-permissive-mode: no
#

以下は/etc/unbound/unbound.confのサンプルです。

※本番環境でunboundサーバを運用する場合は、interfaceを0.0.0.0からunboundサーバの特定のネットワークインターフェースに制限したり、chrootを有効化したりして、セキュリティ周りの設定をもっと厳しくした方が良いかもしれません。

# grep -v "#" /etc/unbound/unbound.conf | grep -v ^$

server:
verbosity: 1
statistics-interval: 0
statistics-cumulative: yes
extended-statistics: yes
num-threads: 2
interface: 0.0.0.0@53
interface: ::0@53
interface-automatic: no
port: 53
outgoing-port-permit: 32768-65535
outgoing-port-avoid: 0-32767
max-udp-size: 3072
msg-buffer-size: 1311240
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: no
access-control: 198.51.100.0/24 allow
access-control: 192.0.2.0/24 allow
access-control: ::1 allow
access-control: ::ffff:127.0.0.1 allow
access-control: 0.0.0.0/0 deny
chroot: ""
username: "unbound"
directory: "/etc/unbound"
logfile: "/var/log/unbound.log"
use-syslog: no
log-time-ascii: yes
log-queries: yes
pidfile: "/var/run/unbound/unbound.pid"
root-hints: "/etc/unbound/named.cache"
hide-identity: yes
hide-version: yes
harden-glue: yes
harden-dnssec-stripped: yes
harden-below-nxdomain: yes
harden-referral-path: yes
use-caps-for-id: no
unwanted-reply-threshold: 10000000
prefetch: yes
prefetch-key: yes
rrset-roundrobin: yes
minimal-responses: yes
dlv-anchor-file: "/etc/unbound/dlv.isc.org.key"
trusted-keys-file: /etc/unbound/keys.d/*.key
auto-trust-anchor-file: "/var/lib/unbound/root.anchor"
val-clean-additional: yes
val-permissive-mode: yes
val-log-level: 1
include: /etc/unbound/local.d/*.conf
remote-control:
control-enable: yes
server-key-file: "/etc/unbound/unbound_server.key"
server-cert-file: "/etc/unbound/unbound_server.pem"
control-key-file: "/etc/unbound/unbound_control.key"
control-cert-file: "/etc/unbound/unbound_control.pem"
include: /etc/unbound/conf.d/*.conf
#

DNSルートサーバが記載されたhintファイルをダウンロードする。

# wget -O "/etc/unbound/named.cache" ftp://FTP.INTERNIC.NET/domain/named.cache

# chown unbound:unbound /etc/unbound/named.cache

# vi /etc/resolv.conf

### unboundサーバ自身のIPアドレス
nameserver 127.0.0.1
#

pidディレクトリ作成。

# mkdir /var/run/unbound

# chown unbound:unbound /var/run/unbound
#

初回のみログファイル作成。

# touch /var/log/unbound.log

# chown unbound:unbound /var/log/unbound.log
# chmod 644 /var/log/unbound.log
#

unboundを起動する。

# /etc/init.d/unbound start

Generating unbound control key and certificate:
Starting unbound: [ OK ]
#

# ps awux | grep -v grep | grep unbound
unbound 6897 0.0 0.7 146848 8064 ? Ssl 14:01 0:00 /usr/sbin/unbound -c /etc/unbound/unbound.conf
#

# unbound-checkconf
unbound-checkconf: no errors in /etc/unbound/unbound.conf
#

# chkconfig unbound on
# chkconfig --list | grep unbound
unbound 0:off 1:off 2:on 3:on 4:on 5:on 6:off
#


■unboundによる名前解決テスト

unboundサーバ上で名前解決を行えるかテストする。

example.orgドメインや逆引きゾーン、そしてgoogle.co.jp等のドメインの名前を解決出来るかテストする。

テスト前に/etc/init.d/unbound reloadを実行して、unboundサーバ上の名前解決キャッシュは消しておく。

# cat /etc/resolv.conf

### unboundサーバ自身のIPアドレス
nameserver 127.0.0.1
#

# /etc/init.d/unbound reload
Stopping unbound: [ OK ]
Starting unbound: [ OK ]
#

# dig +noall +ans route53-test.example.org @127.0.0.1
route53-test.example.org. 5 IN A 198.51.100.10
#

# dig +noall +ans -x 198.51.100.10 @127.0.0.1
10.100.51.198.in-addr.arpa. 1 IN PTR route53-test.example.org.
#

# dig +noall +ans www.google.co.jp @127.0.0.1
www.google.co.jp. 300 IN A 74.125.235.175
www.google.co.jp. 300 IN A 74.125.235.191
www.google.co.jp. 300 IN A 74.125.235.184
www.google.co.jp. 300 IN A 74.125.235.183
#

# dig +noall +ans www.google.com @127.0.0.1
www.google.com. 300 IN A 74.125.235.178
www.google.com. 300 IN A 74.125.235.176
www.google.com. 300 IN A 74.125.235.180
www.google.com. 300 IN A 74.125.235.179
www.google.com. 300 IN A 74.125.235.177
#

# /etc/init.d/unbound reload
#

Amazon VPC外のサーバから、DNSサーバとしてunboundサーバを指定して、名前解決を行えるかテストする。

unboundサーバのunbound.confやセキュリティグループで、unboundサーバへの名前解決を許可したAmazon VPC外のサーバから名前解決を行えるかテストする。

example.orgドメインや逆引きゾーン、そしてgoogle.co.jp等のドメインの名前を解決出来るかテストする。

[testuser@notvpcserver ~]$ dig +noall +ans www.google.co.jp @unboundサーバのIPアドレスを指定する

www.google.co.jp. 300 IN A 74.125.235.175
www.google.co.jp. 300 IN A 74.125.235.184
www.google.co.jp. 300 IN A 74.125.235.191
www.google.co.jp. 300 IN A 74.125.235.183
[testuser@notvpcserver ~]$

[testuser@notvpcserver ~]$ dig +noall +ans route53-test.example.org @unboundサーバのIPアドレスを指定する
route53-test.example.org. 1 IN A 198.51.100.10
[testuser@notvpcserver ~]$

[testuser@notvpcserver ~]$ dig +noall +ans -x 198.51.100.10 @unboundサーバのIPアドレスを指定する
10.100.51.198.in-addr.arpa. 1 IN PTR route53-test.example.org.
[testuser@notvpcserver ~]$

[testuser@notvpcserver ~]$ dig +noall +ans www.google.co.jp @unboundサーバのIPアドレスを指定する
www.google.co.jp. 289 IN A 74.125.235.191
www.google.co.jp. 289 IN A 74.125.235.183
www.google.co.jp. 289 IN A 74.125.235.175
www.google.co.jp. 289 IN A 74.125.235.184
[testuser@notvpcserver ~]$

[testuser@notvpcserver ~]$ dig +noall +ans www.google.com @unboundサーバのIPアドレスを指定する
www.google.com. 300 IN A 74.125.235.177
www.google.com. 300 IN A 74.125.235.180
www.google.com. 300 IN A 74.125.235.179
www.google.com. 300 IN A 74.125.235.176
www.google.com. 300 IN A 74.125.235.178
[testuser@notvpcserver ~]$

以下はAmazon VPC外のWindowsマシンから、名前解決を行えるかテストする例です。

c:\>ipconfig /flushdns

Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。

c:\>nslookup route53-test.example.org unboundサーバのIPアドレスを指定する
サーバー: XXXXXXXXXXXXXXXXX
Address: XXX.XXX.XXX.XXX

権限のない回答:
名前: route53-test.example.org
Address: 198.51.100.10

c:\>nslookup 198.51.100.10 unboundサーバのIPアドレスを指定する
サーバー: XXXXXXXXXXXXXXXXX
Address: XXX.XXX.XXX.XXX

名前: route53-test.example.org
Address: 198.51.100.10

c:\>nslookup www.google.com unboundサーバのIPアドレスを指定する
サーバー: XXXXXXXXXXXXXXXXX
Address: XXX.XXX.XXX.XXX

権限のない回答:
名前: www.google.com
Addresses: 2404:6800:4004:801::1010
173.194.38.112
173.194.38.114
173.194.38.116
173.194.38.113
173.194.38.115


■unboundログローティション設定

好みにもよるが、unboundサーバの/var/log/unbound.logをログローティションさせたい場合、unboundサーバに以下のファイルを作成する。

まずunbound-controlコマンドのパスを確認。

# which unbound-control

/usr/sbin/unbound-control
#

以下のファイルを作成する。

# vi /etc/logrotate.d/unbound

/var/log/unbound.log
{
daily
rotate 30
size 10M
missingok
compress
create 644 unbound unbound
sharedscripts
prerotate
touch /var/log/unbound.log
chown unbound:unbound /var/log/unbound.log
chmod 644 /var/log/unbound.log
/usr/sbin/unbound-control log_reopen
endscript
postrotate
/usr/sbin/unbound-control log_reopen
endscript
}
#

# chown root:root /etc/logrotate.d/unbound
# chmod 644 /etc/logrotate.d/unbound
#

以上になります。