Nsupdateを使用してDNSサーバーを動的に更新しようとしています。
DNSサーバーでDebian 6を、クライアントでDebian 4を使用しています。
私は以下を使用して公開/秘密鍵のペアを作成しました:
dnssec-keygen -C -a HMAC-MD5 -b 512 -n USER sub.example.com.
次に、公開キーと更新したい新しいゾーンが含まれるようにnamed.conf.localを編集しました。これは次のようになります(注:allow-update {any;};も試してみました):
zone "example.com" {
type master;
file "/etc/bind/primary/example.com";
notify yes;
allow-update { none; };
allow-query { any; };
};
zone "sub.example.com" {
type master;
file "/etc/bind/primary/sub.example.com";
notify yes;
allow-update { key "sub.example.com."; };
allow-query { any; };
};
key sub.example.com. {
algorithm HMAC-MD5;
secret "xxxx xxxx";
};
次に、秘密鍵ファイル(key.private)を、ゾーンを更新する別のサーバーにコピーしました。私はまた、更新情報を含むテキストファイル(pdate)をこのサーバー上に作成しました(注:私はこれもいじってみました。成功しませんでした):
server example.com
zone sub.example.com
update add sub.example.com. 86400 A 10.10.10.1
show
send
今私はゾーンを更新しようとしています:
nsupdate -k key.private -v update
上記のコマンドは私に次の出力を与えます:
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 0
;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;sub.example.com. IN SOA
;; UPDATE SECTION:
sub.example.com. 86400 IN A 10.10.10.1
update failed: SERVFAIL
名前付きデバッグレベル3は、リモートサーバーでnsupdateコマンドを発行したときに次の情報を提供します(注:クライアントIPを難読化しました)。
06-Aug-2012 14:51:33.977 client X.X.X.X#33182: new TCP connection
06-Aug-2012 14:51:33.977 client X.X.X.X#33182: replace
06-Aug-2012 14:51:33.978 clientmgr @0x2ada3c7ee760: createclients
06-Aug-2012 14:51:33.978 clientmgr @0x2ada3c7ee760: recycle
06-Aug-2012 14:51:33.978 client @0x2ada475f1120: accept
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: read
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: TCP request
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: request has valid signature
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: recursion not available
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: update
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: send
06-Aug-2012 14:51:33.978 client X.X.X.X#33182: sendto
06-Aug-2012 14:51:33.979 client X.X.X.X#33182: senddone
06-Aug-2012 14:51:33.979 client X.X.X.X#33182: next
06-Aug-2012 14:51:33.979 client X.X.X.X#33182: endrequest
06-Aug-2012 14:51:33.979 client X.X.X.X#33182: read
06-Aug-2012 14:51:33.986 client X.X.X.X#33182: next
06-Aug-2012 14:51:33.986 client X.X.X.X#33182: request failed: end of file
06-Aug-2012 14:51:33.986 client X.X.X.X#33182: endrequest
06-Aug-2012 14:51:33.986 client X.X.X.X#33182: closetcp
しかし、それは何もしません。ゾーンは更新されず、nsupdateも何も変更しません。 / etc/bind/primary/sub.example.comファイルが最初の更新の前に存在する必要があるかどうかはわかりません。ファイルなしで、空のファイルと事前構成済みのゾーンファイルを使用して試してみました。成功なし。
ネットで見つけたまばらな情報は、バインド作業ディレクトリに関するファイルとフォルダーのアクセス許可を示しているため、/ etc/bindと/ var/cache/bindの両方のアクセス許可を変更しました(これは私の「バインド」ユーザーのホームディレクトリです)。
アクセス許可が正しいかどうかは100%わかりませんが、それは私にはよく見えます:
ls -lah /var/cache/bind/
total 224K
drwxrwxr-x 2 bind bind 4.0K Aug 6 03:13 .
drwxr-xr-x 12 root root 4.0K Jul 21 11:27 ..
-rw-r--r-- 1 bind bind 211K Aug 6 03:21 named.run
ls -lah /etc/bind/
total 72K
drwxr-sr-x 3 bind bind 4.0K Aug 6 14:41 .
drwxr-xr-x 87 root root 4.0K Jul 30 01:24 ..
-rw------- 1 bind bind 125 Aug 6 02:54 key.public
-rw------- 1 bind bind 156 Aug 6 02:54 key.private
-rw-r--r-- 1 bind bind 2.5K Aug 6 03:07 bind.keys
-rw-r--r-- 1 bind bind 237 Aug 6 03:07 db.0
-rw-r--r-- 1 bind bind 271 Aug 6 03:07 db.127
-rw-r--r-- 1 bind bind 237 Aug 6 03:07 db.255
-rw-r--r-- 1 bind bind 353 Aug 6 03:07 db.empty
-rw-r--r-- 1 bind bind 270 Aug 6 03:07 db.local
-rw-r--r-- 1 bind bind 3.0K Aug 6 03:07 db.root
-rw-r--r-- 1 bind bind 493 Aug 6 03:32 named.conf
-rw-r--r-- 1 bind bind 490 Aug 6 03:07 named.conf.default-zones
-rw-r--r-- 1 bind bind 1.2K Aug 6 14:18 named.conf.local
-rw-r--r-- 1 bind bind 666 Jul 29 22:51 named.conf.options
drwxr-sr-x 2 bind bind 4.0K Aug 6 03:57 primary/
-rw-r----- 1 root bind 77 Mar 19 02:57 rndc.key
-rw-r--r-- 1 bind bind 1.3K Aug 6 03:07 zones.rfc1918
ls -lah /etc/bind/primary/
total 20K
drwxr-sr-x 2 bind bind 4.0K Aug 6 03:57 .
drwxr-sr-x 3 bind bind 4.0K Aug 6 14:41 ..
-rw-r--r-- 1 bind bind 356 Jul 30 00:45 example.com
Ubuntuサーバーでもまったく同じ問題が発生しましたが、次の2つの問題であることがわかりました。
(1)鎧
Debianでも同じことが言えるかどうかはわかりませんが、Ubuntuではapparmorを有効にしてbind9
を実行しています。つまり、特定の場所への書き込みのみが許可されます。場所は/etc/apparmor.d/usr.sbin.named
にリストされており、通常はこれらのディレクトリ内に留まることをお勧めします。 apparmor-utils
パッケージをインストールし、(一時的に)バインドのapparmorを無効にして、これが問題の原因かどうかを確認できます。
Sudo aa-status
適用されたプロファイルのリストに/usr/sbin/named
が表示されます。次に実行します
Sudo aa-complain /usr/sbin/named
それを不平モードに入れます。
(2)ゾーンファイル
マニュアルやチュートリアルでこれについて言及することはほとんどありませんが、bind9は(既存の)既存のゾーンファイルが適切に機能することを期待しています。 end of file
エラーは、ゾーンファイルがまだ存在しないことが原因である可能性があります(例では/etc/bind/primary/example.com
および/etc/bind/primary/sub.example.com
)。次のように作成するだけです。
echo "; DO NOT EDIT MANUALLY - use the \"nsupdate\" utility to prevent data loss
;
\$Origin example.com.
\$TTL 86400 ; 1 day
@ IN SOA ns1.example.com. hostmaster.example.com. (
2009074711 ; serial
7200 ; refresh (2 hours)
300 ; retry (5 minutes)
604800 ; expire (1 week)
60 ; minimum (1 minute)
)
IN NS ns1.example.com.
ns1 IN A <IP of your bind server>" | Sudo -u bind tee /etc/bind/primary/example.com
ゾーンファイルを保存する場所の場所を変更するまで、非常によく似た問題がありました。
バインドには/var/cache/bind
への書き込み権限がありましたが、ゾーンファイルは/etc/bind/...
に保存されています。現在、Bindには/etc/bind/...
のファイルへの書き込み権限がないため、Bindの権限を更新するか、Bindが適切な権限を持つディレクトリにゾーンファイルを保存する必要があります。動的ゾーンに推奨されるディレクトリ(/var/lib/bind/
)にゾーンファイルを移動する簡単な手順を説明します。
ゾーンファイルをmv
で移動します(ルートとして実行する必要がある可能性があります)
mv /etc/bind/primary/example.com /var/lib/bind/primary/
mv /etc/bind/primary/sub.example.com /var/lib/bind/primary/
named.conf
構成のファイルパスを更新します。あなたの場合、これは/etc/bind/named.conf.local
を更新することを意味します
zone "example.com" {
type master;
file "/var/lib/bind/primary/example.com"; //this line changed
//other stuff removed for clarity
};
zone "sub.example.com" {
type master;
file "/var/lib/bind/primary/sub.example.com"; //this line changed
//other stuff removed for clarity
};
service bind9 restart
でバインドを再開します
Nsupdateのセクションを参照してください
With the -k option, nsupdate reads the shared secret from the file
keyfile. Keyfiles may be in two formats: a single file containing a
named.conf-format key statement, which may be generated automatically
by ddns-confgen, or a pair of files whose names are of the format
K{name}.+157.+{random}.key and K{name}.+157.+{random}.private, which
can be generated by dnssec-keygen. The -k may also be used to specify a
SIG(0) key used to authenticate Dynamic DNS update requests. In this
case, the key specified is not an HMAC-MD5 key.
したがって、それを
key sub.example.com. {
algorithm HMAC-MD5;
secret "xxxx xxxx";
};
フォームを作成し、それをファイルに残します。または、-k K{name}.+157.+{random}.*
Dyndnsの更新の場合、BINDはゾーンで使用されるフォルダーに書き込むことができる必要があります。/etcはそのような情報を格納するのに適切な場所ではないようです。また、アクセス許可などを確認することは、bindによる書き込みができないようです。
/ var/bindディレクトリを試して、bindが書き込みできるようにすることをお勧めします。