Ubuntu22.04でdhcpとbindを連携させ家庭内DDNS

DNS(ddns.example.jp)サーバーもDHCPサーバーも1台で兼任させる。ActiveDirectory(ad.example.jp)に関するクエリはドメインコントローラーにフォワードさせる。

・ Ubuntu: 22.04.4
・ bind: 9.13.6
・ isc-dhcp-server: 4.4.1

DNSサーバーの設定

bindから設定、パッケージをインストールする。

# apt install bind9

オプション設定ファイルを変更または追記する。

options {
    directory "/var/cache/bind";
    …
    // 自分で名前解決できないときの丸投げ先
    forwarders {
        192.168.1.254;
        8.8.8.8;
    };
    …
    // DNSSECを自動に設定してDCへのフォワードは除外
    dnssec-validation auto;
    validate-except {
        "ad.example.jp";
    };
    …
    // IPv6を無効化
    listen-on-v6 { none; };
    …
    // LAN内からの問い合わせを許可
    allow-query {
        localhost;
        192.168.1.0/24;
    };
};

ローカル設定ファイルに追記する。

zone "ddns.example.jp." {
    type master;
    file "ddns.example.jp.zone";
    // 自身からの変更を許可
    allow-update {
        localhost;
    };
};
zone "ad.example.jp." {
    type forward;
    forward only;
    forwarders {
        192.168.1.12;
    };
};

さっき指定したzoneファイルを作成する。
※”admin.ddns.example.jp.”は”admin@ddns.example.jp”という管理者のE-mailという意味らしい

$TTL 86400
@    IN    SOA    sv.ddns.example.jp.    admin.ddns.example.jp. (
           2024071501
           10800
           36400
           604800
           86400
)

        IN    NS   sv.ddns.example.jp.
sv      IN    A    192.168.1.11

作成したらファイルの所有者をbindに変更する。

# chown bind:bind /var/cache/bind/ddns.example.jp.zone

サービスを有効にして起動。

# systemctl enable --now named

DHCPサーバーの設定

パッケージをインストールする。

# apt install isc-dhcp-server

設定ファイルで下記の箇所を変更する。

…
# DNSサーバーに更新要求を送信する設定
ddns-update-style interim;
…
# 普通のDHCPの設定
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.101 192.168.1.120;
    option routers 192.168.1.254;
    option domain-name "ddns.example.jp";
    option domain-name-servers 192.168.1.11;
    # 更新を通知するDNSサーバーを指定
    zone ddns.example.jp. {
        primary localhost;
    }
}

サービスを有効にして起動。

# systemctl enable --now isc-dhcp-server

補足

現在のDNSレコードの確認

rndcでdumpして現在のDNSレコードを確認する。

# rndc dumpdb -zones
# less /var/cache/bind/named_dump.db
DNSレコードの更新テスト

nsupdateを使用してDNSサーバーを更新をテストするにはbind-utilsをインストールし、nsupdateコマンドを実行する。実行したら対話型コンソールになるので下記のような感じで入力する。何もエラーが出なければOK。
※INはインターネットの意味らしいが未指定でも問題ない

>server 127.0.0.1
>update add test.ddns.example.jp. 3600 IN A 192.168.1.222
>send
>server 127.0.0.1
>update delete test.ddns.example.jp. IN
>send
DNSレコードの削除

まれにDNSレコードのIPアドレスが一切更新されなくなるクライアントがある。nsupdateコマンドを実行して古いDNSレコードを削除するとそのうち直る。

>server 127.0.0.1
>update delete test.example.jp.
>send