👀
ローカルにキャッシュDNSサーバーを構築する
キャッシュ DNS サーバーとして Unbound をインストールした際の備忘録です。
背景
インターネットで名前解決をするわけではないが、
IP アドレスではなくホスト名 (FQDN) で LAN 内の PC や VM の名前解決をしたかった。
hosts ファイルに書くことでも代替可能だが、
複数 PC の hosts を管理したくないので DNS サーバーを設置することとし、
今回は unbound を使うことにした。
前提
実現したいこと
- pc01 サーバーから ubuntu01 サーバーの名前解決を行う
- 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