社内ネットワークでキャッシュDNSが必要になったのでFreeBSD標準のUnboundでDNS設定を行ったのでそのメモです。
最終的な設定
# 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
が効いているせいか、上位のディレクトリには出力できないのでしょうか?
LOG_DAEMON.* /var/log/unbound.log
ログ出力設定
syslogはあきらめて、普通にログ出力することにしました。
logfile: /var/unbound/log/unbound.log
log-time-ascii: yes
#verbosity: 1
log-queries: yes
ログローテーション
newsyslogでログローテーションの設定をします。
いろいろはまりました。
/var/unbound/log/unbound.log unbound:wheel 644 30 * @T00 JBR /var/unbound/unbound-log-reopen
はまったところ
ファイルの所有者
プロセスのユーザがunbound
、ログファイルのユーザもunbound
なので、newsyslog.conf
もそのように指定してあげる。シグナルを渡す
ローテーション後の新しいファイルに書き出すためにシグナルを送ってもらおうとする。/var/run/local_unbound.pid
を最後の項目に書いてみたが、ログは出力されませんでした。ログファイルの再オープン
シグナルではうまくいかなくて、Google先生に聞くと、log_reopen
というコマンド?があることがわかりました。そこのサイトではシェルを書くようにあったので、それを使いました。
#
#!/bin/sh
#This script restarts unbound after log rotation by newsyslog(8).
#
/usr/sbin/unbound-control -q log_reopen
exit 0