📘

DNSのルートサーバから引くUnboundの作り方

2024/10/22に公開

これはなに

  • 私の備忘録です
  • 運用しているAS内にリゾルバDNSを作るときに、AS内のすべてのクエリを処理するしせっかくなのでどこにも頼らないリゾルバを作ってみたくなったので作ってみた

環境

  • Rocky Linux 9.4
  • Unbound 1.16.2

作り方

1. Unboundをインストールします

yum install unbound

2. Configの作成

既存のファイルをリネームします
mv /etc/unbound/unbound.conf /etc/unbound/unbound.conf.org

下の内容を参考にConfigを作成します

/etc/unbound/unbound.conf
server:
    interface: 127.0.0.1
    interface: 192.168.1.1
    interface: 2001:db8:1::1

    access-control: 127.0.0.1/8 allow
    access-control: 192.168.1.1/24 allow
    access-control: 0.0.0.0/0 deny

    access-control: 2001:db8:1::/48 allow
    access-control: ::/0 deny

    hide-version: yes
    hide-identity: yes

    root-hints: root.hints

    logfile: "/etc/unbound/log/unbound.log"
    use-syslog: no
    log-queries: yes
    log-time-ascii: yes

各パラメータの説明

interface:
Unboundがリッスンするアドレスを記載する(複数可)
必要に応じてIPv4とIPv6それぞれ書く

access-control:
Unboundが受け入れるクエリのレンジを設定する
必要に応じてIPv4とIPv6それぞれ書く

hide-version: yes
hide-identity: yes
バージョンなどが見えると脆弱性を突かれたりするので隠す

root-hints: root.hints
今回のミソ
参照すべきルートサーバの情報が格納されているファイル

logfile:以下
ログの設定なのでよしなに

3. Configのチェック

unbound-checkconfを実行してConfigに間違いがないことを確認する
エラーに関しては適宜修正を

4. root.hintsを入手する

下のコマンドを実行してルートサーバの情報を入手する
curl --output /etc/unbound/root.hints https://www.internic.net/domain/named.cache

5. systemd-resolvedを無効化する

そのままだとポートが被ってUnboundが起動できないので下記のコマンドで無効化する

systemctl stop systemd-resolved
systemctl disable systemd-resolved

6. Unboundの起動と自動起動を設定する

下のコマンドでUnboundの起動と自動起動の設定を行う
systemctl enable unbound --now

7. 起動確認

localhostに対して正引きを行って問題なく正引き出来ることを確認する

8. サーバのポートを開放する

別のサーバからアクセスできるようにポートを開放する
開放対象:53/tcp・53/udp

Firewalldの場合
firewall-cmd --add-port=53/tcp --permanent
firewall-cmd --add-port=53/udp --permanent
firewall-cmd --reload

9. 動作確認

別の端末からDNSの正引きを実行して動作を確認する

10. root.hintsの更新設定

cronで定期的に更新するように設定します
月一回程度の更新で問題ないです

※サンプルは毎週日曜日午前2時に更新されるようになっています
0 2 * * 0 curl --output /etc/unbound/root.hints https://www.internic.net/domain/named.cache

Discussion