kazeno memo

メモとか

UnboundでLAN内の名前解決をしてみる

Debian Stretch上でUnboundを使ってみます。

やる事としては、
ローカル用にdomain1.tld,domain2.tldのA,MXレコードを追加する。
LAN内(192.168.0.0/24)から参照出来るようにする。

APT

# apt update
# apt install unbound

Unboundの設定

悪いインターネットさんの「unbound.confの雛形 IPv4+IPv6」を参考にしました。

/etc/unbound/unbound.conf

server:
        verbosity: 0		#No Log
        interface: ::0		#IPv6
        interface: 0.0.0.0	#IPv4

        access-control: 0.0.0.0/0 refuse
        access-control: ::0/0 refuse
        access-control: 127.0.0.0/8 allow
        access-control: ::1/128 allow
        access-control: 192.168.0.0/24 allow	# your IPv4 LAN
        access-control: fc00::/7 allow		# your IPv6 LAN

        #INCLUDE FILES (in server:)
        include: /etc/unbound/include/local.zone

forward-zone:
        name: "."
        forward-addr: 2001:4860:4860::8888	# IPv6 Google public DNS#1
        forward-addr: 2001:4860:4860::8844	# IPv6 Google public DNS#2
        forward-addr: 8.8.8.8			# IPv4 Google public DNS#1
        forward-addr: 8.8.4.4			# IPv4 Google public DNS#2
server:
verbosity 0でログを取らない
interface 応答するインターフェイスの指定
access-control refuseで拒否、allowで許可
include 追加で読み込む設定ファイルorディレクト

この設定だと、localhostとLAN内からの問い合わせにのみ応答し、それ以外からの問い合わせは拒否されます。
また、includeはディレクティブごとに複数指定出来ます。
公開されているサーバで使う場合はオープンリゾルバにならないように注意しましょう。

forward-zone:
name フォワード(転送)するドメインを指定、"."で全てのドメイン
forward-addr フォワード先のDNSを指定

つまり、後述するゾーンファイルで設定を行うドメイン以外は、全て「forward-addr:」で指定したDNSで名前解決されます。
今回はGoole Public DNSを使っていますが、ISPの提供しているDNSなどを設定しても良いです。

ゾーンファイル

# mkdir /etc/unbound/include

このファイルへローカル向けのDNSレコードを記述します。
/etc/unbound/include/local.zone

local-data: "domain1.tld. IN A 192.168.1.11"
local-data: "mail.domain1.tld. IN A 192.168.1.10"
local-data: "domain1.tld. IN MX 10 mail.domain1.tld."

local-data: "domain2.tld. IN A 192.168.1.11"
local-data: "domain2.tld. IN MX 10 mail.domain1.tld."

ドメインの後には、「.」を付ける必要があるので注意してください。

ポート開放

ここではFirewalldでtcp/udpの53番ポートを開けます。

# firewall-cmd --permanent --zone=public --add-service=dns
# firewall-cmd --reload
# firewall-cmd --list-all #サービスにdnsが追加されているか確認

起動

そのままだとエラーが出て自動起動出来ないらしいので、unbound.serviceを編集します。
/lib/systemd/system/unbound.service

After=network-online.target

Afterのnetwork.targetをnetwork-online.targetへ変えています。

起動する

# systemctl start unbound
# systemctl enable unbound

とりあえずこれでUnboundが起動出来ているはずです。
nslookupでテストしてみます。

# nslookup domain1.tld 127.0.0.1

ゾーンファイルで設定したIPアドレスが表示されたら正常に動作しています。

resolv.confとか

このままではOSがUnboundへDNSの問い合わせをしてくれないので、resolv.confを編集します。
/etc/resolv.conf

nameserver 127.0.0.1
nameserver ::1

既存の「nameserver」を削除して、これを追加してください。

また、DNSの設定は/etc/network/interfacesにも記述しておくべきらしいので、こちらも編集します。
/etc/network/interfaces

iface enp0s3 inet static
~~~~~~~~~~
  dns-nameservers 127.0.0.1

iface enp0s3 inet6 auto
~~~~~~~~~~
  dns-nameservers ::1

ifaceディレクティブの最後に「dns-nameservers IPアドレス」と追加します。

終わり

後はRebootすれば自動でUnboundが立ち上がっていると思います。

正常に動作しているかどうか確認します。

# systemctl status unbound

実際に問い合わせが行えるか確認します。

# nslookup domain1.tld

ちなみに、次のコマンドでUnboundの設定ファイルの内容が正しいかどうか確認することが出来ます。

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

終わり