ラズパイ3でおうちDNS鯖(unbound)


おうちDNSってロマンあるなぁと思ったので設定してみます。
今回は、Unboundをローカルサーバーの名前解決を目的として使います
既に単体での導入記事は大量にありますが個人的なメモとして書かせてもらいます。

(下書きとして半年以上寝かしたままになっていたものをそのまま公開したものなので
間違っている点など多々あると思います。信用はしないでください。)

環境

[ラズパイ] Raspberry Pi 3B
- 無線接続
- VNCで操作
[ルーター]
- 192.168.0.1
[ネットワーク]
- IPv4/v6

1.プライベートIPアドレスを固定

DNSサーバーとして使うならまず固定したほうがいいです。
再起動したらアドレス変わるってのは結構困るので。
固定するためにラズパイ本体の設定を弄る記事もよく見ますが、
ルーター本体だけでDHCPを固定できる機能があったのでそちらを使いました。
ルーターの機種により異なりますが http://192.168.0.1 などにアクセスして
こういう画面のところから MACアドレスを指定して固定できます。

MACアドレスの確認方法

ラズパイ上で ifconfig を実行して wlan0の ether が MACアドレスです

2. Unboundをインストール

sudo apt-get install unbound
これだけでインストールできます。

3. Unboundを設定

設定ファイルは/etc/unbound/unbound.confにあり、
Exampleは/usr/share/doc/unbound/examples/unbound.confです
こういう設定になりました

server:
#IP4/6 使用
do-ip4: yes
do-ip6: yes
#ログのエラーレベル
verbosity: 3                     
# unboundが動作するディレクトリ
directory: "/etc/unbound"
#キャッシュ設定
num-threads: 4
msg-cache-size: 128m
msg-cache-slabs: 4
rrset-cache-size: 128m
rrset-cache-slabs: 4
infra-cache-slabs: 4
key-cache-size: 128m
key-cache-slabs: 4
neg-cache-size: 128m
# 使用するインターフェース デフォルトルート
interface: 0.0.0.0      #IPv4
interface: ::0      #IPv6
# unboundへのアクセスを許可するIPアドレス範囲
access-control: 127.0.0.0/8 allow #IPv4 自分自身        
access-control: 192.168.0.0/24 allow #IPv4 ローカル
access-control: ::1 allow #IPv6 自分自身
access-control: fe80::/10 allow #IPv6 リンクローカル
# unboundのログファイルの出力先
logfile: "/var/log/unbound.log"
use-syslog: no
# ローカルのサーバの名前とIPアドレスの対応を登録
local-data: "server.zone. IN A 192.168.XX.XX" 
local-data-ptr: "192.168.XX.XX server.zone." 
local-data: "bot.zone. IN A 192.168.YY.YY" 
local-data-ptr: "192.168.YY.YY bot.zone." 
# 再帰問い合わせ用DNS (Google)
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

設定が終わったら systemctl restart unboundで再起動させます
使いたい端末のDNS設定を書き換えて問題なければOKです

Windowsの設定方法

コントロール パネル -> ネットワークとインターネット -> ネットワーク接続
Wifiアダプタ -> インターネットプロトコルバージョン 4/6
それぞれにDNSサーバのアドレスを入れると動作します
(今回はIPv6のDNSアドレスにはifconfigで出てくる fe80で始まるリンクローカルアドレスを入れました)

ルータ側の設定方法

ルーターが対応しているようであれば、ルーターの設定を変えるだけで
全端末でローカルDNSが使われるようになります。
が、筆者の環境ではそのような機能はサポートされていなかったので省略させて頂きます...

3.1 Unboundが動かない場合

systemctl status unboundで 動いていればOKですが
動きませんでした。journalctl -xeで見たら、
fatal error: could not open ports って出ていました
ここを参考に確認したところdnsmasq
既にポート53を取っていたので
sudo apt-get uninstall dnsmasqで削除したら動きました。

3.2 Unboundが反映されない場合


IPv6が有効な場合、IPv6のDNSが優先して利用されるようなので
IPv4のDNSだけでは設定が不十分でした。(アドレスを明示的に指定すると動作は確認できます)
リンクローカルアドレスも受け付けるように、confを編集して解決しました
(↑には既に反映済みです)

4. 完走した感想

IPv6周りの設定で2時間ほど悩みました。
非常にめんどくさかったです。
何かおかしい、怪しい点があればコメントなどでお願いします。
Qiita初心者ですのでお手柔らかにお願いします

参考

DNSキャッシュ、したくない?
https://qiita.com/onokatio/items/e279abb5131293324e54
ローカル内のサーバを名前解決してアクセスするためにunboundを使う
https://www.virment.com/setup-unbound/
conf設定参照元
https://unbound.jp/unbound/unbound-conf/
https://icat.hatenablog.com/entry/unbound-dns
コメントアウトされているDNSSECについて
https://www.orangeitems.com/entry/2018/10/03/010000
dnsmasaqで動かなかった例
LinuxMint17.3で自宅内LANに内向きDNSサーバを設定する方法(失敗編)
https://ko-log.net/tech-log/archives/2269148.html
IPv6で反映されなかった例
RaspberryPiにUnboundを入れたけど(以下省略)
https://science-as-a-candle-in-the-dark.hatenablog.com/entry/2018/04/08/194629