GnuDIP で DDNS (Dynamic DNS)

起稿 2006/05/25
更新 2007/08/03

DDNS サーバーに BIND 9 と GnuDIP を使い、クライアントに GnuDIP クライアントと DynClient を使ってみます。
サーバーOS としては今回は(ちと古いが) RedHat7.2 を使用。
クライアントOS は Windows2000 Pro とします。

文体が堅かったりするのは、実際にやりながら一気に書き上げており、「内容が正しい」ことに重点を置いていますので、ご勘弁下さいませ。


GnuDIP のインストール

GnuDIP Dynamic DNS のサイト http://gnudip2.sourceforge.net/ に行く。
http://gnudip2.sourceforge.net/gnudip-www/src/ から、gnudip-2.3.5.tar.gz をダウンロードする。
GnuDIP は、ちまちまと修正されているようだが、しばらく前からバージョン番号が変更されていない。
本日(2006/05/25)時点でのタイムスタンプは10-Sep-2003 18:11である。
今後もバージョン番号が変わらずにタイムスタンプだけが変わる可能性があるので、注意が必要かも。

gnudip-2.3.5.tar.gz を /usr/local/src に置いて展開する。

# tar zxf gnudip-2.3.5.tar.gz

展開されてできたディレクトリに移動

# cd gnudip-2.3.5

gnudip というディレクトリがあるので、丸ごと /usr/local に移動(またはコピー)する。

# mv gnudip /usr/local

または

# cp -a gnudip /usr/local

コピーする場合は、gnudip/etc/ ディレクトリ以下の所有者を変更しないように気をつける。
デフォルトで nobody:nobody になっている。(RedHat7.2だとそう見えると言った方がいいのかも)

gnudip ディレクトリに移動する。

# cd /usr/local/gnudip

データベースを用意するが、今回は単純に Linux ファイルシステムを使う"flat file"データベースとする。
その気なら本格的に PostgreSQL や MySQL も使えるが、ここではそれらの設定については記述しない。
/usr/local/gnudip/lib/dbprefs.pm と /usr/local/gnudip/lib/dbusers.pm というシンボリックリンクがあるので、削除する。
デフォルトでは、これらは /usr/local/gnudip/lib/dbprefs_mysql.pm と /usr/local/gnudip/lib/dbusers_mysql.pm にリンクされており、MySQL を使う設定になっている。

# cd lib
# rm dbprefs.pm dbusers.pm

リンクを張り直す。

# ln -s dbprefs_flat.pm dbprefs.pm
# ln -s dbusers_flat.pm dbusers.pm

デフォルトでは、dbprefs_flat.pm は、/usr/local/gnudip/run/database/globalprefs というファイルを使い、
dbusers_flat.pm は /usr/local/gnudip/run/database/users というディレクトリを使うようになっている。
/usr/local/gnudip/run/database と /usr/local/gnudip/run/database/users というディレクトリは既に存在して所有者も設定されているはずなので、確認する。nobody:nobody になっていればOK。
(Apache が CGI を動作させる場合のユーザーとする)
これらのディレクトリ名は、 /usr/local/gnudip/etc/gnudip.conf 内で変更することもできるが、ここではデフォルトのまま進める。


DNS Server 設定準備

BIND の古いバージョンで、DDNS に対応していないものを使っている場合は、バックエンドスクリプトを設定すれば大丈夫らしいが、ここでは説明を省く。
RedHat7.2 では BIND9 なので、これを前提に作業を進める。
まず、nsupdate コマンドで必要とされる key ファイルを生成する。
BIND 9 では key ファイルを作るのに"dnssec-keygen"を使う。
(例)
適当な空のディレクトリにて

# dnssec-keygen -a hmac-md5 -b 128 -n HOST gnudip-key
Kgnudip-key.+157+46170
# ls
Kgnudip-key.+157+46170.key Kgnudip-key.+157+46170.private
# cat Kgnudip-key.+157+46170.private
Private-key-format: v1.2
Algorithm: 157 (HMAC)
Key: fegHlhVt3opPIiK8V4cjLw==
# cat Kgnudip-key.+157+46170.key
gnudip-key. IN KEY 513 3 157 fegHlhVt3opPIiK8V4cjLw==

上記で言う fegHlhVt3opPIiK8V4cjLw== の部分が実際の key である。
これらの key ファイルは後で使うので、所有者を nobody:nobody とした上で /usr/local/gnudip/etc に置いておく。

# chown nobody:nobody Kgnudip-key.+157+46170.key Kgnudip-key.+157+46170.private
# mv Kgnudip-key.+157+46170.key Kgnudip-key.+157+46170.private /usr/local/gnudip/etc/

デフォルト状態では、すでにこれらの key ファイルのサンプルが存在するが、それらはすべて削除した上で新たに作り直す必要がある。

/usr/local/gnudip/etc/gnudip.conf ファイルに記述されている nsupdate コマンドのパラメータを変更する。
BIND 9 の場合、

# BIND nsupdate command
nsupdate = /usr/bin/nsupdate -v -k /usr/local/gnudip/etc/Kgnudip-key.+157+46170.private

または分割して以下のように記述する。(デフォルトではこちらの書き方になっている)
複数行に分割して書かれていても、実行時には連結される。

# BIND nsupdate command
nsupdate = /usr/bin/nsupdate -v
nsupdate = -k /usr/local/gnudip/etc/Kgnudip-key.+157+46170.private

BIND 9 の設定

いよいよBINDを設定する。
gnudip-keyfile というファイルを named の設定ディレクトリに作成する。
その場所は、/etc/named.conf に書いてある。

options {
	directory "/var/named";
};
という記述がある。この場合は /var/named というディレクトリに gnudip-keyfile を作る。内容は、
key gnudip-key {
	algorithm hmac-md5;
	// the TSIG key
	secret "fegHlhVt3opPIiK8V4cjLw==";
};
最後の行のfegHlhVt3opPIiK8V4cjLw==という部分は、上記で実際に作成したkeyファイルの中身に置きかえること。
また、gnudip-keyfile ファイルの所有者は、named:named とすること。

named のダイナミック zone を GnuDIP が使えるように設定する。
named.conf に以下の記述を加える。

// include definition of GnuDIP update key
include "gnudip-keyfile";

// define GnuDIP dynamic DNS zone
zone "you.net" in {
        type master;
        file "run/you.net";
        allow-query { any; };
        update-policy { grant gnudip-key subdomain you.net; };
};
上記 run/ の部分は、/var/named/run/ を意味しているが、ここには DDNS 専用の zone ファイルを置く。
run/ ディレクトリの所有者はnamed:named にしておくことで、named がアクセスできるようになる。
注:gnudip-key というのは、gnudip-keyfile に書かれている key の名前を参照している。

run/you.net というファイルには、初期設定値として以下のような記述をしておく。
$TTL 86400 ; default TTL (1 day)
@       IN SOA   ns.you.net. root.you.net. (
                0       ; serial
                3600    ; refresh (1 hour)
                1800    ; retry (30 minutes)
                604800  ; expire (1 week)
                0       ; TTL for NACK-s (0 seconds)
        )
        NS    ns.you.net.
$ORIGIN you.net.
ns      A       IP_address

IP_address には、このサーバーの実際のIPアドレスを書いておく。
このファイルの所有者は named:named としておく。

named を再起動する。

# service named restart

ここで再起動に失敗するようなら、/var/log/messages など、ログファイルを調べること。
私の場合、gnudip-keyfile の名前を gnudip.keyfile に間違えていたり、
gnudip-keyfile の所有者をnamed:named にするのを忘れたなどで一発では再起動できなかった。

ともあれ、これで named の設定は完了したはず。
一応、テストしてみる。

# dig tester.you.net. soa

; <<>> DiG 9.1.3 <<>> tester.you.net. soa
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 34673
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;tester.you.net.            IN      SOA

;; AUTHORITY SECTION:
you.net.      0             IN      SOA     you.net. root.you.net. 484 3600 1800 604800 0

;; Query time: 8 msec
;; SERVER: 192.168.0.2#53(192.168.0.2)
;; WHEN: Tue Oct 23 14:47:24 2001
;; MSG SIZE  rcvd: 88
# su - nobody
# /usr/bin/nsupdate -v -k /usr/local/gnudip/etc/Kgnudip-key.+157+46170.private
> update add tester.you.net. 0 A 127.0.0.1
>
> quit
# exit
# ping tester.you.net.
PING tester.you.net (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.2 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.1 ms

--- tester.you.net ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.1/0.1/0.2 ms
#

とりあえず、こんな返事が返ってくれば動作はしているでしょう。
(解説)

  1. # dig tester.you.net. soa で、tester という名前のホストを捜してみるけど、ない。
  2. その後、nobody アカウントで、nsupdate を実行し、tester に 127.0.0.1 というアドレスを設定する。
  3. ping の相手に名前を指定して応答が返ってくる。

ところで、# su - nobody を実行すると、RedHat7.2 の場合、"This account is currentry not available."と言われるかもしれないので、 その場合は以下のように一気にコマンドを実行してみることをお勧めします。

# sudo -u nobody /usr/bin/nsupdate -v \
            -k /usr/local/gnudip/etc/Kgnudip-key.+157+46170.private

ちなみに、上記で追加した tester.you.net. のエントリを削除するには、同様に

> update delete tester.you.net.

と実行すればよい。

注意:run/you.net ファイルを修正したら、"0 ; serial" の数値を必ず増加させること。
その後 run/you.net.jnl ファイルを(存在したら)削除してから named を再起動する必要がある。


Apache Web Server の設定

RedHat7.2 の場合は、/etc/httpd/conf/httpd.conf ファイルを編集する。
通常の CGI でアクセスする場合は、以下の記述を追加する。

Alias /gnudip/html/ /usr/local/gnudip/html/
<Location gnudip/html/>
Options Indexes
ReadmeName .README
HeaderName .HEADER
RemoveHandler .pl
RemoveType .pl
AddType text/plain .pl
</Location>
ScriptAlias /gnudip/cgi-bin/ /usr/local/gnudip/cgi-bin/

編集したら Apache を再起動する。

# service httpd restart

この場合の Web Tool でのアクセス URL は、http://yourserver/gnudip/cgi-bin/gnudip.cgi となる。
Login 画面が表示されればとりあえずOK。


管理者の設定

gnudip/sbin/gdipadmin.pl というプログラムを使って管理者を設定する。
単純に help を実行してみると、

# su nobody
$ ./gdipadmin.pl -h
usage: gdipadmin.pl [ -h | [ -u ] userid password ]
usage: Add GnuDIP administrative user "user" with password "password".
usage: -h: Print this usage message.
usage: -u: Update user if it already exists.

となる。言われるままに管理者のアカウントを作成する。
これで、

http://yourserver/gnudip/cgi-bin/gnudip.cgi

からログインすると、管理者画面が現れる。
管理者画面の中に、Administrative Settings というボタンがあるので、押してみると、設定項目がいっぱいあるのがわかる。
  ここでは、Require and validate E-mail address のチェックを外しておいた方が楽かも。(必要なら後で変更すればよし)

とりあえず、Add User ボタンを押して、クライアントから登録するためのホスト名、ドメイン名、パスワードなどの設定をする。
GnuDIP Client for Windowsからアクセスするのであれば、サーバー側の設定はここでおしまい。


リモートアクセスの設定

GnuDIP クライアントからリモートアクセスできるようにする。
(クライアントの設定で、Connect by direct TCP (d) or web server (w) [d]:に"d"と答える場合)

/etc/services ファイルに以下の記述を追加。

gnudip          3495/tcp

RedHat7.2 では xinetd を使っているので、/etc/xinetd.d/ に gnudip という名前のファイルを置く。内容は以下の通り。

service gnudip
{
        flags       = REUSE
        socket_type = stream
        protocol    = tcp
        wait        = no
        user        = nobody
        server      = /usr/local/gnudip/sbin/gdipinet.pl
        bind        = 0.0.0.0
        only_from   = 192.168.0.0/24
        only_from   += 127.0.0.1
        only_from   += 24.64.0.0/13
        only_from   += 64.5.210.224/31
        only_from   += 64.5.221.128/27
}

"only_from"の部分については自分の環境に合わせて適宜設定する。
user = nobody とあるが、これは Apache CGI の実行ユーザーと同じにすること。
TCP wrapper が有効なら、 /etc/hosts.allow に以下のような記述をすること。

gdipinet.pl: 24.64.0.0/255.248.0.0        \
             64.5.210.224/255.255.255.232 \
             64.5.221.128/255.255.255.160

古いバージョンでは、以下の記述にする必要があるかもしれない。

gnudip: 24.64.0.0/255.248.0.0        \
        64.5.210.224/255.255.255.232 \
        64.5.221.128/255.255.255.160

上記の "only_from"をきちんと書いてあるなら、

gdipinet.pl: ALL

または、(古いバージョンでは)

gnudip: ALL

と、書いておけばよい。

ちなみに、inetd を使っているシステムでは、/etc/inetd.conf に以下の記述をする。

gnudip	stream	tcp	nowait	nobody	/usr/sbin/tcpd	/usr/local/gnudip/sbin/gdipinet.pl

区切り文字は空白ではなく、Tabであることに注意。nobody は、Apache CGI の実行ユーザーと同じにすること。
/etc/hosts.allow の記述については xinetd と同様。


GnuDIPクライアントのインストール

以下は、Windows2000 pro での例。
http://gnudip2.sourceforge.net/gnudip-www/latest/gnudip/html/client/Windows_standalone/ サイトから
gnudip-2.3.5-gdipc-sa.exe をダウンロード。(perl を含んでいるので、別途 Active Perl を用意する必要がない)
自己解凍形式なので、ダブルクリックして解凍。gdipc というフォルダができるので、C:\ に移動。
コントロールパネル→システム→詳細→環境変数 で、システム環境変数の PATH に C:\gdipc を設定追加する。
コマンドプロンプトにて、
C:\>gdipc -c
を実行。

C:\>gdipc -c
Using Update Configuration Mode
Configuration file name: C:/GDIPC/gdipc.conf.txt
Username: tester
Domain: gnudip
Connect by direct TCP (d) or web server (w) [d]:
GnuDIP Server - host[:port]: gateway
Password: tester
Cache File [C:/GDIPC/gdipc.cache.tester.gnudip.txt]:
Minimum Seconds Between Updates [0]:
Maximum Seconds Between Updates [2073600]:

とまあ、こんな感じ。
サーバー側を更新するには、

C:\>gdipc
====  gdipc.pl running:  Mon Jun  4 17:59:19 2001  ====
Configuration file name: C:/GDIPC/gdipc.conf.txt
Cache file name: C:/GDIPC/gdipc.cache.tester.gnudip.txt
No update done for tester.gnudip - 192.168.0.4 still valid
Cache file name: C:/GDIPC/gdipc.cache.tester2.gnudip.txt
Invalid login attempt for tester2.gnudip

この例では更新は失敗している。
Maximum Seconds Between Updates [2073600] を経過しておらず、同一 IP アドレスなので更新しないというメッセージが表示されている。

定期的に実行するためには、タスク・スケジューラーで設定しておく。

実は、クライアント側も gnudip-2.3.5.tar.gz 中に含まれてるので、探してみるのも良いでしょう。


GUI版クライアントのインストール

GnuDIP Client for Windows
http://gnudip2.sourceforge.net/dynclient/
というサイトに行くと、delphi 6 で作られた DynClient.zip という Windows 用のクライアントが置いてある。(ソースも置いてある)
実行形式をダウンロード・解凍すると、そのまま使える。
CGI でのアクセスになるので、上記リモートアクセスの設定以前の設定までで動作する。

Delphi7でソースからコンパイルすることにも成功したので、そのうちupするかも。
なお、コンパイルのためには ICS - Internet Component Suite も必要になる。


DiCEについて

(更新:2007/08/03)

DDNSのクライアントとして有名な DiCE というモノがあります。
本当はこれを使って見たかったんですが、
インストールしてみてわかったこと:相手のサーバーが限定されている(選択肢はいっぱいあるけど)。
というわけで、自前のサーバーを相手にすることがどうやらできないらしい。

「違う!んなことない。自前サーバーでも使える」という報告があれば是非教えて下さい。


忙しくてなかなか更新できませんが、 最近、げんきさんという方から連絡がありまして、DiCEで更新できたとの報告を頂きました。
私自身が試してみる時間が取れないので、取り急ぎ、げんきさんの記述をそのまま引用しておきます。
−−−以下引用−−−
プラグインファイルの中のMethodがGNUDIP23になってるやつを書き換えて、
Script=以降のURLを、GnuDIPのSet Quick Login URLで出来るURLに対応させて書き換えると、
とりあえず更新は出来ました。

Windows版でやりましたけど、Linux版でもプラグインファイルのフォーマットは同じみたいです。
−−−引用ここまで−−−
詳細は、http://blog.genkikko.net/2007/08/dice.phpを参照ください。


有限会社かさい電算工房 取締役 笠井 宗