Raspberry Pi 4 でローカル DNS サーバを立てる

Raspberry Pi 4 と BIND 9 で自宅ネットワーク用の DNS サーバを立てました。
ラズパイに sv.homenetwork というドメイン名を付けてみます。

f:id:arrowislandnai:20201231170609p:plain

ラズパイ情報

$ 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/24homenetwork というゾーンにします。
ラズパイには 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: NOERRORflagsaa があります。
大丈夫そうです。

$ 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.

...

外部のドメインも試してみます。今度は flagsra があります。
大丈夫そうです。

$ 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.10dig -x 192.168.1.10 を試して、
大丈夫なことを確認しました。

systemd-resolved 経由の問い合わせがうまくいかないとき

  • systemd-resolve --status して Current DNS Server を確認する
  • systemctl restart systemd-resolved で systemd-resolved を再起動してみる

参考にさせていただいたサイト