bird.dip.jp home > computing > ダイナミックDNS >

ダイナミック DNS の設定

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 用登録プログラムに渡すことになる。

ZyXEL Prestige 314 用スクリプト

ADSL ルータ、ZyXEL Prestige 314 にはあらかじめ、ダイナミック DNS クライアント機能が装備されている。 ただし、使用できるダイナミック DNS サーバが www.ddns.orgwww.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 情報が更新されないうちに何度も登録するようなことになってしまうので様子を見て調整するのがいいだろう。

FreeBSD での Prestige 314 用 syslog 設定

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 に記録する。

  local1.*		/var/log/zyxel.log
あるいは、このごろの FreeBSD では送信元を判別してこのように書くこともできる。
  !P314
  *.*		/var/log/zyxel.log

いずれにしても他をどうにかしないと /var/log/message にも記録されてしまうのが煩いかも知れない。

syslog から WAN の切断を検出する

例えば 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 の再設定をおこなえばよいだろう。

  1. syslog で IPCP Closing を検出したら WAN 側に ping 発行する。
  2. 同じく IPCP Opening を検出したら、上述のダイナミック DNS 設定スクリプトを走らせる。

ルータでアイドルタイムアウトを設定しているような場合にはこの手順で再び PPP 接続が確立する。 しかしながら ADSL モデムの電源断、再投入ではこれがうまくゆかないことがある。 プロバイダでの障害や工事とその復旧時も同様だ。 グローバル IP アドレスが変更される可能性が高いのはこのような時なので肝心の時に役に立たない。

ZyXEL Prestige 314 について

当サイトで使用している xDSL 対応ブロードバンドルータの ZyXEL 社 Prestige 314 である。 なぜか国内ではそれほどメジャーな存在ではないようだ。選択の基準となるのは性能、機能、 価格と様々だが、比較的安価でパケットフィルター機能などが充実し、telnet での詳細設定、 syslog 対応と言うことが決め手となった。

国外での製品レビューを。

hardCOREware
http://www.hardcoreware.net/reviews/networking/zyxel_prestige_314/1.htm

TECHGROUND
http://www.techgrounds.com/display.asp?page=reviews/ZyXEL.Prestige.314/default.asp&title=ZyXEL+Prestige+314+Review

「比較的安価で、性能、セキュリティ機能も家庭や小規模オフィス用とに充分である。 設定は少しわかりにくく、WEB 設定では簡単なことしかできないので中上級者向け。」 というのが一般的な評価のようだ。

安定運用のために

Dynamic IP での家サーバーとは言え、接続できない時間を最小にして安定運用をしたい。 そのための覚え書き。

リンク

家サーバー・プロジェクト
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/


bird.dip.jp home > computing > ダイナミックDNS >
last updated on 2002.07.18. since 2001
email:masato at bird.email.ne.jp