ライン

ポイント:ダイナミックDNSサーバをたてる

ライン

 はじめに

dns/dhisd

 固定IPアドレスではないマシンに、外出先からアクセスしたい場合に名前を解決させる方法としてDDNS(ダイナミックDNS)という方法で実現することができます。以前DHISの設定をチャレンジして、良くわからずに放置。その後、すっかり作業を忘れていましたが、久々に設定をやり直してみることにしました。(voyager.gr.jpの三瓶さんのところでは動作しているのを見ていましたが、いまいち理解できていませんでした)

 今回は、FreeBSD 5.5とFreeBSD 7.2の環境で試しています。
現在のportsでは、最新の版で利用できなかったので、自分で修正して導入する方法をとってあります。

 導入と設定

導入

 上記に書きました通り、portsのメンテナンスが更新されていない状態で、dhisd-3.1のままになっているようでした。
現行バージョンが、dhisd-5.5.tar.gz なので試用ということで試すこととし、dns/dhisd55 という私製portsで入れてみることにします。

ちょっと乱暴なやり方になりますが、導入を開始します。

# cd /usr/ports/dns
# cp -pr dhisd dhisd55
# cd dhisd55

  ここで、Makefile の中身をバージョンにあうように修正し、make makesumしています。
これにより、distinfoは更新されました。値は以下の通りです。

MD5 (dhisd-5.5.tar.gz) = fd0ef833db2094c0398eb406b01a0435
SHA256 (dhisd-5.5.tar.gz) = 736352209b18fb3b95a82782ddbf2fb524c0e9019ca11ba525a22f97f41936d3
SIZE (dhisd-5.5.tar.gz) = 26221

 このままではパッチが当たるわけもないので、準備としての make extract で中身を眺めてみることにしました。
展開された一覧は以下の通りでした。

-rw-r--r--  1 root  wheel     89 May 22  2008 CONTRIBUTORS
-rw-r--r--  1 root  wheel   1328 May 22  2008 COPYRIGHT
-rw-r--r--  1 root  wheel   9606 May 22  2008 INSTALL
-rw-r--r--  1 root  wheel   3523 May 22  2008 Makefile
-rw-r--r--  1 root  wheel  11936 May 22  2008 README
-rw-r--r--  1 root  wheel   2455 May 22  2008 WHATSNEW
-rw-r--r--  1 root  wheel   8234 May 22  2008 ddb.c
-rw-r--r--  1 root  wheel   2201 May 22  2008 ddb.h
-rw-r--r--  1 root  wheel    954 May 22  2008 dhis.db.sample
-rw-r--r--  1 root  wheel    706 May 22  2008 dhisd.conf.sample
-rw-r--r--  1 root  wheel   3535 May 22  2008 dhisd.h
-rw-r--r--  1 root  wheel    362 May 22  2008 dhisd.rc
-rw-r--r--  1 root  wheel   1943 May 22  2008 genkeys.c
-rw-r--r--  1 root  wheel   7440 May 22  2008 main.c
-rw-r--r--  1 root  wheel   3479 May 22  2008 misc.c
-rw-r--r--  1 root  wheel   1562 May 22  2008 misc.h
-rw-r--r--  1 root  wheel  22746 May 22  2008 network.c
-rw-r--r--  1 root  wheel   3479 May 22  2008 network.h
-rw-r--r--  1 root  wheel   2637 May 22  2008 nsupdate.c
-rw-r--r--  1 root  wheel   1617 May 22  2008 nsupdate.h
-rw-r--r--  1 root  wheel   7637 May 22  2008 online.c
-rw-r--r--  1 root  wheel   1902 May 22  2008 online.h
-rw-r--r--  1 root  wheel   6154 May 22  2008 qrc.c
-rw-r--r--  1 root  wheel   1709 May 22  2008 qrc.h

 フラットに展開して、そんなに対象となるコードが少ないのを見て安心しました。
ファイル INSTALL に導入方法が細やかに記述されていました。
この程度なら、portsじゃなくても手動でやればいいじゃん、とは思ったのですが、以降同様の作業をする都度思い出すのも面倒で、作業は継続しました。

 MySQL連動がdhisd-5.4のバージョンからサポートされたようです。これはオプション的なものみたいで、MySQLなしでも問題ないとのことです。今回のマシンには、MySQLは動作していますが、使わない形で実施にしました。

 pkg-plist は元々何も書かれていない形のportsになっていましたので同じ方針にします。pkg-descr は内容が古いけど、どうでもいいので無視しました。(後に tarballにしてありますので、同じ作業はしないで大丈夫です)

 filesの中身は、INSTALL.bsdを残し、その他は削除。同ファイルの内容は、今回作成している内容とは時代が異なるので参考程度です。
実際には、portsのMakefileをあまり修正したくなかったという意味合いで残っているというのが本音だったかも知れません。

 さて、Makefile ですが、修正しつつで作っていきます。
gmpは同様の依存関係。DOCFILESは、MODULEを消して、WHATSNEWを加える程度の修正。
post-patchはやっていることはわかるので、後に修正することにして、3行コメントとしました。

# make
===>  Patching for dhisd-5.5
===>   dhisd-5.5 depends on shared library: gmp.7 - found
===>  Configuring for dhisd-5.5
===>  Building for dhisd-5.5
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c qrc.c
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c misc.c
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c nsupdate.c
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c ddb.c
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c network.c
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c online.c
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c main.c
gcc -L/usr/local/lib -o dhisd qrc.o misc.o nsupdate.o ddb.o network.o online.o -lgmp main.o
gcc -O3 -Wall -Wstrict-prototypes -Wpointer-arith  -Wno-sign-compare -Wno-traditional -Wreturn-type -Wswitch -Wshadow  -Wwrite-strings -Wextra -funsigned-char -I. -I/usr/local/include -c genkeys.c
gcc -L/usr/local/lib -o dhisgenkeys qrc.o -lgmp genkeys.o

コンパイルは通るようです。

# make install
===>  Installing for dhisd-5.5
===>   dhisd-5.5 depends on shared library: gmp.7 - found
===>   Generating temporary packing list
===>  Checking if dns/dhisd55 already installed
===>   Installing /usr/local/sbin/dhisd.
===>   Installing /usr/local/sbin/sgenkeys.
install: /usr/ports/dns/dhisd55/work/dhisd-5.5/genkeys: No such file or directory

バージョンが進んで名称の変更等があるようで、合わせるように修正を入れました。

-rw-r--r--  1 root  wheel     89 May 22  2008 CONTRIBUTORS
-rw-r--r--  1 root  wheel   1328 May 22  2008 COPYRIGHT
-rw-r--r--  1 root  wheel   9606 May 22  2008 INSTALL
-rw-r--r--  1 root  wheel   3523 May 22  2008 Makefile
-rw-r--r--  1 root  wheel  11936 May 22  2008 README
-rw-r--r--  1 root  wheel   2455 May 22  2008 WHATSNEW
-rw-r--r--  1 root  wheel   8234 May 22  2008 ddb.c
-rw-r--r--  1 root  wheel   2201 May 22  2008 ddb.h
-rw-r--r--  1 root  wheel   4492 Apr 29 21:31 ddb.o
-rw-r--r--  1 root  wheel    954 May 22  2008 dhis.db.sample
-rwxr-xr-x  1 root  wheel  33576 Apr 29 21:31 dhisd
-rw-r--r--  1 root  wheel    706 May 22  2008 dhisd.conf.sample
-rw-r--r--  1 root  wheel   3535 May 22  2008 dhisd.h
-rw-r--r--  1 root  wheel    362 May 22  2008 dhisd.rc
-rwxr-xr-x  1 root  wheel   9694 Apr 29 21:31 dhisgenkeys
-rw-r--r--  1 root  wheel   1943 May 22  2008 genkeys.c
-rw-r--r--  1 root  wheel   1220 Apr 29 21:31 genkeys.o
-rw-r--r--  1 root  wheel   7440 May 22  2008 main.c
-rw-r--r--  1 root  wheel   6940 Apr 29 21:31 main.o
-rw-r--r--  1 root  wheel   3479 May 22  2008 misc.c
-rw-r--r--  1 root  wheel   1562 May 22  2008 misc.h
-rw-r--r--  1 root  wheel   2408 Apr 29 21:31 misc.o
-rw-r--r--  1 root  wheel  22746 May 22  2008 network.c
-rw-r--r--  1 root  wheel   3479 May 22  2008 network.h
-rw-r--r--  1 root  wheel  12652 Apr 29 21:31 network.o
-rw-r--r--  1 root  wheel   2637 May 22  2008 nsupdate.c
-rw-r--r--  1 root  wheel   1617 May 22  2008 nsupdate.h
-rw-r--r--  1 root  wheel   1656 Apr 29 21:31 nsupdate.o
-rw-r--r--  1 root  wheel   7637 May 22  2008 online.c
-rw-r--r--  1 root  wheel   1902 May 22  2008 online.h
-rw-r--r--  1 root  wheel   5828 Apr 29 21:31 online.o
-rw-r--r--  1 root  wheel   6154 May 22  2008 qrc.c
-rw-r--r--  1 root  wheel   1709 May 22  2008 qrc.h
-rw-r--r--  1 root  wheel   4320 Apr 29 21:31 qrc.o

これをみながら、修正を入れてみました。

install: dhisd  dhisgenkeys
        strip dhisd dhisgenkeys
        $(MKDIR) $(INSTALLBIN)
        $(MKDIR) $(LOGDIR)
        $(MKDIR) $(PIDDIR)
        $(CP) dhisd $(INSTALLBIN)
        $(CP) dhisgenkeys $(INSTALLBIN)
        $(CHOWN) dhis $(INSTALLBIN)/dhisd $(INSTALLBIN)/dhisgenkeys $(LOGDIR) $(PIDDIR)
        $(CHGRP) dhis $(INSTALLBIN)/dhisd $(INSTALLBIN)/dhisgenkeys $(LOGDIR) $(PIDDIR)
        $(CHMOD) 770 $(INSTALLBIN)/dhisd $(INSTALLBIN)/dhisgenkeys $(LOGDIR) $(PIDDIR)
        $(CHMOD) u+s $(INSTALLBIN)/dhisd
        $(CP) dhis.db.sample dhisd.conf.sample $(INSTALLCONF)
        $(CHOWN) dhis $(INSTALLCONF)/dhis.db.sample $(INSTALLCONF)/dhisd.conf.sample
        $(CHGRP) dhis $(INSTALLCONF)/dhis.db.sample $(INSTALLCONF)/dhisd.conf.sample
        $(CHMOD) 640 $(INSTALLCONF)/dhis.db.sample $(INSTALLCONF)/dhisd.conf.sample
        $(CP) dhisd.rc $(INSTALLRC)/dhisd
        $(CHOWN) dhis $(INSTALLRC)/dhisd
        $(CHGRP) dhis $(INSTALLRC)/dhisd
        $(CHMOD) 755 $(INSTALLRC)/dhisd

少し考慮が必要そうな部分が出てきました。

INSTALLBIN=/usr/local/sbin
INSTALLCONF=/usr/local/etc
INSTALLRC=/usr/local/etc/rc.d
LOGDIR=/var/log/dhis
PIDDIR=/var/run/dhis
CP=cp
OWNER=dhis
GROUP=dhis
MKDIR=mkdir -p
CHOWN=chown
CHGRP=chgrp
CHMOD=chmod

となっていたからです。

 グループとオーナーは、今回は特別に作成するのではなく、現行踏襲で、root動作にしました。

 最初に導入したサーバが FreeBSD 5.x系なので、rc.dに入れる内容は etc/rc.d/dhisd.sh にすることにしました。

# New ports collection makefile for:    dhisd
# Date created:                         Sun Feb 25 21:13:59 CET 2001
# Whom:                                 Bas Kruit <baskruit@bsltwr.dhis.org>
#
# $FreeBSD: ports/dns/dhisd/Makefile,v 1.22 2009/01/05 19:43:54 pav Exp $
#

PORTNAME=       dhisd
PORTVERSION=    5.5
#PORTREVISION=  3
CATEGORIES=     dns
MASTER_SITES=   ftp://ftp.dhis.org/pub/dhis/

MAINTAINER=     marius@FreeBSD.org
COMMENT=        DHIS server for dynamic updates on the server using specific engines

LIB_DEPENDS=    gmp.7:${PORTSDIR}/math/libgmp4

CFLAGS+=        -I${PREFIX}/include
LDFLAGS+=       -L${PREFIX}/lib
MAKE_ENV=       LDFLAGS="${LDFLAGS}"

DOCFILES=       CONTRIBUTORS COPYRIGHT INSTALL README WHATSNEW

#post-patch:
#       ${CP} ${FILESDIR}/dhisd.sh ${WRKSRC}/dhisd.sh
#       cd ${WRKSRC} && ${REINPLACE_CMD} -e "s^__PREFIX__^${PREFIX}^g" \
#               Makefile dhisd.h dhisd.sh ${DOCFILES}

do-install:

post-install:
        @${ECHO_MSG} "===>   Installing ${PREFIX}/sbin/dhisd."
        @${INSTALL_PROGRAM} ${WRKSRC}/dhisd ${PREFIX}/sbin
        @${ECHO_CMD} "sbin/dhisd" >> ${TMPPLIST}
        @${ECHO_MSG} "===>   Installing ${PREFIX}/sbin/dhisgenkeys."
        @${INSTALL_PROGRAM} ${WRKSRC}/dhisgenkeys ${PREFIX}/sbin
        @${ECHO_CMD} "sbin/dhisgenkeys" >> ${TMPPLIST}
        @${ECHO_MSG} "===>   Creating ${PREFIX}/etc/dhis and installing sample db files."
        @${MKDIR} ${PREFIX}/etc/dhis
        @${CHMOD} 700 ${PREFIX}/etc/dhis
        @${INSTALL_DATA} ${WRKSRC}/dhis.db.sample ${PREFIX}/etc/dhis/dhisd.db.sample
        @${ECHO_CMD} "etc/dhis/dhisd.db.sample" >> ${TMPPLIST}
        @${INSTALL_DATA} ${WRKSRC}/dhisd.conf.sample ${PREFIX}/etc/dhis/dhisd.conf.sample
        @${ECHO_CMD} "etc/dhis/dhisd.conf.sample" >> ${TMPPLIST}
        @${CHMOD} 600 ${PREFIX}/etc/dhis/*
        @${ECHO_CMD} "@dirrm etc/dhis" >> ${TMPPLIST}
.if !exists(${PREFIX}/etc/rc.d/dhisd.sh)
        @${ECHO_MSG} "===>   Installing ${PREFIX}/etc/rc.d/dhid startup file."
        @${INSTALL_SCRIPT} -m 751 ${WRKSRC}/dhisd.rc ${PREFIX}/etc/rc.d/dhisd.sh
        @${ECHO_CMD} "etc/rc.d/dhisd.sh" >> ${TMPPLIST}
.endif
.if !defined(NOPORTDOCS)
        @${ECHO_MSG} "===>   Installing documentation in ${DOCSDIR}"
        @${MKDIR} ${DOCSDIR}
        @${CHMOD} 755 ${DOCSDIR}
.for DOCFILE in ${DOCFILES}
        @${INSTALL_DATA} ${WRKSRC}/${DOCFILE} ${DOCSDIR}
        @${ECHO_CMD} "share/doc/${PORTNAME}/${DOCFILE}" >> ${TMPPLIST}
.endfor
        @${INSTALL_DATA} ${FILESDIR}/INSTALL.bsd ${DOCSDIR}
        @${ECHO_CMD} "share/doc/${PORTNAME}/INSTALL.bsd" >> ${TMPPLIST}
        @${ECHO_CMD} "@dirrm share/doc/${PORTNAME}" >> ${TMPPLIST}
.endif
        @${ECHO} "--------------------------------------------------------------------------"
        @${ECHO} "Before dhisd can run, you will need configure BIND."
        @${ECHO} ""
        @${ECHO} "For more information, see the following site:"
        @${ECHO} "http://www.dhis.org/dhis/r5/"
.if !defined(NOPORTDOCS)
        @${ECHO} ""
        @${ECHO} "or the files in ${DOCSDIR}"
        @${ECHO} "Read INSTALL and INSTALL.bsd at least for the setup information of dhisd."
.endif
        @${ECHO} "--------------------------------------------------------------------------"

.include <bsd.port.mk>

FreeBSD 7.2だと、以下にしています。

# New ports collection makefile for:    dhisd
# Date created:                         Sun Feb 25 21:13:59 CET 2001
# Whom:                                 Bas Kruit <baskruit@bsltwr.dhis.org>
#
# $FreeBSD: ports/dns/dhisd/Makefile,v 1.22 2009/01/05 19:43:54 pav Exp $
#

PORTNAME=       dhisd
PORTVERSION=    5.5
PORTREVISION=   1
CATEGORIES=     dns
MASTER_SITES=   ftp://ftp.dhis.org/pub/dhis/

MAINTAINER=     marius@FreeBSD.org
COMMENT=        DHIS server for dynamic updates on the server using specific engines

LIB_DEPENDS=    gmp.7:${PORTSDIR}/math/libgmp4

CFLAGS+=        -I${PREFIX}/include
LDFLAGS+=       -L${PREFIX}/lib
MAKE_ENV=       LDFLAGS="${LDFLAGS}"

DOCFILES=       CONTRIBUTORS COPYRIGHT INSTALL README WHATSNEW

#post-patch:
#       ${CP} ${FILESDIR}/dhisd.sh ${WRKSRC}/dhisd.sh
#       cd ${WRKSRC} && ${REINPLACE_CMD} -e "s^__PREFIX__^${PREFIX}^g" \
#               Makefile dhisd.h dhisd.sh ${DOCFILES}

do-install:

post-install:
        @${ECHO_MSG} "===>   Installing ${PREFIX}/sbin/dhisd."
        @${INSTALL_PROGRAM} ${WRKSRC}/dhisd ${PREFIX}/sbin
        @${ECHO_CMD} "sbin/dhisd" >> ${TMPPLIST}
        @${ECHO_MSG} "===>   Installing ${PREFIX}/sbin/dhisgenkeys."
        @${INSTALL_PROGRAM} ${WRKSRC}/dhisgenkeys ${PREFIX}/sbin
        @${ECHO_CMD} "sbin/dhisgenkeys" >> ${TMPPLIST}
        @${ECHO_MSG} "===>   Creating ${PREFIX}/etc/dhis and installing sample db files."
        @${MKDIR} ${PREFIX}/etc/dhis
        @${CHMOD} 700 ${PREFIX}/etc/dhis
        @${INSTALL_DATA} ${WRKSRC}/dhis.db.sample ${PREFIX}/etc/dhis/dhisd.db.sample
        @${ECHO_CMD} "etc/dhis/dhisd.db.sample" >> ${TMPPLIST}
        @${INSTALL_DATA} ${WRKSRC}/dhisd.conf.sample ${PREFIX}/etc/dhis/dhisd.conf.sample
        @${ECHO_CMD} "etc/dhis/dhisd.conf.sample" >> ${TMPPLIST}
        @${CHMOD} 600 ${PREFIX}/etc/dhis/*
        @${ECHO_CMD} "@dirrm etc/dhis" >> ${TMPPLIST}
.if !exists(${PREFIX}/etc/rc.d/dhisd)
        @${ECHO_MSG} "===>   Installing ${PREFIX}/etc/rc.d/dhid startup file."
        @${INSTALL_SCRIPT} -m 751 ${WRKSRC}/dhisd.rc ${PREFIX}/etc/rc.d/dhisd
        @${ECHO_CMD} "etc/rc.d/dhisd" >> ${TMPPLIST}
.endif
.if !defined(NOPORTDOCS)
        @${ECHO_MSG} "===>   Installing documentation in ${DOCSDIR}"
        @${MKDIR} ${DOCSDIR}
        @${CHMOD} 755 ${DOCSDIR}
.for DOCFILE in ${DOCFILES}
        @${INSTALL_DATA} ${WRKSRC}/${DOCFILE} ${DOCSDIR}
        @${ECHO_CMD} "share/doc/${PORTNAME}/${DOCFILE}" >> ${TMPPLIST}
.endfor
        @${INSTALL_DATA} ${FILESDIR}/INSTALL.bsd ${DOCSDIR}
        @${ECHO_CMD} "share/doc/${PORTNAME}/INSTALL.bsd" >> ${TMPPLIST}
        @${ECHO_CMD} "@dirrm share/doc/${PORTNAME}" >> ${TMPPLIST}
.endif
        @${ECHO} "--------------------------------------------------------------------------"
        @${ECHO} "Before dhisd can run, you will need configure BIND."
        @${ECHO} ""
        @${ECHO} "For more information, see the following site:"
        @${ECHO} "http://www.dhis.org/dhis/r5/"
.if !defined(NOPORTDOCS)
        @${ECHO} ""
        @${ECHO} "or the files in ${DOCSDIR}"
        @${ECHO} "Read INSTALL and INSTALL.bsd at least for the setup information of dhisd."
.endif
        @${ECHO} "--------------------------------------------------------------------------"

.include <bsd.port.mk>

 たぶんこんな感じでいいはずです。

 rootでそのまま動作させるので、LOGFILEとPIDDIRは通常のものにして利用することに変更する修正等を入れます。
パッチファイルは、以下の通りになりました。

-rw-r--r--  1 root  wheel  1717 Nov 25  2001 INSTALL.bsd
-rw-r--r--  1 root  wheel   365 Apr 29 22:29 patch-Makefile
-rw-r--r--  1 root  wheel   679 Apr 29 22:31 patch-dhisd.conf.sample
-rw-r--r--  1 root  wheel   512 Apr 29 22:33 patch-dhisd.rc

パッチの中身まで表示させていると流石にページがでかくなってきたので、詳細は tarballの中身を参照してください。
ここ置きました。(FreeBSD 5.5のタイミングのものがおいてあります)

 導入後の /usr/local/etc/rc.d/dhisd.sh は、以下の通りになりました(というかなるように作成しました)

#!/bin/sh
#
#

# PROVIDE: dhisd
# REQUIRE: SERVERS

. /etc/rc.subr

dhisd_enable=${dhisd_enable:-"NO"}
dhisd_flags=${dhisd_flags:-""}
#dhisd_user=${dhisd_user:-"dhis"}
#dhisd_group=${dhisd_group:-"dhis"}

name="dhisd"
rcvar=`set_rcvar`
command="/usr/local/sbin/dhisd"
command_args=""

pidfile="/var/run/${name}.pid"

load_rc_config $name
run_rc_command "$1"

ということで、 /etc/rc.conf に1行の追加が必要になります。(後述しますが、パラメータ設定が更に1行必要です)

dhisd_enable="YES"

 次に、設定ファイルの作成をしておきましょう。
 /usr/local/etc/dhis 以下に作成されている2つのサンプルを修正して利用します。
 dhisd.conf.sample は、そのままで大丈夫なので、

# cp -p dhisd.conf.sample dhisd.conf

で大丈夫です。

設定

 dhisd.db.sampleファイルをベースに dhisd.dbを作成しておきます。

# cp -p dhisd.db.sample dhisd.db

 として、編集していきます。

 設定方法は、READMEに書かれている通りなので、読めということになります。MySQLのテーブルなどについても記述されていました。
開けておきべきポートは UDPの58800だと書かれていますので、ルータやFirewallの設定では考慮する必要があります。

 サンプルファイルの中身は以下の通り。

;
; DHIS R5 Server Clients Database
;
; A sample DHIS database file for a DHIS server
;
;
; Record 1000 has password authentication (possibly R3 or R4)
;
1000 {
        HostName        host1.somewhere.org
        HostPass        secret0
}

; Record 1001 has QRC authentication (R4 or R5)
;
1001 {
        HostName        host2.somewhere.org
        AuthN           13497898849868626180517976399531009237740469647749
        AuthN           41645948317777733432972176109042647087704948785549
        AuthN           58474928768099947065907839246737275047327707787846
        AuthN           80670622203628424308100996612730498037034893335481
}

; Record 1002 has password authentication
; plus /usr/local/etc/dhis/1002/on.sh is executed at online time
; and /usr/local/etc/dhis/1002/off.sh is executed at offline time
;
1002 {
        HostName        host3.somewhere.org
        HostPass        secret4
        OnCmd           /usr/local/etc/dhis/1002/on.sh <param3> <param4>
        OffCmd          /usr/local/etc/dhis/1002/off.sh <param3> <param4>
}

 なんとなく、使い方はわかりそうな内容です。
上記の例は、3つの方法の例示されている。

(1)host1 の例
 これは、パスワード認証の形式で、単純にホスト名とパスワードを指定するもの。
 レコードは 1000という番号で作成。

(2)host2 の例
 QRC認証形式のもので、dhisgenkeys とコピー&ペーストでつくる…みたいにINSTALLには書かれているみたいだ。
 レコードは 1001という番号で作成。

(3)host3 の例
 パスワード認証ながら、オンライン時とオフライン時にそれぞれコマンドを実施させて動かすパスワード認証形式での例。
なるほど、おもしろい。
 レコードは 1002という番号で作成。

 単純なら(1)でいいのかも知れない。クライアントのソフトを使ってみていないのでなんともいえないけど。
DD-WRTを使って、勝手に連動させるとかが簡単そうだけど、このページの例では特異な例になりそうなので、一応パスしました。

 レコードを追加した場合には、kill -HUPシグナルを送って更新するようにと、書かれていました。
増やす予定はないけど。ニーズがあればやるのかも知れないし。

 bind9でも動くもの?と思ってドキュメント見ていたけど、特にダメという記述は見あたらない。
ゾーンファイルに

 host1 60 IN A 192.168.255.0

みたいな記述例は意味がわからなかったんだけど、dhisdが動作していないタイミングで返答するAアドレスの記述らしい。
適当なプライベートアドレスを記述してあればいいもの?
#あっ。既にこのページが Googleだと1ページ目に出てくるのか。情報漁りにくいなぁ

クライアントの設定例 R5 (dhis-5.x)のページを参考にしています。

意味合いなど

 QRCって何の略だろうかや、AuthP AuthQ AuthN ?などと情報不足気味でした。
AuthPとQはプライベートキーで、Nがパブリックキーなんだな。Pがパスワード、QはQRCキーペア?

 READMEによれば、

        The QRC algorithm, as implemented in DHIS 5, is as follows:

        The client has two 100 digit keys P and Q. The server
        has (for each client) the public key N obtained by
        P*Q. P and Q are both prime and congruent to 3 mod 4.
        When authentication is requested the server generates
        a random number (prime relative to N) called X and
        squares it mod N. It then sends its square to the client (Y)
        which by its turn has to calculte its square root
        mod N (X') using the chinese remainder theorem. X' is sent
        back and compared with X. X' may only be calculated
        knowing the two private keys factors P and Q.

 とのこと。ただ、アルゴリズムの説明されてもなぁと。
その他、いろいろ見ていくと、サーバ側にAuthN と登録されていて、AuthP AuthQとホストIDをクライアント側が知っていて渡すということらしいので、まずは作って試すことにしました。

# dhisgenkeys
        AuthP           98865542441515936711048877096284144715649364205971
        AuthP           95386381007454488788214118564189819952766696539903
        AuthQ           70340105063416077294099941613552051946590510115559
        AuthQ           37559923855321338431163360930580294634892472104411
        AuthN           69542126424878522286736651472437398488209231669281
        AuthN           92401760354900327452134951725393572288680056637261
        AuthN           27939760248559646320716617433119910600973344465149
        AuthN           05672478231879297437934044310968063185862643812133

実行するたびに生成されるのだね。(※上記は多少いじってますけど)
AuthNの桁数は時々1桁少ない桁数になることもあるみたいだ。

AuthPの2行と、AuthQの2行をクライアントに渡す流れでいいわけだ。
なんとなくわかってきました。

foo.example.jp で HostID 4001 で作成する場合のdhisd.db(DHIS database file)には

4001 {
        HostName        foo.example.jp
        AuthN           69542126424878522286736651472437398488209231669281
        AuthN           92401760354900327452134951725393572288680056637261
        AuthN           27939760248559646320716617433119910600973344465149
        AuthN           05672478231879297437934044310968063185862643812133
}        

と書けばいいはず。

winip22.zip というのは FTPに置かれていたファイル。今回はこれを試しに使うことにした。

 README.DOCってMSワードのドキュメントだった。(えらい時代になったなぁ。)

 これを読むと、パスワード認証しかできないみたいだ。Faktor DDNS Updatorも同様。
WinIP 4.0というのがあるみたいだ。でも、これも違う。

 QRC認証で使えるWindowsクライアントって実は存在していないのだね?

 FreeBSDなどでサーバをNAT内で動作させているときなんかでは、便利に使えるかも知れないけど、自宅のWindows PCに入るために、現在のアドレスがいくつになっているかを知るために使うにはパスワード認証しかないみたいです。
(コレガのルータが対応しているっぽいが、家のどこかにあったか不明)

 ということで、設定に戻って、WinIP22で、パスワード認証で動くところを確認しようと思います。
# 志気下がりっぱなしだけど

 Windows Vistaでは「管理者として実行」として導入しないと、後で面倒なので要注意。

4002 {
        HostName        foo.example.jp
        HostPass        PASSWORD
}

としました。

# /usr/local/etc/rc.d/dhisd.sh restart

で反映したはず。

 ただし、そのまま起動したところでは、サービスが浮かんで来ませんでした。
これはパラメータが不足ということのようです。

Syntax: /usr/local/sbin/dhisd [-D] [-P pid_file] [-l log_file] [-c config_file]
[-d dbfile] [-b ipv4_interface_address] [-p udp_port]

ということなので、

# /usr/local/sbin/dhisd -P /var/run/dhisd.pid -l /var/log/dhisd.log
  -c /usr/local/etc/dhis/dhisd.conf -d /usr/local/etc/dhis/dhisd.db

で動作することを確認しました。
これを反映させて、再度起動することにします。

/etc/rc.conf に

dhisd_flags="-c /usr/local/etc/dhis/dhisd.conf"

 の指定を加えます。計2行ということです。
 -D とか -D -Dとかを追加しておけば、デバッグメッセージが出るようになるらしいので、やってみてください。

 これで正常にあがるようになりました。

 Bind 9 のnamed.conf では

zone    "example.jp" {
        type master;
        file "dynamic/example.jp.zone";
        notify yes;
        allow-transfer { セカンダリのIPアドレス; };
        allow-update {
                        127.0.0.1;
                        マスターのIPアドレス;
                        セカンダリのIPアドレス;
        };
        allow-query { any ; } ;
};

のように修正。dynamicにしておかないとパーミッションエラーが来ました。

 このallow-update の部分は、

zone 'example.jp' allows updates by IP address, which is insecure

だと、メッセージが出ています。
今回は実験的に使っているだけなので、無視で先に進めますが、本当は

allow-update { key "ddns keyname"; };

のように、キーによる更新が適当でしょう。
ここでは面倒なので、割愛しますので、他の方のページを参照して利用される方は頑張ってください

 ネームサーバのslave側には、以下をnamed.conf の同箇所に追加する必要があります。(Bind 9での例)

allow-update-forwarding { MASTER側のIPアドレス; };

 次はゾーンレコードを編集。上記にある通り、/etc/namedb/master 以下にある example.jp.zone という名称で作成してあります。

...
www IN CNAME mail
ftp IN CNAME mail

foo 60 IN A 192.168.255.0

のように指定してみました。

テストの実施

 さて、実際にクライアントから接続してみました。

 赤の枠の部分には、動作させているサーバのFQDNまたはIPアドレス。
MAIL Relayは、メールサーバが別に指定があれば、そのIPアドレス。なければ既存のメールサーバIPアドレス。
青枠の部分は、ホストID。今回の例では 4002 を指定。
緑枠の部分は、設定パスワード。例では PASSWORD を指定。

 サーバのログで確認してみると、ちゃんとオンラインになって、正しいIPアドレス来ました。

Sat May 2 15:39:11 2009 : Datagram Server Started [99812]
Sat May 2 15:43:30 2009 : -> online (4002) foo.example.jp [XXX.YYY.ZZZ.aaa]

ちゃんと拾った。

 stopにすると、ちゃんとプライベートアドレスに戻ります。
なーるほど。良くできている感じです。Bind 9で全然問題なく動きますね。

 評価

結果:問題なし

 これは簡単に動作させることができました。
有料でサービスしているところもあるみたいですが、これは簡単に実施できるし、自分のところで動かして利用するで十分そうです。
今のところ利用用途がないので、試しただけで終わりですけど。

 また、認証のパケットはセキュアなのかがいまいち良く把握できていないのですが、DDNS対応のルータで普通に利用することはできそうな気がします。

【改訂履歴】作成:2009/04/29
2009/05/30 … 若干の変更
【参考リンク】
Dynamic Host Information Services … DHISのオフィシャルページ

Copyright © 1996,1997-2006,2007- by F.Kimura,