たくさんのクライアントを抱えていくと、DHCPで楽々IPアドレスを配信したいところですね。
しかし、DHCPでIPアドレスを配ってしまうとネットワークトラブルが起こったときに
nslookup や pingを打つのも一苦労してしまいます。(TCP/IPを使わなければいいのですが・・)
そこで、DHCPで配ったIPアドレスを自動的にネームサーバに書き込んでくれるという方法が
最近になって出てきましたので、紹介してみます。(結構苦労しました・・・(^^ゞ)
使うソフト
基本はVineLinux2.6R1を使います。
ネームサーバは元々ついてあるものを使います。 = bind-8.3.1-0vl2
DHCPサーバはVer3.0以上のようなので、tarを使いました。 = dhcp-3.0.1rc13.tar.gz
1:DHCPサーバプログラムを取ってきます。
DHCPはISCというところが発表しています。ですからサイトも、ftp.isc.orgとなります。
#cd /usr/local/src
#wget ftp://ftp.isc.org/isc/dhcp/dhcp-3.0.1rc13.tar.gz
最新バージョンが欲しい方は、wget ftp://ftp.isc.org/isc/dhcp/dhcp-latest.tar.gz と言う方法もあります。
ちなみに、私はNCFTPのファンなので #ncftpget ftp.isc.org . /isc/dhcp/dhcp-3.0.1rc13.tar.gz と言う方法も使えます。
取ってきたものは後で使いますので、ちょっとおいておきます。 (^^ゞ
2:ダイナミックDNSを設定
ダイナミックDNS。通称DDNSと呼ばれています。簡単に言うと「IPアドレスと変更を申請されればそれを受理して登録する」と言うことです。
ネームサーバはrpmでインストールしてください。 apt-get install bind
* /etc/named.confの設定
自動的にネームサーバをアップデートする為に新しいコマンドが追加されました。
allow-updateと言います。
ダイナミックDNSを利用せずにネームサーバを運用する場合は allow-update { none ; }
ダイナミックDNSを利用して自動的にネームサーバを更新する場合は allow-update { any ; };
(例)
---- /etc/named.conf ----
options {
directory "/var/named";
forwarders {
// 外部DNS
202.219.63.59;
192.47.24.150;
};
};
zone "." {
type hint;
file "named.ca";
};
zone "localhost" {
type master;
notify no;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" {
type master;
notify no;
file "named.local";
allow-update { none; };
};
zone "lan.usi.nu" {
type master;
notify no;
file "lan.zone";
allow-update { any ; };
};
zone "50.168.192.in-addr.arpa." {
type master;
notify no;
file "lan.rev";
allow-update { any ; };
};
---- EOF ----
※「notify no;」というのは外部に漏らさないコマンドです。
ローカルのネームサーバが表に表示されるというのはちょっと気になる方はどうぞ。
* zone / rev の設定
lan.zoneの設定は、通常しているネームサーバと一緒です。ですから、初めから静的アドレスがある場合は
事前に登録しておくのがよいでしょう。 実際に運営が始まると、このZoneファイルはnamedの管理下に置かれ
ハンドで修正するのは難しくなるからです。
(例) /var/named で作成
---- lan.zone ----
$TTL 86400
@ IN SOA dns.lan.usi.nu. root.lan.usi.nu. (
2003092901 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS dns
IN MX 10 smtp
localhost IN A 127.0.0.1
dns IN A 192.168.50.50
smtp CNAME dns
---- EOF ----
---- lan.rev ---
$TTL 86400
@ IN SOA dns.lan.usi.nu. root.lan.usi.nu. (
2003092901 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS dns.lan.usi.nu.
50 IN PTR dns.lan.usi.nu.
---- EOF ----
できあがったら・・・・・
#mkdir org
#cp lan.* ./org/
(重要)これで、ネームサーバのバックアップを取っておきます(後日設定変更が楽)。
できあがったら起動します。 /etc/rc.d/init.d/named start
ダイナミックDNSが動作するまで少し時間がかかかります。(5~10分)。
待つ時間を利用してDHCPを設定します。
3:DHCPを設定する
先ほど取ってきたファイルを展開し、セットアップします。
#tar zxvf dhcp-3.0.1rc13.tar.gz
#cd dhcp-3.0pl2
#./configure
#make
#make install
セットアップが終わると各ツールが下記のように配置されます。無いものは作くります。
dhcpd /usr/sbin/dhcpd
leases /var/state/dhcp/dhcpd.leases
dhcpd.conf /etc/dhcpd.conf
・dhcpd は実行プログラムなので触りません。
・leases はリース期間中の保管データファイルになるので作ります。
#touch /var/state/dhcp/dhcpd.leases
・dhcpd.conf はDHCPの設定ファイルです。無いので作ります。
#cd /etc
#vi dhcpd.conf
---- dhcpd.conf ----
# dhcpd.conf
# leases = /var/state/dhcp/dhcpd.leases
# life time
default-lease-time 600;
max-lease-time 7200;
# log lotet
log-facility local7;
# Dynamic DNS set
ddns-update-style interim;
zone lan.usi.nu. {
primary 192.168.50.50;
}
zone 50.168.192.in-addr.arpa. {
primary 192.168.50.50;
}
# Rental IP
subnet 192.168.12.0 netmask 255.255.255.0 {
option domain-name "lan.usi.nu";
option domain-name-servers dns.lan.usi.nu, dns.usi.nu;
option broadcast-address 192.168.12.255;
option subnet-mask 255.255.255.0;
# option netbios-name-servers 192.168.192.168;
range 192.168.50.100 192.168.50.200;
option routers 192.168.12.23;
}
# Fixed IP address
host dns {
hardware ethernet 00:00:00:00:00:00;
fixed-address 192.168.50.50;
}
---- EOF ----
決まっている物があれば、Fixed IP address のように設定してください。
できあがればDHCPを起動します。
# /usr/sbin/dhcp eth1(今回はeth1からの要求にだけ応えます)
4:テスト
A.ダイナミックDNSの確認
ダイナミックDNSはコマンドで操作できます。ユーザは誰でもいいようです。
コマンドは nsupdate で、パラメータが長いので別行になります。
$nsupdate
>update add test.lan.usi.nu 300 in a 192.168.50.90 <-正引き
>update add 90.50.168.192.in-addr.arpa. 300 in ptr test.lan.usi.nu. <-逆引き
書式は正引き・逆引きとよく似ていますが、1行にTTLの値を使うのが特徴的です。
このまま行けば1つの名前にいくつものIPアドレスを付けることが出来るので
更新する場合はいったん削除してから追加する方がいいでしょう。
削除方法
$nsupdaste
>update delete test.lan.usi.nu A
>update delete 90.50.168.192.in-addr.arpa. IN PTR
nsupdate を使って登録すると通常、jar と言うファイルが出来るのですが、
VineLinux の場合は logファイルが出来ます。
logファイルの中を見ると、nsupdateで指定したパラメータが書かれています。
そして、zone / rev ファイル共にネームサーバの管理下に置かれ書式が変更されます。
これでOKです。後は、DHCPでIPアドレスを取得したときにきちんと zone / revに
書かれていることを確認してください。
5.ファイルにて設定(おまけ)
DHCPでやっている以上は大丈夫ですが、自動的に変更したい場合の参考にファイルで
更新する方法を書いておきます。(あまり大したことはないのですが)
---- ns.txt ----
update delete test2.lan.usi.nu A
update delete 19.50.168.192.in-addr.arpa. IN PTR
update add test2.lan.usi.nu 300 in a 192.168.50.20
update add 20.50.168.192.in-addr.arpa. 300 in ptr test2.lan.usi.nu
---- EOF ----
上記のファイルは test2.lan.usi.nu のIPアドレスを 192.168.50.19 から 192.168.50.20に
変更する手順です。これを nsupdate で読み込みます。
$nsupdate ns.txt
すると、データは書き換わります。簡単ですね。∈^0^∋
完了!2003/09/30記述
6.自動的に更新(おまけ2)
phpを使ってネームサーバを自動的に更新させるものを作ってみました。
準備
ファイルを保存する場所を作る --> 今回は /usr/local/ddns を作成
# kmdir /usr/local/ddns
# chmod 666 /usr/local/ddns <-- 誰が使うか解らないので
phpとapacheをインストール確認
# rpm -aq|grep php
php-devel-4.2.3-0vl5
php-4.2.3-0vl5
# rpm -aq|grep apache
apache-devel-1.3.27-0vl2
apache-1.3.27-0vl2
apache-manual-1.3.27-0vl2
ファイルの作成
htmlを利用するので、 /home/httpd/html にファイルを置く
# vi ddns.php4
---- ddns.php4 -----
// /usr/local/ddns
// dim
$zone= $_GET["zone"] ;
$rev= $_GET["rev"];
$dir="/usr/local/ddns/";
$oldrevfile=$dir . $zone;
$fd=fopen($oldrevfile , "r");
$oldrev=fread($fd,filesize($oldrevfile));
fclose($fd);
list($a,$b,$c,$d) = split('[.]',$rev);
$rev2 = ($d . "." . $c . "." . $b . "." . $a);
$delzone = "update delete " . $zone . " A\n";
$delrev = "update delete " . $oldrev . ".in-addr.arpa. IN PTR\n";
$addzone = "update add " . $zone . " 10080 in a " . $rev . "\n";
$addrev = "update add " . $rev2 . ".in-addr.arpa. 10080 IN PTR " . $zone . ".\n";
$fl=fopen($dir . "dns2rev.txt","w");
fwrite($fl, $delzone . "\n");
fwrite($fl, $delrev . "\n");
fwrite($fl, $addzone . "\n");
fwrite($fl, $addrev . "\n");
fclose($fl);
system ("/usr/bin/nsupdate " . $dir . "dns2rev.txt");
$fo=fopen($dir . $zone ,"w");
fwrite($fo, $rev2);
fclose($fo);
---- EOF ----
使い方
cronを動作し、変更データを読み取ってネームサーバに送る。
(例)w3mを使った場合
w3m http://hogehoge/ddns.php4?zone='hogehoge.or.jp'&zone='192.168.1.19'
完了! 2003/10/12記述
7.おまけ2(気が向いたらしてください)
nslookupを bind9 でそのまま使うといちいちメッセージが出ます。
# nslookup
Note: nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead. Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
そこで、このエラーを出ないようにします。
VineLinux は デフォルトで .bashrc を使っています。
そこで、ここに alias を追加することにしました。
# cd (<- デフォルトルートに戻る)
# vi .bashrc
以下の内容を追記する
alias nslookup='nslookup -sil'
書きおわったら一度ログアウトして、再度ログインします。
これで、nslookup の時にエラーは出ません。
7.1 おまけ2.1 (これも気が向いたら・・・)
nslookup を使って ipv6 を調べようとするとスイッチが必要です。
# nslookup -type=AAAA hogehgoe
このスイッチも長いので .bashrc に追加しておきます。
alias nslookup6='nslookup -sil -type=AAAA'
nslookup6は一般的ではないので、本当に気が向いた人だけ使ってください。
<<<新規ユーザにも反映したい場合>>>
/etc/skel/.bashrc に記述しておけば、今後の新規ユーザにも適用されます。
完了 ! 2003/10/13記述
dhcpのバージョンをアップ(dhcp-3.0.1rc13.tar.gz)
完了 ! 2004/05/19記述
Let's PC の Topに戻る
ホームページのTopに戻る