CentOS7でdhcpとbindを連携させ家庭内DDNS

インストール

今回はDNSサーバーもDHCPサーバーも1台で兼任させる。
まずインストールする。
※Version bind9.9.4 dhcp4.2.5

# yum install dhcp bind

DNSサーバーの設定

bindから設定する。
下記の箇所の内容を変更または追記する。

options {
    // zoneファイルの保存場所
    directory "/var/named/";
    // ほかのdnsサーバーはいないのでno
    notify no;
    // LAN内からの問い合わせを許可
    allow-query {
        localhost;
        192.168.1.0/24;
    };
    // 自分で名前解決できないときの丸投げ先
    forwarders {
        192.168.1.254;
        8.8.8.8;
    };
};

zone "example.jp." {
    type master;
    file "example.jp.zone";
    // 自身からの変更を許可しておく
    allow-update {
        localhost;
    };
};

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

$TTL 86400
@    IN    SOA    dns.example.jp.    admin.example.jp. (
           2018042619
           10800
           36400
           604800
           86400
)

       IN    NS   dns.example.jp.
dns    IN    A    192.168.1.11

作成したらファイルの所有グループをnamedに変更して書き込み権限を設定する。
※namedに読み書きの権限を持たせるのが目的

# chgrp named /var/named/example.jp.zone
# chmod g+w /var/named/example.jp.zone

ついでに/var/named/の所有グループもnamedに変更して書き込み権限を設定する。
※namedに書き込みの権限を持たせるのが目的

# chgrp named /var/named/
# chmod g+w /var/named/

DHCPサーバーの設定

設定ファイルを下記のように編集する。

# 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 "example.jp";
    option domain-name-servers 192.168.1.11;
    # 更新を通知するDNSサーバーを指定
    zone example.jp. {
        primary localhost;
    }
}

その他の必要な設定

SELinuxとFirewallに例外を追加する。

# setsebool -P named_write_master_zones true
# firewall-cmd --add-service=dns --permanent
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --reload

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

# systemctl enable named
# systemctl start named
# systemctl enable dhcpd
# systemctl start dhcpd

補足

nsupdate

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

>server 127.0.0.1
>update add test.example.jp. 3600 A 192.168.1.222
>send
>server 127.0.0.1
>update delete test.example.jp.
>send
rndc

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

# rndc dumpdb -zones
# cat /var/named/data/cache_dump.db | grep dns.example.jp.