作成開始 : 平成21年04月22日(水) 〜 最終更新 : 平成21年04月23日(木)

DHCP (isc-dhcp) と DNS (djbdns [tinydns, dnscache]) と連携し Dynamic DNS を試す。


わが家では メールサーバー(sendmail, qpopper)、NTPサーバーとしても使っている PC-9821Ne に djbdns の dnscache で インターネットとLAN内のDNSキャッシュ、tinydns でLAN内の名前解決をしている。
これに加え先日、DHCPサーバーとして isc-dhcpd をインストールした。もちろんルータのDHCPサーバー機能は停止した。
その構築途中で、それまで固定IPアドレスで使っていたクライアントPCのIPアドレスをDHCPサーバーからIPアドレス等を取得するように設定を変更した。
無事にDHCPサーバーからの情報を取得しブラウザによるインターネットやLAN内のWebサイト閲覧ができた・・・・しかし・・・
直後にメールサーバーへのメール送受信とSSHによる接続ができずエラーになってしまった。WebとDelegateの各サーバーへのSSH接続は問題なくできた。
そう、メールサーバーには以前インターネットからPOP3での接続を試みてアカウント無しで返されていたログがあったので tcpwrapper でアクセス制限したのだった。
その制限のうちLAN内については「ALL : .takaq.jp : ALL allow 」で許可していた。
DHCPでIPアドレスを取得したPCについては、tinydns に名前解決の設定が無いため接続エラーになってしまったのだ。
その時点では、とりあえず /etc/hosts.allow に「ALL : 192.168.1.0 : ALL allow」を追加してDHCPの構築を進めた。

そこで、DHCPサーバーで払い出した情報をDNSサーバーへ動的に更新できる方法(・・・いわゆるDynamicDNS!?・・・)があるということがわかった。
dhcpd.conf で「 ddns-update-style interim 」とすればいいとのことだったが、djbdns では連携できないこともわかった。(BINDはできるらしい)
なので、この時点では仕方がないので tinydns の data ファイルにDHCPで指定した範囲分の情報を固定的に記述追加して make した。
たとえば、dhcp1:192.168.1.60 みたいな感じである。そして、/etc/hosts.allow の「ALL : 192.168.1.0 : ALL allow」はリマークした。

ちょっとの間、この状態で使っていたのだが、やっぱりホスト名が特定できないのは不便だなーと思った。
きっと、世の中には isc-dhcpd と djbdns を連携させている人がいるはずだ・・・・と思って調べまくっていた。
Rubyのスクリプトとか使って /var/db/dhcpd.leases の更新状態を監視し変更あったら tinydns の data を動的に生成し make しているのは見つけた。
これもよかったが、超々低スペックなサーバー機なので新たなインストールは避けたいと思った。
せめて、標準でインストールされている Perl とか使ってるのがないかなぁー・・・ってな感じである。

あったよ、ありました。dhcp_dns というやつだ。


1.ダウンロード

Dynamic DNS update from DHCP からダウンロードする。

ここの get it here をクリックすると各バージョンのソースがある。私は最新の「dhcp_dns-1.1.0.tgz」(5,543byte)をダウンロードした。
(サイト無くなるの心配なので ここ に保存しときます)

dhcp_dns/ のインデックスをクリックすると構成ファイルを確認することができる。
日本語での構築方法を書いたサイト無いか調べたけど見つけられず、各ファイルとReadme.txtを呼んでやるっきゃないな!!

2.インストール・設定

djbdns、isc-dhcpdのインストールについては、下のリンクを参照してください。
djbdnsでDNSキャッシュを試す
DHCPを試す

(1)クライアントPCから ftp でインストールするサーバーにソースをバイナリで転送する。(/home/takaqに転送) 

(2)インストールサーバーにSSHでログインし su -l でスーパーユーザに移行する。

(3) cd /usr/local/src でディレクトリを移動する。

(4)mv /home/takaq/dhcp_dns-1.1.0.tgz . でソースファイルを移動する。

(5)tar xzvf dhcp_dns-1.1.0.tgz で解凍する。cd dhcp_dns で移動する。

(6)vi で Makefile を編集する。   Makefileのオリジナルは以下のとおりでした。

上のソースとサーバーの環境から定数は次のように設定した。

PREFIX = /usr/local
DOMAIN = takaq.jp
TINYDNSPATH = /etc/tinydns
DNSCACHEPATH = /etc/dnscache
LEASEFILE = /var/db/dhcpd.leases

(7)make、make install を実行する。・・・・次のようなことをしているようだ。

・環境に適合した djb_update.pl を生成し /usr/local/bin にコピー、パーミッションを 755 に設定する。
・/etc/tinydns/root/Makefile を /etc/tinydns/root/orig.Makefile としてバックアップ保存する。
・環境に適合した /etc/tinydns/root/Makefile を生成する。 

(8)vi で /etc/tinydns/root/Makefile を編集する。
これは、(6)のところで「 DNSCACHEPATH = /etc/dnscache 」として make したので /etc/tinydns/root/Makefile の dnscache に変更を反映する部分が私のサーバーの環境に合っていなかったためである。
/usr/local/bin/svc -h /etc/dnscache
       ↓
/usr/local/bin/svc -h /service/dnscache ・・・・ こうしないと、nslookup しても名前解決できない。
(9)cp /etc/tinydns/root/data /etc/tinydns/root/static.takaq.jp で固定IP用の dataファイルを準備する。
この時点で data ファイルには固定IPを記述しているものとする。
これをしないと、実行時以下のエラーになり機能しない。

Can't open static DNS file: won't generate dns from dhcp

また、この時点での data と static.takaq.jp にはDHCPで取得しようとするホスト名があってはいけない。
存在していると次のようなエラーになり機能しない。

Skipping fmv505-1.takaq.jp dhcp dns entry: static entry with same name exists
Skipping sotec.takaq.jp dhcp dns entry: static entry with same name exists
(10) touch /etc/tinydns/root/db.takaq.jp で static.takaq.jp と dhcp.takaq.jp の結合用ファイルを作成する。
これをしないと、DHCP で取得した分が反映されない。

3.テスト

vi で 以下を書いたファイルを作る。私は /root/dns_dhcp.sh とした。
echo ' dns-dhcp.'
(cd /etc/tinydns/root && /usr/local/bin/djb_update.pl >/var/log/dnsdhcp & )
そして、sh /root/dns_dhcp.sh で実行する。
すると、画面に djb_update.pl の実行状態を表示する。うまくいっていると dhcpd.leases changed - updating DNS が一定間隔で表示される。

4.自動起動

OS起動時に自動で起動するように前項で記述したものを /etc/rc.local に記述追加する。

5.参考


  ↑
リース状況です。

設定されたIPアドレスは,サーバーで設定した寿命(リース期間)の間,DHCPクライアントによって保持される。DHCPクライアントはリース期間の半分が過ぎた段階で更新要求を出し,リース期間を更新する。
・・・とのことなので、リース期間 : 600 ということは クライアントは 5分に1回更新要求を出して、/var/db/dhcpd.leases を更新することになる。
すると、今回の設定では、5分に1回 tinydns の data ファイルを 更新し svc -h /service/dnscache しているのだな。
ちょっと多すぎると思うのでリース期間を 3600(1時間) にして更新動作を 30分に1回にした。

  ↑
クライアントPC(WindowsXP)の取得状況です。

  ↑
nslookup で正引き、逆引きしてみました。

戻る

サイトトップへ