nsupdate

DNSのゾーン情報をコマンドで書き換えることができるnsupdateを使ってみた。

最小限の設定

設定と言っても、対象となるドメイン名(ここではexample.com)のzone情報のallow-updateを以下のように書き換えてbindを再起動するだけでOK。
(本当はOKではない。後述のアクセス制限必須。)

zone "example.com" {
        type master;
        file "master/db.example.com";
        allow-transfer { any; };
        allow-query { any; };
        allow-update { any; };
};

これでexample.comに対してnsupdateコマンドでゾーン情報を書き換えることできるようになる。

% nsupdate
> update add hogehoge.example.com 300 A 192.168.99.99
>
> quit
% nslookup hogehoge.example.com
Server:         192.168.1.1
Address:        192.168.1.1#53

Name:   hogehoge.example.com
Address: 192.168.99.99
% nsupdate
> update delete hogehoge.example.com
>
> quit
% nslookup hogehoge.example.com
Server:         192.168.1.1
Address:        192.168.1.1#53

** server can't find hogehoge.example.com: NXDOMAIN
%

こんな感じで書き換えできる。
書き換え対象のDNSホストを指定したい場合は、

% nsupdate
> server 192.168.1.1
> update add hogehoge.....(以下略)

という風に”server”で指定する。

アクセス制限

ただ、このままだと非常にまずい。なぜならnsupdateを持っている人なら誰でもこのexample.comのゾーン情報を書き換えることができてしまうからだ。なので、

allow-update { any; };

は設定としては有り得ない。
で、ここでアクセス制限をする必要がある。選択肢は二つ。一つ目はipアドレス。

allow-update { 127.0.0.1; };

例えばanyの代わりにこのように”127.0.0.1″を指定すればDNSの動いてる同じホストからしかアップデートできなくなる。

% nsupdate
> server 192.168.1.1
> update add hogehoge.example.com 300 a 192.168.11.11
>
update failed: REFUSED
>

こんな感じで他のホストからアップデートしようとしても拒否られるようになる。
もう一つの選択肢は”TSIG(Transaction Signature)”を使う方法。この方法は要するに特定の文字列を持っている人だけがアップデートできるという仕組み。
その特定の文字列を作るのにdnssec-keygenコマンドを使う。

% /usr/sbin/dnssec-keygen -a HMAC-MD5 -b 512 -n HOST hugahuga
Khugahuga.+157+241??
%

これで、同じディレクトリに

Khugahuga.+157+241??.key
Khugahuga.+157+241??.private

という二つのファイルが生成される。数字の部分はその都度変わる。

% cat Khugahuga.+157+241??.key
hugahuga. IN KEY 512 3 157 IcAFbFUw21u1JrAenmjgz235tiN1FRr+fCt7MgSjBaz+gJMhej56u32l 2OjM5q1R1KUTnkajuVjSuCbUdfu3jQ==

% cat Khugahuga.+157+241??.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: IcAFbFUw21u1JrAenmjgz235tiN1FRr+fCt7MgSjBaz+gJMhej56u32l2OjM5q1R1KUTnkajuVjSuCbUdfu3jQ==
Bits: AAA=
Created: 20130730090553
Publish: 20130730090553
Activate: 20130730090553

それぞれの中身はこんな感じ。特定の文字列がどちらも同じように格納されている。どちらのファイルをアクセス制限に使用しても良いみたい。

key "hugahuga" {
        algorithm hmac-md5;
        secret "IcAFbFUw21u1JrAenmjgz235tiN1FRr+fCt7MgSjBaz+gJMhej56u32l 2OjM5q1R1KUTnkajuVjSuCbUdfu3jQ==";
};

zone "example.com" {
        type master;
        file "master/db.example.com";
        allow-transfer { any; };
        allow-query { any; };
        allow-update {
           key "hugahuga";
        };
};

こんな感じで特定の文字列を埋め込んだkeyを定義してallow-updateで指定してやる。ここでkeyの名前はdnssec-keygenコマンドで指定した名前(hugahuga)と一致させること。
最後にbindを再起動させて準備完了。
nsupdateコマンドを-kオプションで”Khugahuga.+157+241??.key”か”Khugahuga.+157+241??.private”を指定して起動すればOK。

% nsupdate -k Khugahuga.+157+241??.key
>

こんな感じ。動作確認する時はデバッグモードの -d オプションを指定するといい。

その他

ゾーン情報を書き換える時に対話方式ではなく、書き換える内容をそのままファイルに書いてコマンドラインでそのファイル名を指定して行うこともできる。ファイル最終行には空行を必ず入れること。入れないとコマンドがDNSサーバーに送られない。空行の代わりにsendコマンドを書いてもいい。

% cat update-file.txt
update add host1.example.com 300 a 192.168.11.11
update add host2.example.com 300 a 192.168.22.22
update add host3.example.com 300 a 192.168.33.33
update delete host4.example.com
←ここに必ず空行を入れること。

% nsupdate -k Khugahuga.+157+241??.key update-file.txt

nsupdateで行われたアップデートはゾーンファイルに書き込まれるが、それはすぐには行われない。まず、”ゾーンファイル+.jnl”というファイルが生成されて元のゾーンファイルとの差分がそこに保存される。しかる後にゾーンファイルに差分が適用される。.jnlファイルよりもゾーンファイルのタイムスタンプが新しくなっていればゾーンファイルは最新の状態であることが分かる。

参考)
Dynamic DNSの基礎とnsupdateコマンド

1件のコメント

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です