DHCP 環境下などで IP が動的に付与される場合は DNS レコードを動的に更新する必要があります。これを実現する Dynamic Update 機能が BIND 9 には実装されています。使用方法をまとめます。Dynamic Update に対応した DNS を特に Dynamic DNS または DDNS とよぶことがあります。なお、事前にこちらの手順にしたがって必要なソフトウェアはインストール済みであるとして記述しています。
ローカルホストに example.com のマスター権威ネームサーバを構築して Dynamic Update の実験をします。ファイル内容の意味についてはこちらを参照してください。
/var/named/example.com.zone
$TTL 60
@ IN SOA ns1.example.com. username.example.com. (
2015032900
60
60
604800
3600
)
IN NS ns1.example.com.
ns1 IN A 192.168.33.101
/var/named/33.168.192.in-addr.arpa.zone
$TTL 60
@ IN SOA ns1.example.com. username.example.com. (
2015032900
60
60
604800
3600
)
IN NS ns1.example.com.
101 IN PTR ns1.example.com.
$ sudo chown named:named /var/named/example.com.zone
$ sudo chmod 600 /var/named/example.com.zone
$ sudo chown named:named /var/named/33.168.192.in-addr.arpa.zone
$ sudo chmod 600 /var/named/33.168.192.in-addr.arpa.zone
$ sudo named-checkzone example.com. /var/named/example.com.zone
$ sudo named-checkzone 33.168.192.in-addr.arpa. /var/named/33.168.192.in-addr.arpa.zone
アクセス元 IP による制限でよいとする場合、本手順は不要です。Dynamic Update を実行できるホストには制限をかけるべきです。任意 (any) のホストがゾーンファイルを更新できる状況は好ましくありません。制限方法には IP によるものと鍵認証によるものがあります。いずれも後述の allow-update で指定します。本ページでは、よりセキュアな鍵認証 TSIG (Transaction SIGnatures) を採用します。UDP パケットにおけるアクセス元 IP は容易に改竄できてしまうためです。共通鍵を用いてこちらのページで紹介した HMAC を計算します。送信元の認証とメッセージが改竄されていないことの確認を目的としています。いわゆる署名のようなものであり暗号化ではないことに注意してください。
以下のコマンドで host1 と host2 で使用する予定の共通鍵を生成します。
$ dnssec-keygen -r /dev/urandom -a HMAC-SHA256 -b 128 -n HOST host1-host2
$ cat Khost1-host2.+163+61936.key
host1-host2. IN KEY 512 3 163 ZO+XsA/8arOB/9hmlzGDZg==
$ cat Khost1-host2.+163+61936.private
Private-key-format: v1.3
Algorithm: 163 (HMAC_SHA256)
Key: ZO+XsA/8arOB/9hmlzGDZg==
Bits: AAA=
Created: 20150328190220
Publish: 20150328190220
Activate: 20150328190220
「ZO+XsA/8arOB/9hmlzGDZg==」という base64 エンコードされた文字列が必要な情報です。生成結果のファイルは nsupdate コマンドを実行する際に使用するので削除せずに保管しておいてください。
ゾーンファイルを手動で編集する予定がない場合、本手順は不要です。rndc (remote name daemon control) というコマンドがあります。rndc を使用するとリモートのネームサーバに対して named の stop/reload/status などを実行できます。Dynamic Update のためだけに用意されたコマンドではありません。rndc を使用すると Dynamic Update で動的に更新されるゾーンファイルを手動でも更新できるようになるため紹介します。今回の操作対象は名前に反しますがローカルホストの named です。rndc は named を操作するために認証情報を要求されます。認証は共通鍵によって行われます。事前に生成して rndc クライアントと named サーバーの両方の設定ファイルに登録しておく必要があります。
$ rndc-confgen -r /dev/urandom -b 256
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "kYSgjQuZYYGXkLcxdFkkwZHc+2YMYZbfkoAx3R4PsKk=";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "kYSgjQuZYYGXkLcxdFkkwZHc+2YMYZbfkoAx3R4PsKk=";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
標準出力に表示された情報をもとにして、エディタなどで /etc/rndc.conf を作成します。named.conf に関する部分はこの後使用しますのでメモしておいてください。
// rndc 用
key "rndc-key" {
algorithm hmac-md5;
secret "kYSgjQuZYYGXkLcxdFkkwZHc+2YMYZbfkoAx3R4PsKk=";
};
// rndc の設定
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
// ダイナミックアップデート用
key "host1-host2." {
algorithm hmac-sha256;
secret "ZO+XsA/8arOB/9hmlzGDZg==";
};
acl "bogus" {
0.0.0.0/8;
1.0.0.0/8;
2.0.0.0/8;
169.254.0.0/16;
192.0.2.0/24;
224.0.0.0/3;
10.0.0.0/8;
172.16.0.0/12;
192.168.0.0/16;
};
options {
directory "/var/named";
recursion no; // Authoritative-only
allow-recursion { none; }; // Authoritative-only
blackhole { bogus; };
};
zone "example.com" {
type master;
file "example.com.zone";
allow-query { any; };
allow-update { key host1-host2.; }; // ダイナミックアップデート
};
zone "33.168.192.in-addr.arpa" {
type master;
file "33.168.192.in-addr.arpa.zone";
allow-query { any; };
allow-update { key host1-host2.; }; // ダイナミックアップデート
};