GnuDIPでダイナミックDNSサーバを作る

Debian 11でGnuDIPを使ったダイナミックDNSサーバを作ってみた。

DNSサーバの準備

BINDをインストール、ドメインに対応するゾーンファイルの定義を行い、ゾーンファイルを作成する。bashでタブが入力できるようにset disable-completionで補完機能のON/OFFを行っている。また、ゾーンファイルはシリアル番号に日付を含むように指定、$TTL環境変数と間違われないように先頭に\を付加している。
今回の例では自分が所有するドメインを example.jp と仮定して記載している。

sudo apt-get install -y bind9
bind 'set disable-completion on'
cat << EOT | sudo tee -a /etc/bind/named.conf.local
zone "example.jp" {
	type master;
	file "db.example";
};
EOT
cat << EOT | sudo tee /var/cache/bind/db.example
;
; BIND data file for example zone
;
\$TTL	3600
@	IN	SOA	ns.example.jp. root.example.jp. (
			`date +%Y%m%d`01	; Serial
			      3600	; Refresh
			       300	; Retry
			   3600000	; Expire
			      3600 )	; Negative Cache TTL
;
@	IN	NS	ns.example.jp.
@	IN	MX 10	ns.example.jp.
ns	IN	A	219.99.78.13
www	IN	CNAME	ns.example.jp.
mail	IN	CNAME	ns.example.jp.
EOT
bind 'set disable-completion off'
sudo systemctl reload bind9

Webサーバの準備

Apacheをインストールして、サーバ名を設定、CGIの有効化を行っている。

sudo apt-get install -y apache2
sudo sed -i -e 's/^\t#ServerName www\.example\.com$/\tServerName www.example.jp/' /etc/apache2/sites-available/000-default.conf
sudo a2enmod cgid
sudo systemctl restart apache2

GnuDIPのダウンロードと展開と配置

GnuDIPのダウンロードに使うwgetをインストールして、GnuDIPのアーカイブをダウンロード、展開して出来たgnudipディレクトリを/usr/local/に配置して、オーナーをrootに変更している。

sudo apt-get install -y wget
wget http://gnudip2.sourceforge.net/gnudip-www/src/gnudip-2.3.5.tar.gz
tar zxvfi gnudip-2.3.5.tar.gz
sudo mv gnudip-2.3.5/gnudip /usr/local
sudo chown -R root:root /usr/local/gnudip

GnuDIPのデータベースの設定

フラットデータベースを使うために、シンボリックリンクを張り直す。

cd /usr/local/gnudip/lib
sudo ln -sf dbprefs_flat.pm dbprefs.pm
sudo ln -sf dbusers_flat.pm dbusers.pm

GnuDIPのキーファイルの再生成

ダイナミックDNSの更新に使うキーファイルを作り直すので、既存のものを削除、tsig-keygenコマンドで作成、書き換えたり、他のユーザから見たり出来ないようにパーミッションを設定、GnuDIPの設定に記載されているキーファイルのファイル名を作成したものに書き換える。

sudo rm /usr/local/gnudip/etc/Kgnudip-key.*
sudo tsig-keygen -a HMAC-SHA512 gnudip-key | sudo tee /usr/local/gnudip/etc/gnudip-key.key
sudo chmod 400 /usr/local/gnudip/etc/gnudip-key.key
sudo sed -i -e 's/Kgnudip-key\.[\+\.0-9]*\.private/gnudip-key.key/' /usr/local/gnudip/etc/gnudip.conf

GnuDIPのキーファイルをDNSサーバの設定に追加

GnuDIPのキーファイルでダイナミックDNSの更新が行えるように、ドメインに対応するゾーンファイルの定義を一旦削除して、キーファイルの内容の追加と、ドメインに対応するゾーンファイルの定義を再度行う。update-policyを追加して、denyで更新されたくないホスト名を、grantで更新対象となるドメイン名を指定している。

sudo sed -i -e '/^zone "example\.jp" {$/,$d' /etc/bind/named.conf.local
sudo chmod 640 /etc/bind/named.conf.local
sudo cat /usr/local/gnudip/etc/gnudip-key.key | sudo tee -a /etc/bind/named.conf.local
cat << EOT | sudo tee -a /etc/bind/named.conf.local
zone "example.jp" {
	type master;
	file "db.example";
	update-policy {
		deny gnudip-key name ns.example.jp.;
		deny gnudip-key name www.example.jp.;
		deny gnudip-key name mail.example.jp.;
		grant gnudip-key subdomain example.jp.;
	};
};
EOT
sudo systemctl reload bind9

GnuDIPの管理者ユーザを作成

GnuDIPのログインに使う管理者を、ユーザ名とパスワードを指定して作成する。

sudo /usr/local/gnudip/sbin/gdipadmin.pl admin bbs68sys

GnuDIPをWebサーバで公開する

GnuDIPの一部ファイルは古いApacheを前提しているので削除とリネームを行い、Webサーバからアクセスできるようにパーミッションを修正した後、ApacheでGnuDIPのディレクトリを公開するための設定を作成して、有効化した後、Apacheの再読み込みを行って反映させる。

sudo rm /usr/local/gnudip/html/.htaccess
sudo mv /usr/local/gnudip/html/header.html /usr/local/gnudip/html/HEADER.html
sudo chown -R www-data:www-data /usr/local/gnudip/run/*
sudo chown -R www-data:www-data /usr/local/gnudip/etc/*
cat << EOT | sudo tee /etc/apache2/conf-available/gnudip.conf
Alias /gnudip/html/ /usr/local/gnudip/html/
<Directory "/usr/local/gnudip/html">
    Options Indexes FollowSymLinks
    Require all granted
</Directory>
ScriptAlias /gnudip/cgi-bin/ /usr/local/gnudip/cgi-bin/
<Directory "/usr/local/gnudip/cgi-bin">
    Options +ExecCGI
    Require all granted
</Directory>
EOT
sudo a2enconf gnudip
sudo systemctl reload apache2

GnuDIPの初回設定

  1. Webブラウザhttp://www.example.jp/gnudip/cgi-bin/gnudip.cgi を開く
  2. Username/Hostnameに管理者のユーザ名、Passwordに管理者のパスワードを入力して、Login
  3. Add Domainから、Go
  4. Domain Nameに example.jp を入力、Allow Password Changesにチェックを入れて、Add Domain