モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

BIND 9 ゾーンファイル Dynamic Update の設定方法

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/03/29
最終更新最終更新
2021/09/07
記事区分記事区分
一般公開

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

DDNS 時に使用する共通鍵の生成

アクセス元 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 時に使用する共通鍵の生成

ゾーンファイルを手動で編集する予定がない場合、本手順は不要です。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 に関する部分はこの後使用しますのでメモしておいてください。

/etc/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.; }; // ダイナミックアップデート
};

権限変更および設定の検証

鍵が記載されているファイルがあるため read 権限には特に注意しましょう。また /var/named の write 権限は後述のジャーナルファイルが生成されるため必須です。

$ sudo chown root:root /etc/rndc.conf
$ sudo chmod 600 /etc/rndc.conf
$ sudo chown named:named /etc/named.conf
$ sudo chmod 600 /etc/named.conf
$ sudo named-checkconf /etc/named.conf
$ sudo chmod g+w /var/named

サービスの起動および検証

$ sudo service named restart
$ sudo grep named /var/log/messages | tail
$ host ns1.example.com localhost
$ host 192.168.33.101 localhost
$ sudo rndc status

nsupdate コマンドによるゾーンファイルの動的更新

DDNS クライアントの実装はいろいろあります。ここでは特に BIND 9 に付属している nsupdate コマンドを用いてみます。ローカルホストで動作する named のゾーンファイルを動的に更新します。なお TSIG で認証をかけている場合は共通鍵が記載された先程のファイル二つが必要ですので用意しておいてください。

ディレクトリ構成

.
├── Khost1-host2.+163+61936.key
└── Khost1-host2.+163+61936.private

以下のコマンドを実行してインタラクティブにゾーン情報を更新します。

$ nsupdate -k Khost1-host2.+163+61936.key
> server 127.0.0.1
> update add newhost.example.com 60 A 192.168.33.102
> show
> send
> quit

確かにゾーンの情報が更新されたことを確認しましょう。

$ host newhost.example.com localhost

実行直後であればジャーナルファイル /var/named/example.com.zone.jnl の存在が確認できます。一定時間が経過すると更新された結果を dump してまとめます。サーバー再起動後などは最後の dump 後に発生した update に関する jnl ファイルを再度適用します。

ゾーンファイルの手動更新

通常 DDNS の対象となっているゾーンファイルは手動では編集できません。ジャーナルファイルが反映されている保証がないからです。手動編集したい場合は一旦サービスを停止してジャーナルファイルを反映させる

$ sudo service named stop

または以下のようにします。

  1. sudo rndc freeze example.com (Dynamic Update を無効化。jnl ファイルがゾーンファイルに反映される)
  2. 手動でゾーンファイルを編集
  3. sudo rndc thaw example.com (再度 Dynamic Update を有効化)
Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

GitHub Actions とか CI/CD が好きです。

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • Ciscoルータの基本操作
      シスコ社の製品のうち、ルータは Cisco*** という製品名でスイッチは Catalyst*** という製品名です。いずれも *** は機種番号で、数字が小さいほど小規模ネットワーク向けとなっています。例えば資格試験 CCNA Routing and Switching では小規模および中規模ネットワークが対象です。そのため、中小規模のネットワークのルータおよびス
    • VyOS の基本的なルーティング設定
      本ページでは、複数の LAN をつなぐルータとしての設定方法をまとめます。具体的には、スタティックルーティングおよびダイナミックルーティング (RIP/OSPF/BGP)の設定方法を把握します。 設定方法を検証するための構成 ルーティング設定の検証を行うために VirtualBox で 5 台の VM を用意します。ホスト OS から vyos-0001 へ SSH 接続する部分を除き、「内部ネッ...
    • BIND 9.10.2 の公式マニュアルに学ぶ DNS の基本
      DNS の実装としては Internet Systems Consortium (ISC) の Berkeley Internet Name Domain (BIND) が有名です。本ページは公式サイトの Documentation からダウンロードできる v9.10.2 の PDF マニュアルおよび『DNSの仕組み完全解説』から基本事項を抽出してまとめ
    • スタティックルートの設定
      サムネイル画像-73e0bcdf3a
      インターフェイスに IP を設定しただけでは他のデバイスと通信できません。各デバイスにルーティングテーブルを設定する必要があります。ルーティングテーブルの設定方法には動的に自動設定するものと、静的に手動設定するものの二種類があります。ここでは静的に手動設定するスタティックルートの方法を紹介します。 具体的にはまず PC0, PC1, Router0, Router1 それぞれ
      あきらあきら9/7/2021に更新
      いいねアイコン画像0
    • 低レイヤーネットワークプログラミングに関する雑多な知識
      TCP/IP モデルのうちトランスポート層ではなく、インターネット層およびネットワークインターフェイス層のパケット (正確には PDU) を扱う低レイヤープログラミングの雑多なテクニックをまとめます。『ルーター自作でわかるパケットの流れ』などを参考にしています。バックアップ目的で書籍のサンプルコードをホスティングしました。 検証環境