2008年1月22日火曜日

DNSMasq で DHCP 登録されたホスト名から IP アドレスを解決させる

DNSMasq は,DNS 機能とともに DHCP サーバ機能も持っている.で,FON にインストールされていた DNSMasq では,DHCP により登録されたホスト名でも IP アドレスを解決できていたので,DHCP の特性上動的に IP アドレスが変わっても,ホスト名でアクセスできて便利だったのだが,Linux にインストールしたものは /etc/hosts しか見ない.

こんな機能もともと持ってるはずだよなぁと思ってオプションや conf ファイルを見てみたけど,それらしき設定がない.でもそれを間接的に実現できそうなオプションが見つかった.

具体的には,dnsmasq.conf 内の
dhcp-script=<コマンド>
で,DHCP にマシンが登録・削除されるたびにこのコマンドが呼び出される.そのときの DHCP アドレス貸し出し状況は (デフォルトで) /var/lib/misc/dnsmasq.leases に書かれているので,これを元に /etc/hosts を書き直した後,DNSMasq に /ets/hosts をリロードさせるために,kill -HUP すればよい.

というわけで,↓こんなスクリプトを書いて dhcp-script に指定してみた.

#!/usr/bin/perl -w

$Hosts = '/etc/hosts';
$Leases = '/var/lib/misc/dnsmasq.leases';

exit( 0 ) if( !( $ARGV[ 0 ] eq 'add' || $ARGV[ 0 ] eq 'del' )
&& -e $Hosts || ! -e $Leases );

open( fpIn, "< $Leases" );
open( fpOut, "> $Hosts" );

print fpOut << 'EOF';
# DO NOT EDIT THIS FILE
# This file is generated automatically by dhcp_update.pl
127.0.0.1 localhost localhost.localdomain

# これ以下~EOF の間に,固定 IP アドレスのホスト名を書く
192.168.0.254 ephemeris dds_svr

EOF

while( <fpIn> ){
@_ = split;
print( fpOut "$_[2]\t$_[3]\t# $_[1]\n" ) if( $_[3] ne '*' );
}

close();

kill( HUP, `cat /var/run/dnsmasq.pid` );

/etc/hosts はこのスクリプトにより完全に上書きされる形になるので,DHCP 以外の固定的なホスト情報は,このスクリプト内に書いておかないといけない./etc/hosts に上書きするのがイヤなら,適当なファイルに吐いて dnsmasq.conf の addn-hosts= で指定する方法もあるが,そうすると DNSMasq が走ってるマシン自身で DHCP 登録されたホスト名でのアドレス解決ができない(?).

新しい PC が DHCP に登録されると,/var/log/messages に

Jan 20 17:22:46 ephemeris dnsmasq[1053]: read /etc/hosts - 4 addresses

とか出て,いちお期待通りに動いている模様.ヽ(´ー`)ノ

0 件のコメント:

コメントを投稿