ダイナミックDNSサーバとDHCPで楽々ネットワークユーザ管理

 たくさんのクライアントを抱えていくと、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に戻る