bird.dip.jp はフレッツ ADSL 回線につないだ FreeBSD(4.3R)機を 家サーバー・プロジェクト のダイナミックDNSサービスを利用させていただいた。 IP アドレスの設定には GnuDIPの スクリプトを用いている。 この GnuDIP クライアントの使い方はここでは省略。 IPアドレスは不定期に変更される可能性があり、その都度再設定が必要になり、 cron で定期的に登録するというのがもっとも安直な解決策ではあるが、 できれば実際に変更があったときのみに再登録するようにすべきだろう。
ダイナミックDNSでは登録情報の有効期間を短くすることでIPアドレスの変更に対応している。 しかしながらホスト側でのIPアドレスの変更をリアルタイムに検出して再登録したとしても、 それが即時に参照者に伝わるわけではない。 また、一般に動的IPアドレスを割り当てているDSLインターネット接続サービスでは24時間常時接続を 謳っていても、その間の接続が保証されている訳ではないし、 固定 IP アドレス割り当てがあっても、あまり当てにできるものではない。 つまり信頼性が求められるようなサービスに使用するのには元々向いていないのだ。 利用者はこの事を念頭に置いてサーバを運用するのが肝心である。
家サーバープロジェクトではダイナミック DNS サービスを提供しており、当サイトでもこのサービスを利用させていただいている。 なんといっても無料、というのが魅力だ。一時期、サービスが不安定なことがあったが、これはまぁ仕方ないところ。 無料だから信頼性が低くてよいというわけではないが、DNS 云々以前にダイナミック IP での運用で専用線と同じように考えるのが間違いである。 中にはここの DNS サービスを用いてメーリングリストの運営やネット通販、ホスティングサービスをしているサイトもあるようだが、ちょっと信じられない感覚だ。 DNS は別としても最低限、固定 IP アドレスを使用して運営すべきであろう。 家サーバープロジェクトの DDNS サービスを利用するにあたって私的な FAQ 集を用意してみた。
それはさておき、ここでは IP アドレスを自動的にダイナミック DNS サービスに登録する方法をメモしておく。 家サーバープロジェクトでは GnuDIP システムを採用しているので、ルータからグローバル IP を取得して GnuDIP 用登録プログラムに渡すことになる。
ADSL ルータ、ZyXEL Prestige 314 にはあらかじめ、ダイナミック DNS クライアント機能が装備されている。 ただし、使用できるダイナミック DNS サーバが www.ddns.org と www.dyndns.org に限られており、 これら以外のダイナミック DNS サーバを使うためには自前で登録作業をしなければならない。
そこで Prestige 314 から WAN 側のグローバル IP アドレスを取得して、前回のアドレスと違う場合にのみ GnuDIP プログラムを起動して再登録するようにする。 下記のプログラムはそれぞれの環境に合わせて調整する必要があるので注意。 特に GnuGIP の初期設定は済ませておくこと。 例によって無保証なので利用は各自の責任に委ねる。 私が実際に使っているものとは異なるし、エラーチェックもろくにしていない。
#!/usr/local/bin/perl # perl へのパスはシステムに合わせる # # check dynamin DNS and regist for ZyXEL Prestige 314 # using gdipc.pl # # 2001.08.25 masato at bird.dip.jp # # ZyXEL Prestige 314 から WAN の IP アドレスを得る sub globalip { my ($P314ip, $password) = @_; my $ip = ''; my $r; use Net::Telnet (); # Net::Telnet モジュール my $host = new Net::Telnet (Timeout => 10, Dump_Log => 'dump.log'); $host->open($P314ip); $host->waitfor('/Password: /'); $host->print($password); $host->waitfor('/Number:/'); $host->print("24"); $host->waitfor('/Number:/'); $host->print("8"); $host->waitfor('/P314>/'); # コマンドインタプリタモードのプロンプト、必要に応じて変更する。 # sleep(1); $host->print("ip ifconfig wanif0"); ($r) = $host->waitfor('/P314>/'); # print STDOUT "$r\n"; foreach $_ (split(/\n/, $r)) { if (/^\s+inet/) { my @a = split; $ip = $a[1]; substr($ip, -1, 1) = ''; # print STDOUT "IP:$ip\n"; } } $host->print("exit"); $host->waitfor('/Number:/'); $host->print("99"); $host->close(); return $ip; } $savefile = "/usr/local/DDNS/.PreIp"; # IP アドレスの保存ファイルのパス $CONFIG = "/usr/local/DDNS/gdip.conf"; # GnuDIP の設定ファイル my $preip, $nowip; # Prestige 314 から現在の WAN IP アドレスを得る $nowip =globalip("192.168.1.1", "hogehoge"); # Prestige 314 のローカル IP アドレスとパスワード # 設定済みの IP アドレスを保存ファイルから得る if (open INPUT, $savefile) { $preip=<INPUT>; close INPUT; } # IP アドレスが変更されていたら GnuDIP で再設定 if ($nowip ne $preip) { # set current IP to dynamic DNS print STDOUT "now:$nowip, pre:$preip\n"; system("/usr/local/DDNS/gdipc.pl -f $CONFIG"); # 現在の IP アドレスを保存 open (OUTPUT ,">$savefile"); print OUTPUT $nowip; close OUTPUT; } exit 0;
Prestige 314 から WAN 側の IP アドレスを得るには普通はメニューの 24.1 のシステムステータスを使うのだが、
ここでは 24.8 のコマンドインタプリタモードで ip ifconfig
コマンドを用いている。
下記のコマンド実行例で ###.###.###.### の部分が WAN 側の IP アドレスだ。
スクリプトでは空白文字 + inet で始まる行の 2 番目のワードを得る。
P314> ip ifconfig wanif0 wanif0: mtu 1500 inet ###.###.###.###, netmask 0xffffffff, broadcast 255.255.255.255 RIP RX:None, TX:None, [InOctets 606262582] [InUnicast 535213] [InMulticast 0] [InDiscards 0] [InErrors 0] [InUnknownProtos 0] [OutOctets 20363890] [OutUnicast 362911] [OutMulticast 0] [OutDiscards 0] [OutErrors 0]
これでグローバル IP アドレスをダイナミック DNS サーバに登録する準備ができたわけだが、 実はこれだけではネットへの接続が切れてしまったときに 0.0.0.0 になってしまったりするので、 その場合にはインターネット側に Ping を打って接続を確立するなどの処置が必要になる。 さらには cron ではなく、ルータの syslog から切断を検出して実行するのがベターだ。 このときに IP アドレスが変わっている可能性があるので、それを登録することになる。 それについては後述する。 ちなみに、これまでは毎回同じ IP アドレスが割り当てられている。
2002.01.29 - DNS サーバ自体のほうに障害が起きて登録が消えてしまうことがある。 上記の方法だけではこうした場合に対処できない。 これは現在の登録 IP アドレスの取得をローカルに保存した内容からではなく、 DNS を引いておこなうことで解決できそうだ。 ただし、その場合はチェック周期を短くすると DNS 情報が更新されないうちに何度も登録するようなことになってしまうので様子を見て調整するのがいいだろう。
Prestige 314 側での設定はマニュアルおよびブレーン社 http://www.brain-tokyo.jp/products/index.html のページ http://www.brain-tokyo.jp/products/P310/syslog.htmlを 見ていただくとして、FreeBSD 側の設定を。
FreeBSD 4.3R のデフォルトインストールで syslogd は -s オプション(secure mode)付で起動されており、 このままでは外部からの syslog を受け付けない。 さらに Prestige 314 では FreeBSD が期待しているのとは違うポートを使うので 次のように変更して起動する。
syslogd -a '192.168.1.0/24:*'
これは Class C の LAN(192.168.1.0/24) 内からの syslog を受け付けるというオプション。
* は任意の UDP ポートの使用を許可するということで、こうしないと Prestige 314 からの syslog をはじいてしまう。
-d のデバッグオプションを付けてみると、このあたりの動作が確認できる。
/etc/rc.conf
ではこのようにする。
syslogd_flags="-a 192.168.1.0/24:*"
Prestoge 314 での LOG Facility を Local 1 とした場合には
/etc/syslog.conf
で以下のようにして /var/log/zyxel.log に記録する。
あるいは、このごろの FreeBSD では送信元を判別してこのように書くこともできる。local1.* /var/log/zyxel.log
!P314 *.* /var/log/zyxel.log
いずれにしても他をどうにかしないと /var/log/message にも記録されてしまうのが煩いかも知れない。
例えば ADSL モデムの電源が切れたような場合には次のようなログが出力されて PPP リンクが閉塞したことの検出が可能だ。
Sep 7 01:14:35 P314 P314: board 0 line 0 channel 0, call 9, C02 Call Terminated Sep 7 01:14:35 P314 P314: ppp:LCP Closing Sep 7 01:14:35 P314 P314: ppp:IPCP Closing
PPP リンクを確立するときには LCP Starting から始まり、IPCP Opening で IP 通信が可能。
Sep 7 19:38:49 P314 P314: ppp:LCP Starting Sep 7 19:38:49 P314 P314: ppp:LCP Opening Sep 7 19:38:52 P314 P314: ppp:PAP Opening Sep 7 19:38:52 P314 P314: ppp:IPCP Starting Sep 7 19:38:52 P314 P314: ppp:IPCP Opening
したがって、このログのキーワードを検出してアクションを起こすことができる swatch のようなツールを用いて 次のような手順で PPP 接続の再確立とダイナミック DNS の再設定をおこなえばよいだろう。
ルータでアイドルタイムアウトを設定しているような場合にはこの手順で再び PPP 接続が確立する。 しかしながら ADSL モデムの電源断、再投入ではこれがうまくゆかないことがある。 プロバイダでの障害や工事とその復旧時も同様だ。 グローバル IP アドレスが変更される可能性が高いのはこのような時なので肝心の時に役に立たない。
当サイトで使用している xDSL 対応ブロードバンドルータの ZyXEL 社 Prestige 314 である。 なぜか国内ではそれほどメジャーな存在ではないようだ。選択の基準となるのは性能、機能、 価格と様々だが、比較的安価でパケットフィルター機能などが充実し、telnet での詳細設定、 syslog 対応と言うことが決め手となった。
国外での製品レビューを。
hardCOREware
http://www.hardcoreware.net/reviews/networking/zyxel_prestige_314/1.htm
「比較的安価で、性能、セキュリティ機能も家庭や小規模オフィス用とに充分である。 設定は少しわかりにくく、WEB 設定では簡単なことしかできないので中上級者向け。」 というのが一般的な評価のようだ。
Dynamic IP での家サーバーとは言え、接続できない時間を最小にして安定運用をしたい。 そのための覚え書き。
ルータによってはデフォルトで通信のない時間が続くと接続が切れるようになっているので、この機能はオフにする。基本中の基本。
ADSL では電話回線に旧式の保安器が使用されていると接続が切れることが多い。 これは NTT でも周知の事実である。旧式と言っても新型が採用されているのはここ数年のことらしい。 プロバイダや局舎の工事以外に原因不明の切断があるときは、これを疑おう。 電話の着信で切れるような場合には、まず間違いない。 当サイトでは Flet's ADSL 8M 化の際に交換したが、それ以降は原因不明の切断は起きていない。 ADSL よりは有線放送や CATV、さらには光回線のほうが回線的には有利だろう。
本格的な UPS は大変高価であるが、小容量のものなら割と安価に入手できるようになった。 ADSL モデムとルータはともかく、サーバの電源がいきなり切れると場合によってはシステムが破壊されることもある。 当サイトではノート PC をサーバにして小容量の UPS と組み合わせている。 これで瞬断程度には対処できる。 ノート PC 自体は特に 2.5 インチ HDD の信頼性に不安があるので交換用のディスクまたは代替機を用意しておくに越したことはない。
普段からログやシステム情報をチェックするようにしよう。 システムの正常な状態を把握し、不正アクセスの傾向を知っておくことで不測の事態に備える。
何はともあれ、ネットから切り離す。再接続は単にシステム復旧だけでなく、対策を施してからにする。 一度クラッキングされたら、穴があると思われ何度も狙われると認識すべきだ。
家サーバー・プロジェクト
http://ieserver.net/
GnuDIP
http://gnudip.cheapnet.net/
GnuDIP クライアント用 Perl スクリプト
ftp://ftp.cheapnet.net/pub/gnudip/gdipc.pl
ZyXEL Prestige 314 (株式会社ブレーン)
http://www.brain-tokyo.jp/products/P314/index.html
プレステージ掲示板(株式会社ブレーン)
http://www.brain-tokyo.jp/products/bbs/chamber.cgi?template=frame.hct&DB=prestige
株式会社ブレーン
http://www.brain-tokyo.jp/
ZyXEL Prestige 314 (Zyxel)
http://www.zyxel.com/
http://www.zyxel.com/support/supportnote/p314/
hardCOREware
http://www.hardcoreware.net/
TECHGROUND
http://www.techgrounds.com/
swatch
http://www.oit.ucsb.edu/~eta/swatch/