ubuntu 12.04 を起動しても DNS に名前登録されない

ubuntu 12.04 を評価のためにインストールしてみた。
サーバーとしての評価なので最終的には固定 IP アドレスにするのだが、評価途中は DHCP を使った動的割り当ての方が何かと手軽だ。
ところが、DHCP サーバーと DNS サーバーをどちらも Windows 2008 で構成していると、IP アドレスの割り当てを受けたときの DNS サーバーへの登録がまるでできない。

これだと、毎回 ローカル コンソールで割り当てられている IP アドレスを調べ、それを覚えておき、その IP アドレスを使ってリモートから接続を試みるという、何とも面倒臭い手順が必要になる。

ひとつ前の LTS バージョンである ubuntu 10.04 のときは、/etc/dhcp/dhclient.conf ファイルの send host-name "<hostname>" の行の <hostname>の部分を実際のホスト名に書き替えればうまくいっていた記憶がある。
ところが ubuntu 12.04 で同様に書き替えても DNS サーバーに登録されることはなかった。
もしかすると、DNS サーバーを動かしている OS が Windows Server 2008 R2 に変わったことが原因なのかも知れないが、きちんと調査する環境を作るのもまた大変な手間かかる。
また、もし Windows Server 2008 の DNS サーバーであれば上の方法でうまくいくとしても、そのためだけに Windows Server 2008 を使い続けるわけにはいかない。

そこで、ubuntu 12.04 に以下のスクリプトを置いて、DHCP サーバーから IP アドレスの割り当てを受けたときに、能動的に DNS サーバーに登録するようにした。

ubuntu 12.04 は (もっと以前のバージョンからそうだが) DHCP サーバーから IP アドレスの割り当てをうけるために dhclient3 というデーモン (ubuntu 12.04 では isc-dhcp-client パッケージに含まれる) を使っている。
この dhclient3 デーモンは DHCP サーバーから IP アドレスの割り当てを受けたときや、IP アドレスを解放したりしたときに、/sbin/dhclient-script スクリプトを介して任意のスクリプトを実行できる。

この仕組みを使い、/sbin/dhclient-script スクリプトから呼び出されるスクリプトの中で nsupdate コマンドを実行して、明示的に DNS サーバーへの登録と解除を行うようにした。

用意したスクリプトは以下のものだ。

このスクリプトを適当なファイル名にして、/etc/dhcp/dhclient-enter-hooks.d ディレクトリと /etc/dhcp/dhclinet-exit-hooks.d ディレクトリの 2 箇所に保存すれば、DHCP からの IP アドレスの割り当てと解放に合わせて DNS サーバーへの名前登録と解除を行うようになる。
/etc/dhcp/dhclient-enter-hooks.d ディレクトリに保存したスクリプトは DHCP による IP アドレスの割り当てや解放の処理を実際に行う前に呼び出され、/etc/dhcp/dhclinet-exit-hooks.d ディレクトリに保存したスクリプトは割り当てや解放を行った後に呼び出される。
なお、このスクリプトを保存したファイルに実行のアクセス権は不要だ。

このスクリプトでは、 ${script}${old_domain_name}${new_domain_name} といったこのスクリプト内で定義されていない変数を多用している。
こういった変数は、このスクリプトを呼び出した /sbin/dhclient-script スクリプトで定義されている。

いくつか説明をしておこう。
${script} には呼び出されたスクリプトのフルパスが保存されている。
これを使って /etc/dhcp/dhclient-enter-hooks.d ディレクトリに保存したスクリプトを実行しているのか、それとも /etc/dhcp/dhclinet-exit-hooks.d ディレクトリに保存したスクリプトを実行しているのかを判定するようにした。
${old_domain_name}${new_ip_address} のように ${old_...}${new_...} といった変数には、IP アドレスが割り当てられる、解放する前後のドメイン名や IP アドレスが保存されている。
${reason} はどんな処理をした、またはこれからするのかといった情報の文字列だ。
他にもこういったいくつかの変数が、/sbin/dhclient-script スクリプトで定義されている。

このスクリプトでは IPv6 アドレスを DNS サーバーに登録できないのが残念だ。
この辺りについては、そのうちに気が向いたときにでも改良するかもしれない。

コメントを残す