目次

16 unboundでキャッシュサーバ

bindで行っていたDNSのキャッシュサーバだが、bindは脆弱性が多いのでunboundに変えてみる。

unbound 1.4系は、以下の脆弱性があるので1.5系を入れていきます。
https://jprs.jp/tech/security/2014-12-09-multiple-impl-vuln-delegation-limit.html

環境

CentOS 6.7
unbound 1.5.1

1.インストール

epelを用意

# wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo

インストール

# yum --enablerepo=epel install unbound

2.設定変更

設定ファイル

cp -p /etc/unbound/unbound.conf /etc/unbound/unbound.conf.org

CPU:24,メモリ: 8G での設定

# cat /etc/unbound/unbound.conf | sed 's/\(^\t\|^ *\)//g' | egrep -v '(^#|^$)'
server:
verbosity: 1
statistics-interval: 0
statistics-cumulative: no
extended-statistics: yes
num-threads: 2
interface: 0.0.0.0
interface-automatic: no
outgoing-range: 32768
outgoing-num-tcp: 100
incoming-num-tcp: 100
so-rcvbuf: 16777216
so-sndbuf: 16777216
msg-cache-size: 750m
msg-cache-slabs: 16
num-queries-per-thread: 16384
rrset-cache-size: 1500m
rrset-cache-slabs: 16
infra-cache-slabs: 16
do-ip6: no
access-control: 127.0.0.0/8 allow
access-control: 192.168.0.0/16 allow
access-control: 0.0.0.0/0 deny
chroot: ""
username: "unbound"
directory: "/etc/unbound"
logfile: "/var/log/unbound.log"
use-syslog: no
log-queries: no
log-time-ascii: 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/root.key
val-clean-additional: yes
val-permissive-mode: yes
val-log-level: 1
key-cache-slabs: 16
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"

DNSルートサーバのhintファイル

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

ログファイル作成

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

ログローテート

# vi /etc/logrotate.d/unbound
/var/log/unbound.log
{
    daily
    rotate 30
    size 15M
    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
}

3.チューニングメモ

ワーカスレッド

CPUコア数の合計を指定するのが良い。
4(core) x 2(thread) x 2(CPU) = 16
num-thread = 16

キャッシュを構成するハッシュデータ構造のスラブ数
ワーカスレッドは、このデータ構造へアクセス時にスラブ毎にロックを掛けるため
スラブ数とワーカスレッド数を一致させるとロック回数が減る。
msg-cache-slabs
rrset-cache-slabs:
infra-cache-slabs
key-cache-slabs

ユーザ通信ソケットバッファ

OS側でのソケットの最大バッファサイズ
so-rcvbuf: 16777216
so-sndbuf: 16777216

/etc/sysctl.conf
# net.core.rmem_max
net.core.rmem_max = 16777216
# net.core.wmem_max
net.core.wmem_max = 16777216

リクエスト処理

num-thread x 1024 = 16384
num-queries-per-thread:16384

下記が増えているなら、num-queries-per-threadを引き上げる
current.user
overwritten
exceeded

権威サーバ通信用ソケット最大数
num-queries-per-threadの2倍
outgoing-range

キャッシュメモリサイズ
rrset-cache-size:750m
msg-cache-size:1500m

rrset-cache-sizeは、msg-cache-sizeの2倍が推奨される。
実メモリは、合計キャッシュサイズの2.5倍程度まで拡大することを想定

/etc/sysctl.conf
net.nf_conntrack_max = 1210856
net.netfilter.nf_conntrack_tcp_timeout_established = 43200

同時リクエスト数
※デフォルト10
outgoing-num-tcp: 100
incoming-num-tcp: 100

DNS応答が小さくなるため、TCPフォールバックが必要となる可能性が減る
minimal-responses: yes

以前はこの機能が実装されて無くて、ラウンドロビンの順番までキャッシュしてしまい
結果として毎回同じサーバへアクセスしてしまってた。
デフォルトではnoになっているので、yesへ変更
rrset-roundrobin: yes

4.unbound-control を利用

鍵を作成

# unbound-control-setup
setup in directory /etc/unbound
Generating RSA private key, 3072 bit long modulus (2 primes)
....................................................................................................++++
..++++
e is 65537 (0x010001)
Generating RSA private key, 3072 bit long modulus (2 primes)
..................++++
...........................................++++
e is 65537 (0x010001)
Signature ok
subject=CN = unbound-control
Getting CA Private Key
removing artifacts
Setup success. Certificates created. Enable in unbound.conf file to use

unbound.confの修正

remote-control:
    control-enable: no
↓
remote-control:
    control-enable: yes

サービス再起動

service unbound restart

キャッシュの確認

unbound-control dump_cache