CentOS8でunboundをソースからコンパイルして使う
現在自宅内でbindを使って権威DNSサーバーとフルリゾルバを混ぜて使っているのですが、リゾルバ部分を分離してunboundで新しく構築してみたいと思います。
せっかくなので、DNSSECの検証もするように設定します。
CentOS8で作りましたが、CentOS7でもdnfをyumにするくらいでできると思います。
下準備
OSに入っているunvoundとunbound-libsを念のため削除します。
dnf remove -y unbound unbound-libs
unboundグルーブとunboundユーザーを作成します。OSにすでにunbound-libsがインストールされていた場合にはグループやユーザーがすでに存在しているかも知れません。
groupadd unbound
useradd -g unbound -s /sbin/nologin unbound
必要なライブラリをインストールします。
dnf install -y gcc openssl-devel libevent-devel expat-devel systemd-devel
インストールと環境設定
unboundのソースをダウンロードしてmake, make installします。
wget https://www.nlnetlabs.nl/downloads/unbound/unbound-1.10.1.tar.gz
tar xvzf unbound-1.10.1.tar.gz
cd unbound-1.10.1
./configure --enable-systemd --with-libevent
make
make install
共有ライブラリを登録します。
echo /usr/local/lib > /etc/ld.so.conf.d/unbound.conf
ldconfig
サービスに登録します。起動するようにするのは、設定が終わってからにします。
cd contrib
cp unbound.service unbound.socket /usr/lib/systemd/system/
unboundユーザが書き込める領域を作成します。
mkdir -p /usr/local/etc/unbound/runtime
chown unbound:unbound /usr/local/etc/unbound/runtime
後で行方不明にならないようにunbound.confを/etcにシンボリックリンクしておきます。
ln -s /usr/local/etc/unbound/unbound.conf /etc/unbound.conf
設定ファイル作成
unbound.confを編集します。
server:
verbosity: 1
num-threads: 10
interface: 0.0.0.0
outgoing-num-tcp: 100
incoming-num-tcp: 100
edns-buffer-size: 512
max-udp-size: 512
do-ip6: no
access-control: 172.30.10.0/24 allow
access-control: 127.0.0.1 allow
log-queries: yes
log-replies: yes
log-local-actions: yes
rrset-roundrobin: yes
minimal-responses: yes
auto-trust-anchor-file: "/usr/local/etc/unbound/runtime/root.key"
access-controlはlocalhostと自宅内の172.30.10.0/24からのみ接続可能なように設定しています。
udpのパケットが分断されたときに書き換えられると嫌なので、4096ではなく、小さく512にしておきます。
ipv6のない環境なので、do-ip6はnoにしておきます。
auto-trust-anchor-fileを指定すると、DNSSECの検証ができるようになります。
rrset-roundrobinをyesにしないとroundrobinしないそうです。
minimal-responsesをyesにすると、必要にないときにはAUTHORITY SECTIONを返さず静かになります。
num-threadsやtcpの数は適当です。環境によって調整してください。
logもお好みで。普通の環境ではこのままだとうるさいと思います。
DNSSECの設定
ルートゾーンのDNSSECのkeyを持って来ます。
sudo -u unbound /usr/local/sbin/unbound-anchor -a /usr/local/etc/unbound/runtime/root.key
1日1回取りに行くように設定します。
# crontab -e -u unbound
30 23 * * * /usr/local/sbin/unbound-anchor -a /usr/local/etc/unbound/runtime/root.key
Firewallの設定
FirewallがDNSを通すように設定します。
firewall-cmd --add-service=dns --zone=public --permanent
systemctl reload firewalld
起動設定
自動で起動するように設定して、起動します。
systemctl enable unbound
systemctl start unbound
確認
別のサーバーから確認してみます。
DNSSECのないホスト
% dig @172.30.10.1 qiita.com
; <<>> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <<>> @172.30.10.1 qiita.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33714
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;qiita.com. IN A
;; ANSWER SECTION:
qiita.com. 60 IN A 54.65.107.105
qiita.com. 60 IN A 54.92.1.147
qiita.com. 60 IN A 13.112.43.51
いい感じです。
DNSSECのあるホスト
% dig @172.30.10.1 internet.nl
; <<>> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <<>> @172.30.10.1 internet.nl
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2844
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;internet.nl. IN A
;; ANSWER SECTION:
internet.nl. 60 IN A 62.204.66.10
flagsにadが付いています。
DNSSECが失敗するホスト
% dig @172.30.10.1 dnssec-failed.mufj.jp
; <<>> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <<>> @172.30.10.1 dnssec-failed.mufj.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 45344
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;dnssec-failed.mufj.jp. IN A
statusがSERVFAILになりました。
おまけ
元々、自宅のDNSなので、.hiraというエセTLDがあります。
元のDNSサーバーは権威専用のDNSサーバとして残そうと思うので、.hiraは元のDNSサーバ(172.30.10.201, 172.30.10.202)に転送することにします。
server:
private-domain: "hira"
domain-insecure: "hira"
stub-zone:
name: "hira"
stub-addr: 172.30.10.201
stub-addr: 172.30.10.202
stub-zoneを使うのがコツのようです。