unboundでDNS構築

ローカルネットワークの環境でDNSサーバーを構築したかったので,その時の備忘録.最低限これを設定すれば動くというのを記載しています.

環境

sharoron@sharo1 ~> uname -a
Linux sharo1 5.4.0-52-generic #57-Ubuntu SMP Thu Oct 15 10:57:00 UTC 2020 x86_64 x86_64 x86_64 GNU/Linu
# インストールしたもの
sharoron@sharo1 ~> sudo apt show unbound
Package: unbound
Version: 1.9.4-2ubuntu1.1

インストール

まずはDNSサーバーとしてunboundをインストールします.Ubuntuだとaptでそのままインストールできるはずです.

sharoron@sharo4 ~> sudo apt install unbound
[sudo] password for sharoron: **********************
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  dns-root-data libfstrm0 libprotobuf-c1 libunbound8 unbound-anchor
The following NEW packages will be installed:
  dns-root-data libfstrm0 libprotobuf-c1 libunbound8 unbound unbound-anchor
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Need to get 1103 kB of archives.
After this operation, 5449 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
~ 色々出てくる ~

エラーが発生しなければこれでインストール完了です.

設定

設定ファイルは /etc/unbound/ の中にあります.メインの設定ファイルは unbound.conf,サイトごとに設定を行う場合は unbound.conf.d ディレクトリに設定ファイルを置いておいた方がいいです.

それではメインの 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: "/etc/unbound/unbound.conf.d/*.conf"

server:
        interface: 0.0.0.0
        access-control: 192.168.0.0/24 allow
        verbosity: 1

        do-ip6: no

    local-data: "yryr.me.    IN A 192.168.0.1"
    local-data: "1.yryr.me.    IN A 192.168.0.1"
    local-data: "2.yryr.me.    IN A 192.168.0.2"
    local-data: "3.yryr.me.    IN A 192.168.0.3"



forward-zone:
    name: "."
    forward-addr: 8.8.8.8

上から順番に説明します.

interface

バインドするインターフェースを設定します.設定例は以下の通りです.

  • 0.0.0.0 – DNSを外部公開します.外からアクセス可能です.
  • 127.0.0.1 – localhostからのみアクセスできます.安全ですが,ローカル内でしか使えないです.

access-control

このDNSサーバーにアクセスできるコンピュータを制限することができます.192.168.0.0/24と設定した場合,そのIPを持ったコンピュータからのみ応答を返します.

外部公開したい場合は設定しなくてもいいですが,自分のネットワークからのみ使用したい場合は設定しておけばいいでしょう.

do-ip6

IPv6を設定したい場合はyes,したくない場合はnoを設定します.yesと設定した場合,interfaceやaccess-controlもIPv6用の設定をしましょう.

今回は面倒なのでnoと設定します.最初のうちに設定できたらIPv6を設定するという方が楽かもしれないです.

local-data

ここにレコードを書いていきます.今回はAレコードのみ書いています.

local-data: "yryr.me.    IN A 192.168.0.1"

この場合,yryr.meにアクセスすると192.168.0.1を返すレコードを設定しています.

forward-zone

もし上記のレコードどれにもヒットしない場合,別のDNSサーバーに転送します.特に指定がなければGoogleのDNSである8.8.8.8にしていけば間違い無いでしょう.

forward-zone: 
    name: "." 
    forward-addr: 8.8.8.8

実際に動かしてみると

さて,設定は終わったのでunboundを再起動してみましょう.

sharoron@sharo1 /e/unbound> sudo systemctl start unbound
Job for unbound.service failed because the control process exited with error code.
See "systemctl status unbound.service" and "journalctl -xe" for details.

このようにエラーが発生し,上手くいかないと思います.上手くいった方は次の項目へ進んでください.

なぜこのようなエラーが発生するかと言いますと,Ubuntuは標準でシステムがDNSリゾルバを動かしているからです.トラブルシュートのために以下のコマンドを入力すると,確かにポート53に,既にプログラムが動作していることがわかります.

sharoron@sharo1 /e/unbound [1]> ss -lt4
State            Recv-Q           Send-Q                       Local Address:Port                               Peer Address:Port           Process           
LISTEN           0                128                                0.0.0.0:ssh                                   
 0.0.0.0:*                                
LISTEN           0                5                                127.0.0.1:ipp                                     0.0.0.0:*                                
LISTEN           0                50                             192.168.0.1:microsoft-ds                            0.0.0.0:*                                
LISTEN           0                50                             192.168.0.1:netbios-ssn                             0.0.0.0:*                                
LISTEN           0                4096                         127.0.0.53%lo:domain                                  0.0.0.0:*                                
sharoron@sharo1 /e/unbound> sudo lsof -i:53
COMMAND      PID            USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd-r 158757 systemd-resolve   12u  IPv4 2487348      0t0  UDP localhost:domain 
systemd-r 158757 systemd-resolve   13u  IPv4 2487349      0t0  TCP localhost:domain (LISTEN)

というわけでこのリゾルバを停止させましょう.ついでにunboundも有効化させておきます.

sharoron@sharo1 /e/unbound> sudo systemctl stop systemd-resolved
sharoron@sharo1 /e/unbound> sudo systemctl disable systemd-resolved
sharoron@sharo1 /e/unbound> sudo systemctl restart unbound
sharoron@sharo1 /e/unbound> sudo systemctl enable unbound
Synchronizing state of unbound.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable unbound

エラーも発生せず,無事動作したと思われます.

実際に問い合わせてみよう

さて,設定も終わったので,実際に動作させましょう.DNSの問い合わせはdigが便利です.DNSサーバの設定が終わっているならばpingでもいいと思います.

sharoron@sharo1 /e/unbound> dig 1.yryr.me @localhost

; <<>> DiG 9.16.1-Ubuntu <<>> 1.yryr.me @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51689
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;1.yryr.me.			IN	A

;; ANSWER SECTION:
1.yryr.me.		3600	IN	A	192.168.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Nov 11 05:05:47 UTC 2020
;; MSG SIZE  rcvd: 59

いかがでしょうか.無事返ってきましたか?

まとめ

今回はunboundを使用した設定方法を紹介いたしました.systemd-resolvedを停止させる方法は正攻法じゃ無い気もするけど,netplanになった今なら問題ないのかな.

NetworkManagerを使用している人はこれだけでは済まないと思いますが,手元に環境ないのでご紹介できません.確かresolve関係のファイルをいじらなかったと思う.