グローバル側がDHCPのルータを使うサーバ

このページでは、ルータ経由でダイナミックDNSのIPをGnuDIPで設定する方法 の一例を示します。GnuDIPは、DHCPでグローバルIPを割り当てられるマシン 自体で動かすことを想定していますので、通常はルータを介したサーバのIPを 割り当てることができません。http://ai-line.com/さんの ルーターを使わないサーバー を参照している時に思いつきました。

使用機器、サービスおよびソフトウェア

必要条件

ルータのログを別のマシンに転送できること。

と書きましたが、11月6日からADSL環境になりましたので、ADSLモデムとなり、 この方法が使えな くなりました。 で、結論から言うとログが取れなくても wget を使えればなんとかなります。 (2001.11.7追加 後述)

dyndns.org のサービスを使うという手もあります。 (2001.11.7追加 後述)

ここではグロー バル側はDHCPでグローバルIPを割り当て、ローカル側は固定プライベートIPと して既に設定してあり、正常に動作しているところから始めます。 まず、firewall のログを server に転送する設定をします。

GnuDIPの導入

次に、GnuDIP クライアントgdipc.plを ここからもらってきます。 たとえば、serverの/usr/DDNSディレクトリにこのファイルを置きます。 /var/log/messages は root さんしか参照できないので、以下はrootで作業し ます。 ダイナミックDNSサーバは上記 ieserver.net とします。
# cd /usr/DDNS
# chmod 700 gdipc.pl
# perl gdipc.pl -c
New Username: 登録したユーザ名
New Password: 登録したパスワード
New Password Again: もう一度
Domain: 選択したドメイン名
New GnuDIP Server: 登録したDDNSサーバ(今回はieserver.net)
これで /root/.GnuDIP2 というファイルができますから、/usr/DDNSにコピー します。
# cp /root/.GnuDIP2 /usr/DDNS
ルータ経由でない場合は単に
perl gdipc.pl
で使えるようになりますが、間にルータが入っている場合はそうは行きません。

DHCPで得たグローバルIPをDDNSに反映させる

ここから本題です。まず、IP_Get.pl を ダウンロードして、 先ほどの/usr/DDNSに置きます。パーミッションを変えます。
# cd /usr/DDNS
# chmod 700 IP_Get.pl
IP_Get.pl を使っているログの形式に合わせて変更します。以下はログの形式が
Oct 19 18:59:10 firewall dhcpc[91]: Got DHCPACK (IP = XXX.XXX.XXX.XXX, duration = 86400 secs)
の場合です。 たとえば以下の通りに変更します。
※以降は説明のための注釈ですので入力しないでください。
※1の部分は不具合が見つかるたびに修正しています。_(._.)_ぺこっ
ちなみに修正履歴は
cat /var/log/messages | grep DHCPACK 
ログの中に複数行ある場合、一番古いものになってしまったので以下に変更
cat /var/log/messages | grep DHCPACK | tail -1
ログがローテートされると空っぽになってしまうので以下に変更
cat /var/log/messages.1 /var/log/messages | grep DHCPACK | tail -1

#!/usr/bin/perl ※ perl へのパス
#
$O_IP = '/usr/DDNS/IP.dat'; ※ ファイルを置く位置
$IP = '/usr/DDNS/N_IP.dat'; ※ ファイルを置く位置

system("cat /var/log/messages.1 /var/log/messages | grep DHCPACK | tail -1 >$IP"); ※1 今回のポイント 
open(INPUT,$IP);
	$c = <INPUT>;
	$start = index($c,"IP = ")+5; ※ DHCPACKで貰えたIPの前の文字列
	$end = index($c,", duration"); ※ DHCPACKで貰えたIPの後の文字列
	$New_IP = substr($c,$start,($end-$start));
close(INPUT);

open (OUTPUT ,">$IP");
print OUTPUT $New_IP; 
close OUTPUT;

open INPUT,"$O_IP";
$Old_IP=<INPUT>;
close INPUT;

if ($New_IP ne $Old_IP) {
	open (OUTPUT ,">$O_IP");
	print OUTPUT $New_IP;
	close OUTPUT;

	print"Dynamic DNS => $New_IP\n";

	system("/usr/DDNS/gdipc.pl -f /usr/DDNS/.GnuDIP2"); ※ パスに合わせて変更
}

ルータからログが取れない場合

ログが取れない場合でもなんとかなります。http://upsys.de/dyndns/check_ip.php3にブラウザからアクセスするとわかります。(^.^;;) wget が使えるなら、これを使わない手はありません。
(cd /usr/DDNS; wget http://upsys.de/dyndns/check_ip.php3)
とでもして、ローカルに自分の情報を持ってきましょう。 check_ip.php3 というファイルができていますから、 ログの代わりにこれを使えばいいですね。どんな感じか例を示します。
<html><head><title>Current IP Check</title></head>

<body bgcolor=white text=black>
Current IP Address: 210.XXX.YYY.ZZZ
<br>Hostname: xyz.ppp.abc.defgh.jp
</body></html>

ルータからログが取れない: dyndns.orgを使う場合

dyndns.org を使う場合には、python で書かれた ipcheck.py というユーティ リティがありますから、これを使うこともできます。 これはいろいろなページに設定例があります。 DynDNSの使い方 にはDynDNSへの登録方法などが説明されています。 chmodx.dyndns.orgの秘密 にはipcheck.pyの設定例があります。

このあたりまで来ると、もういろいろな合わせ技でなんとでもなりますね。 (^◇^)

自動IP変更検出と設定

最後にcrontab に定期的にIP_Get.pl を動かす記述を行います。viの操作を知 らないと困りますので練習しておいてください。 root で crontab -e を実行します。
*/10 * * * * /usr/bin/perl /usr/DDNS/IP_Get.pl
の行を付け加えて保存します。crontab -l で設定を確認します。 これで10分おきにIPをチェックしてくれます。 IP.dat と N_IP.dat の内容が異なればDDNSサーバに通知します。
Kerochanさんから、SNMP と swatch を使う方法を教えて頂きました。現在の 私の環境では、SNMPは適用できそうもありませんので、swatch について後ほど方法を記述する予定です。 こちらの方がcronを動かすより効率が良さそうです。ありがとうございました。 swatch ですが、インターネットで検索した方がインストールなど懇切丁寧な ページがあるので省略します。.swatchrc だけ以下に示します。
#
watchfor /DHCPACK/
exec /usr/DDNS/IP_Get.pl
mail=masuda@im.dendai.ac.jp

リダイレクトポート

Firewall Personal のリダイレクトポート機能を使うと、firewall へのアク セスをserverに送りつけることができます。 私は、HTTP、SSH、SMTPをリダイレクトしました。
proto  target IP       port   alias IP        port   remote IP       port  
------ --------------- ------ --------------- ------ --------------- ------
tcp    192.168.0.XXX   80     (null)          80     (null)          (null)
udp    192.168.0.XXX   80     (null)          80     (null)          (null)
tcp    192.168.0.XXX   22     (null)          22     (null)          (null)
udp    192.168.0.XXX   22     (null)          22     (null)          (null)
tcp    192.168.0.XXX   25     (null)          25     (null)          (null)
firewall にログインして、
configure nat redirect-port add プロトコル serverのIP:ポート番号 エイリアスポート番号
の形で設定します。たとえば、HTTP は、
configure nat redirect-port add tcp 192.168.0.XXX:80 80
configure nat redirect-port add udp 192.168.0.XXX:80 80
とします。その後、write して rebootします。
2001年10月19日より現在までのアクセス数:
前のページにもどる。
masuda@im.dendai.ac.jp