Raspberry Pi 4 でローカル DNS サーバを立てる
Raspberry Pi 4 と BIND 9 で自宅ネットワーク用の DNS サーバを立てました。
ラズパイに sv.homenetwork
というドメイン名を付けてみます。
ラズパイ情報
$ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" NAME="Raspbian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
ラズパイに BIND 9 をインストールする
$ sudo apt install bind9 $ named -v BIND 9.11.5-P4-5.1+deb10u2-Raspbian (Extended Support Version)
BIND 9 を設定する
192.168.1.0/24
を homenetwork
というゾーンにします。
ラズパイには sv.homenetwork
というドメイン名を付けてみます。
/etc/bind/named.conf
このファイルから /etc/bind/named.conf.options
と
/etc/bind/named.conf.local
をインクルードするみたいです。
このファイルはデフォルトのままで、設定変更しませんでした。
$ cat /etc/bind/named.conf // This is the primary configuration file for the BIND DNS server named. // // Please read /usr/share/doc/bind9/README.Debian.gz for information on the // structure of BIND configuration files in Debian, *BEFORE* you customize // this configuration file. // // If you are just adding zones, please do that in /etc/bind/named.conf.local include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local"; include "/etc/bind/named.conf.default-zones";
/etc/bind/named.conf.options
このファイルに DNSサーバの設定を書いていきます。
$ cat /etc/bind/named.conf.options options { // サーバの作業ディレクトリ // このディレクトに後述するゾーンファイルを置くみたいです directory "/var/cache/bind"; // 自身が属するネットワークからのクエリのみ許可する allow-query { localnets; }; // ゾーン転送するセカンダリサーバは存在しないので無効にする allow-transfer { none; }; // 自身で解決できない問い合わせを別のフルリゾルバに転送する // 自宅ルータの 192.168.1.1 がフォワーダとして動作し // プロバイダのフルリゾルバに転送してくれます forwarders { 192.168.1.1; }; // フォワーダから回答が得られない場合はエラーとなる forward only; // DNSSEC を無効 dnssec-validation no; // IPv6 のクエリに対応する listen-on-v6 { any; }; };
/etc/bind/named.conf.local
このファイルでゾーンファイルを指定するみたいです。
$ cat /etc/bind/named.conf.local zone "homenetwork" IN { // 権威サーバの情報 // セカンダリサーバ(slave)は存在しないので // プライマリサーバ(master)とします type master; file "homenetwork.zone"; }; zone "1.168.192.in-addr.arpa" IN { type master; file "homenetwork.rev"; };
/var/cache/bind/homenetwork.zone
正引き用のゾーンデータを記述するゾーンファイルです。
refresh, retry, expire はセカンダリサーバが存在しないので、
使われないような気がします。
$ cat /var/cache/bind/homenetwork.zone $TTL 3600 @ IN SOA sv.homenetwork. root.homenetwork. ( 2015123105 ; serial 3H ; refresh 15M ; retry 1W ; expire 1H ) ; minimum IN NS sv sv IN A 192.168.1.10
/var/cache/bind/homenetwork.rev
逆引き用のゾーンデータを記述するゾーンファイルです。
$ cat /var/cache/bind/homenetwork.rev $TTL 3600 @ IN SOA sv.homenetwork. root.homenetwork. ( 2015123105 ; serial 3H ; refresh 15M ; retry 1W ; expire 1H ) ; minimum IN NS sv.homenetwork. 10 IN PTR sv.homenetwork.
設定ファイルのチェックを行う
$ sudo named-checkconf $ sudo named-checkzone 1.168.192.in-addr.arpa /var/cache/bind/homenetwork.rev zone 1.168.192.in-addr.arpa/IN: loaded serial 2015123105 OK $ sudo named-checkzone homenetwork /var/cache/bind/homenetwork.zone zone homenetwork/IN: loaded serial 2015123105 OK
ラズパイが問い合わせる DNS サーバを自分自身にする
自宅ネットワークでは DHCP を使用しているので
ラズパイの /etc/dhcpcd.conf
に以下を追記します。
static domain_name_servers=127.0.0.1 static domain_name=homenetwork
BIND 9 の再起動
BIND 9 を再起動して、ステータスに異常がないか確認します。
$ sudo systemctl restart bind9 $ sudo systemctl status bind9
DHCP サーバが配布する DNS サーバのアドレスをラズパイのアドレスに変更する
DHCP を使用している場合は DHCP サーバ の設定を変更します。
正引きテスト
作業用 PC からテストします。まずは直接 192.168.1.10 に問い合わせてみます。
status: NOERROR
で flags
に aa
があります。
大丈夫そうです。
$ dig @192.168.1.10 sv.homenetwork ; <<>> DiG 9.16.1-Ubuntu <<>> @192.168.1.10 sv.homenetwork ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61550 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ... ;; ANSWER SECTION: sv.homenetwork. 3600 IN A 192.168.1.10 ;; AUTHORITY SECTION: homenetwork. 3600 IN NS sv.homenetwork. ...
外部のドメインも試してみます。今度は flags
に ra
があります。
大丈夫そうです。
$ dig @192.168.1.10 www.google.com ; <<>> DiG 9.16.1-Ubuntu <<>> @192.168.1.10 www.google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63049 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ... ;; ANSWER SECTION: www.google.com. 42 IN A 172.217.24.132 ...
次に systemd-resolved を経由して問い合わせてみます。
こっちも大丈夫そうです。
$ dig sv.homenetwork ; <<>> DiG 9.16.1-Ubuntu <<>> sv.homenetwork ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30774 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ... ;; ANSWER SECTION: sv.homenetwork. 3038 IN A 192.168.1.10 ...
逆引きテスト
dig @192.168.1.10 -x 192.168.1.10
と dig -x 192.168.1.10
を試して、
大丈夫なことを確認しました。
systemd-resolved 経由の問い合わせがうまくいかないとき
systemd-resolve --status
してCurrent DNS Server
を確認するsystemctl restart systemd-resolved
で systemd-resolved を再起動してみる