Ubuntu 22.04 - BIND設定

## 前提
さ、今日は BIND の設定。これができればいろいろ設定が進むはず！
## 環境
Ubuntu 22.04
BIND 9.18.1
## 設定
やりたいことは 2 つ。
1) 自分で名前解決する
2) 自分で名前解決できないものは別の DNS サーバ (8.8.8.8) へ問い合わせる

こんな感じに名前解決するように設定していく！
※"j-fortidemo.com"のドメインは私が所持しているドメインです。
192.168.10.250 : dns.j-fortidemo.com
192.168.10.249 : ntp.j-fortidemo.com
192.168.20.100 : websrv01.j-fortidemo.com
192.168.20.101 : websrv02.j-fortidemo.com

まずは、named.conf を設定する。新たに、`named.conf.internal-zones`というゾーンファイル名を追加。これは後で設定する。
```
$ sudo vi /etc/bind/named.conf
```
```
include "/etc/bind/named.conf.internal-zones";
```
次に、オプションファイルの設定。
ACL を追加。192.168.0.0/16 のネットワークを許可する。だいぶ、でかいｗ
クエリを受け付ける範囲を指定。

```
$ sudo vi /etc/bind/named.conf.options 
```
```
acl internal-network {
        192.168.0.0/16;
};
options {
        directory "/var/cache/bind";
        forwarders {
                8.8.8.8;
         };
        allow-query {
                localhost;
                internal-network;
         };
        recursion yes;
        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        //dnssec-validation auto;
        allow-recursion {
                127.0.0.1;
                192.168.0.0/16;
        };
```
それから、さっきのゾーン情報ファイルの中身を設定していく。
<font color ='red'>192.168.10.0 と 192.168.20.0 のゾーンを分けない方法は`番外編 その3`に書いてます。 </font>
```
$ sudo vi /etc/bind/named.conf.internal-zones
```
```
zone "j-fortidemo.com" IN {
        type master;
        file "/etc/bind/j-fortidemo.com";
        allow-update { none; };
};
zone "10.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/10.168.192.db";
        allow-update { none; };
};
zone "20.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/20.168.192.db";
        allow-update { none; };
};
```
BIND 正引きゾーンファイルの設定。
```
$ sudo vi /etc/bind/j-fortidemo.com
```
```
$TTL 86400
@   IN  SOA     dns.j-fortidemo.com. root.j-fortidemo.com. (
        2022120801  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      dns.j-fortidemo.com.
        IN  A       192.168.10.250

dns  IN A    192.168.10.250
ntp  IN A    192.168.10.249
websrv01  IN A  192.168.20.100
websrv02  IN A  192.168.20.101
```
BIND 逆引きゾーンファイルの設定。
~~[第3オクテット].[第4オクテット] の記載でもいけた！~~
<font color ='red'>この時はいけなかったので、わけた。。。</font>
```
$ sudo vi /etc/bind/10.168.192.db 
```
```
$TTL 86400
@   IN  SOA     dns.j-fortidemo.com. root.j-fortidemo.com. (
        2022120801  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      dns.j-fortidemo.com.

250      IN  PTR     dns.j-fortidemo.com.
249      IN  PTR     ntp.j-fortidemo.com.
```
```
$ sudo vi /etc/bind/20.168.192.db
```
```
$TTL 86400
@   IN  SOA     dns.j-fortidemo.com. root.j-fortidemo.com. (
        2022120801  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      dns.j-fortidemo.com.

100      IN  PTR     websrv01.j-fortidemo.com.
101      IN  PTR     websrv02.j-fortidemo.com.
```
DNS サーバの設定は以上。
最後に、自分の DNS サーバを変更しておく。
```
$ sudo vi /etc/netplan/99-config.yaml
```
```
    nameservers:
        addresses: [192.168.10.250]
```
```
$ sudo netplan apply
```
## 確認
正引き

```
$ sudo dig dns.j-fortidemo.com

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> dns.j-fortidemo.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49225
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;dns.j-fortidemo.com.           IN      A

;; ANSWER SECTION:
dns.j-fortidemo.com.    86400   IN      A       192.168.10.250

;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Thu Dec 08 14:22:24 UTC 2022
;; MSG SIZE  rcvd: 64
```
逆引き
```
$ sudo dig -x 192.168.10.250

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> -x 192.168.10.250
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23401
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;250.10.168.192.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
250.10.168.192.in-addr.arpa. 6759 IN    PTR     dns.j-fortidemo.com.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Thu Dec 08 17:16:33 UTC 2022
;; MSG SIZE  rcvd: 89
```
自分で名前解決できないもの
```
$ sudo dig ntp.nict.jp

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> ntp.nict.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42836
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;ntp.nict.jp.                   IN      A

;; ANSWER SECTION:
ntp.nict.jp.            20797   IN      A       61.205.120.130
ntp.nict.jp.            20797   IN      A       133.243.238.243
ntp.nict.jp.            20797   IN      A       133.243.238.164
ntp.nict.jp.            20797   IN      A       133.243.238.163
ntp.nict.jp.            20797   IN      A       133.243.238.244

;; Query time: 15 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Thu Dec 08 14:25:20 UTC 2022
;; MSG SIZE  rcvd: 120
```
## 番外編 その1
DNS の設定は間違うことも多々ある。かく言う、私も間違えたｗ
`named-checkconf`便利なので使おう。
下記の例では`named.conf.options`の設定で`recurusion`になってるぞ、と指摘している例。
わかりやすいご指摘でありがたい！
```
$ named-checkconf 
/etc/bind/named.conf.options:26: unknown option 'recurusion'
```
## 番外編 その2
長いこと`$ sudo dig -x 192.168.10.250`の`ANSWER SECTION`が正しく返ってこなくて困った。
↓こうなるはずなのに、
```
;; ANSWER SECTION:
250.10.168.192.in-addr.arpa. 0  IN      PTR     dns.
250.10.168.192.in-addr.arpa. 0  IN      PTR     dns.local.
```
こうなってたのだ…。
```
;; ANSWER SECTION:
250.10.168.192.in-addr.arpa. 0  IN      PTR     dnssrv.
250.10.168.192.in-addr.arpa. 0  IN      PTR     dnssrv.local.
```
確かに最初は`dnssrv`で設定してた。でも、`dns`に変更してもまったく変わらない。なんなら`apt-get --purge remove bind9`で削除しても変わらない。なんでなんでーって悩みに悩んで、なにげなく、`ping dns.j-fortidemo.com`を打って気づいた。
```
PING dns.j-fortidemo.com (192.168.10.250) 56(84) bytes of data.
64 bytes from dnssrv (192.168.10.250): icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from dnssrv (192.168.10.250): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from dnssrv (192.168.10.250): icmp_seq=3 ttl=64 time=0.057 ms
```
ん？もしかして、この`dnssrv`ってサーバの名前か・・
で、ホスト名を`dnssrv`から`dns`に変更したらあっけなく期待通りに`dns`になったわけ。
## 番外編 その3
あれ？じゃぁ、`/etc/bind/192.168.db`は何だったんだ・・？？？
てか、`dns.j-fortidemo.com`ってならないといけないんじゃない？んーーーー

結局は、`named.conf.internal-zones`で、192.168.10.0/192.168.20.0 のゾーンを分けたんだよね。もっといいやり方があると思うんだけどなー・・

あ！これだわ！
```
$ sudo cat /etc/bind/named.conf.internal-zones

zone "168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/db.168.192";
        allow-update { none; };
};
```
```
$ sudo vi /etc/bind/db.168.192 

$TTL 86400
@   IN  SOA     dns.j-fortidemo.com. root.j-fortidemo.com. (
        2022120801  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      dns.j-fortidemo.com.

250.10      IN  PTR     dns.j-fortidemo.com.
249.10      IN  PTR     ntp.j-fortidemo.com.
100.20      IN  PTR     websrv01.j-fortidemo.com.
101.20      IN  PTR     websrv02.j-fortidemo.com.
```
`db`の使い方がよくわかるようになりました。はぁ、長かった・・・
## 番外編 その4
いったいいくつあるんだ番外編…
ここで、NTP サーバから PING をしてみるとまぁ、無言。そらそ、ファイアウォールがあるから。というわけで、DNS サーバでポート 53 を開けないとダメです。
```
$ sudo ufw allow domain
```
```
$ sudo ufw status 
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
53                         ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
53 (v6)                    ALLOW       Anywhere (v6)    
```