6
5

More than 5 years have passed since last update.

FreeBSDのUnboundを社内キャッシュDNSとして設定する

Last updated at Posted at 2017-01-28

社内ネットワークでキャッシュDNSが必要になったのでFreeBSD標準のUnboundでDNS設定を行ったのでそのメモです。

最終的な設定

/var/unbound/unbound.conf
# This file was generated by local-unbound-setup.
# Modifications will be overwritten.
server:
        interface: 127.0.0.1
        interface: 10.X.X.XX
        interface: 10.X.X.XX
        interface: 10.X.X.XX
        interface: 10.X.X.XX
        #interface: 0.0.0.0
        username: unbound
        directory: /var/unbound
        chroot: /var/unbound
        pidfile: /var/run/local_unbound.pid
        #auto-trust-anchor-file: /var/unbound/root.key
        do-ip6: no

        #use-syslog: yes
        logfile: /var/unbound/log/unbound.log
        log-time-ascii: yes
        #verbosity: 1
        log-queries: yes
        module-config: "iterator"
        val-permissive-mode: yes
        val-log-level: 2

        access-control: 0.0.0.0/0 allow

forward-zone:
        name: "."
        forward-addr: 10.X.X.X
        forward-addr: XXX.XX.XXX.X

#include: /var/unbound/lan-zones.conf
include: /var/unbound/control.conf
include: /var/unbound/conf.d/*.conf

DNSSEC

最近はDNSSECが標準のようで苦労しました。
まずデフォルト状態で、forward-zoneを追加しただけでは応答してくれませんでした。
そこで以下の設定を追加しました。

        val-log-level: 2

これを入れることで、DNSSECの検証で何が気に入らなかったかを教えてくれます。

DNSSECの検証でエラーが出ても応答するようにします。

        val-permissive-mode: yes

ここまでの設定でキャッシュDNSとして応答を返してくれるようになりました。

DNSSECを無効にする

社内要件は、古いDNSサーバ4台を廃棄し、新しいDNSサーバへ移行することでした(古いDNSサーバのIPは引き継がず、新規IPで構築します)。
古いDNSサーバは、古いOSで稼働しており、脆弱な状態であるため、速やかに停止することが求められていました。
社内には、新しいDNSサーバへ簡単に切り替えられない端末が存在しており、その救済措置としてキャッシュDNSサーバを構築しました。
まず、古いDNSサーバ1台を停止し、そのIPでキャッシュDNSサーバを稼働させ始めたところ、DNSSECの検証エラーが多かったので、DNSSECを無効化することにしました。
以下の設定を追加しました。

        #auto-trust-anchor-file: /var/unbound/root.key
        module-config: "iterator"

起動コマンド

これを使ってました。

# /etc/rc.d/local_unbound start

# /etc/rc.d/local_unbound stop

# /etc/rc.d/local_unbound restart

ログ設定

切り替えフォローのために、問合せ元IPがログに記録される必要がありました。

syslogに出力

syslogへの出力を試みました。

        use-syslog: yes

ファシリティがLOG_DAEMONということで、下記の設定を追加しましたが、まったく出力されませんでした。
chroot: /var/unboundが効いているせいか、上位のディレクトリには出力できないのでしょうか?

/etc/syslog.conf
LOG_DAEMON.*                                   /var/log/unbound.log

ログ出力設定

syslogはあきらめて、普通にログ出力することにしました。

        logfile: /var/unbound/log/unbound.log
        log-time-ascii: yes
        #verbosity: 1
        log-queries: yes

ログローテーション

newsyslogでログローテーションの設定をします。
いろいろはまりました。

/etc/newsyslog.conf
/var/unbound/log/unbound.log    unbound:wheel   644  30    *    @T00  JBR       /var/unbound/unbound-log-reopen

はまったところ

  1. ファイルの所有者
    プロセスのユーザがunbound、ログファイルのユーザもunboundなので、newsyslog.confもそのように指定してあげる。

  2. シグナルを渡す
    ローテーション後の新しいファイルに書き出すためにシグナルを送ってもらおうとする。/var/run/local_unbound.pidを最後の項目に書いてみたが、ログは出力されませんでした。

  3. ログファイルの再オープン
    シグナルではうまくいかなくて、Google先生に聞くと、log_reopenというコマンド?があることがわかりました。そこのサイトではシェルを書くようにあったので、それを使いました。

#
#!/bin/sh
#This script restarts unbound after log rotation by newsyslog(8).
#

/usr/sbin/unbound-control -q log_reopen

exit 0
6
5
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
6
5