ラズパイ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アドレスを指定して固定できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254984/78fa4c05-4c1d-5369-47bb-2f992550c091.png)

### MACアドレスの確認方法
ラズパイ上で ```ifconfig``` を実行して wlan0の ether が MACアドレスです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254984/0a0100f4-5280-a1a5-bfa4-92b86fba0474.png)

## 2. Unboundをインストール
```sudo apt-get install unbound```
これだけでインストールできます。

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

```server:
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が反映されない場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254984/2cc2b41b-848a-ebc0-48a5-672f38e38157.png)
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