ローカルネットワークの環境で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関係のファイルをいじらなかったと思う.