起稿 2006/05/25
更新 2007/08/03
DDNS サーバーに BIND 9 と GnuDIP を使い、クライアントに GnuDIP クライアントと
DynClient を使ってみます。
サーバーOS としては今回は(ちと古いが) RedHat7.2 を使用。
クライアントOS は Windows2000 Pro とします。
文体が堅かったりするのは、実際にやりながら一気に書き上げており、「内容が正しい」ことに重点を置いていますので、ご勘弁下さいませ。
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 内で変更することもできるが、ここではデフォルトのまま進める。
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を設定する。
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ファイルの中身に置きかえること。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 ファイルを置く。$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 #
とりあえず、こんな返事が返ってくれば動作はしているでしょう。
(解説)
ところで、# 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 を再起動する必要がある。
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 と同様。
以下は、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 中に含まれてるので、探してみるのも良いでしょう。
GnuDIP Client for Windows
http://gnudip2.sourceforge.net/dynclient/
というサイトに行くと、delphi 6 で作られた DynClient.zip という Windows
用のクライアントが置いてある。(ソースも置いてある)
実行形式をダウンロード・解凍すると、そのまま使える。
CGI でのアクセスになるので、上記リモートアクセスの設定以前の設定までで動作する。
Delphi7でソースからコンパイルすることにも成功したので、そのうちupするかも。
なお、コンパイルのためには ICS - Internet Component Suite も必要になる。
DDNSのクライアントとして有名な DiCE というモノがあります。
本当はこれを使って見たかったんですが、
インストールしてみてわかったこと:相手のサーバーが限定されている(選択肢はいっぱいあるけど)。
というわけで、自前のサーバーを相手にすることがどうやらできないらしい。
「違う!んなことない。自前サーバーでも使える」という報告があれば是非教えて下さい。