👀

ローカルにキャッシュDNSサーバーを構築する

2024/01/03に公開

キャッシュ DNS サーバーとして Unbound をインストールした際の備忘録です。

背景

インターネットで名前解決をするわけではないが、
IP アドレスではなくホスト名 (FQDN) で LAN 内の PC や VM の名前解決をしたかった。

hosts ファイルに書くことでも代替可能だが、
複数 PC の hosts を管理したくないので DNS サーバーを設置することとし、
今回は unbound を使うことにした。

前提

実現したいこと

  1. pc01 サーバーから ubuntu01 サーバーの名前解決を行う
  2. DNS サーバーに設定が無いドメインの名前解決を行う

バージョン

  • Ubuntu 22.04
  • Unbound 1.13.1

ネットワーク

手順

1. Unbound のインストール

$ sudo apt-get install unbound

2. 設定

既定では /etc/unbound/unbound.conf の設定を使用する。

/etc/unbound/unbound.conf
# Unbound configuration file for Debian.
#
# See the unbound.conf(5) man page.
#
# See /usr/share/doc/unbound/examples/unbound.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/unbound/unbound.conf.d directory.
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"

追加で /etc/unbound/unbound.conf.d/*.conf を使用するようになっているため、
今回は具体的な設定を /etc/unbound/unbound.conf.d/unbound.conf に記述する。

/usr/share/doc/unbound/examples/unbound.conf に例があるので、これを参考にする。

/etc/unbound/unbound.conf.d/unbound.conf
server:
    # verbosity number, 0 is least verbose. 1 is default.
    verbosity: 1

    # specify the interfaces to answer queries from by ip-address.
    # The default is to listen to localhost (127.0.0.1 and ::1).
    # specify 0.0.0.0 and ::0 to bind to all available interfaces.
    # specify every interface[@port] on a new 'interface:' labelled line.
    # The listen interfaces are not changed on reload, only on restart.
    interface: 0.0.0.0

    # control which clients are allowed to make (recursive) queries
    # to this server. Specify classless netblocks with /size and action.
    # By default everything is refused, except for localhost.
    access-control: 192.168.11.0/24 allow

    # a number of locally served zones can be configured.
    #       local-zone: <zone> <type>
    #       local-data: "<resource record string>"
    local-data: "ubuntu01.home.arpa. IN A 192.168.11.110"

    # Forward zones
    # Create entries like below, to make all queries for 'example.com' and
    # 'example.org' go to the given list of servers. These servers have to handle
    # recursion to other nameservers. List zero or more nameservers by hostname
    # or by ipaddress. Use an entry with name "." to forward all queries.
    # If you enable forward-first, it attempts without the forward if it fails.
    forward-zone:
        name: "."
        forward-addr: 192.168.11.1
  • 利用可能なすべてのネットワークインターフェースでリクエストを受信する
  • 192.168.11.0/24 からのリクエストを許可する
  • local-data にキャシュする DNS レコードの内容を記述する
  • 設定していないドメインへのクエリは forward-addr で指定した IP アドレスに転送する

正しく設定ファイルが記述されているかを unbound-checkconf で確認する。

$ unbound-checkconf
unbound-checkconf: no errors in /etc/unbound/unbound.conf

3. 確認

DNS サーバーのアドレス @192.168.11.101 を指定して dig コマンドを実行する。

$ dig ubuntu01.home.arpa @192.168.11.101

; <<>> DiG 9.18.19-1~deb12u1-Debian <<>> ubuntu01.home.arpa @192.168.11.101
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3522
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ubuntu01.home.arpa.            IN      A

;; ANSWER SECTION:
ubuntu01.home.arpa.     3600    IN      A       192.168.11.110

;; Query time: 0 msec
;; SERVER: 192.168.11.101#53(192.168.11.101) (UDP)
;; WHEN: Wed Jan 03 01:23:16 JST 2024
;; MSG SIZE  rcvd: 63
$ dig zenn.dev @192.168.11.101

; <<>> DiG 9.18.19-1~deb12u1-Debian <<>> zenn.dev @192.168.11.101
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35059
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;zenn.dev.                      IN      A

;; ANSWER SECTION:
zenn.dev.               69972   IN      A       35.190.77.180

;; Query time: 204 msec
;; SERVER: 192.168.11.101#53(192.168.11.101) (UDP)
;; WHEN: Wed Jan 03 01:24:49 JST 2024
;; MSG SIZE  rcvd: 53

unbound に設定したドメイン、設定していないドメイン
どちらの名前解決も可能であることが確認できた。

Discussion