新サーバ用のタワーを購入してから、実は2年以上経っている。いつか構築しようと思いつつも、必要に迫られないとダメだね、人間は(私は・・・か)。だましだまし使ってた既存機も、先日遂にディスク障害ぽい症状が現れた。ふと確認するとファイルシステムがリードオンリーでマウントされた状態だった。特に意図することはなかったものの、電源オフにしてしばらく放置しておくと普通に起動できた。さすがにディスクは心配なので、fsckかけて再起動したところ、障害は解消してしまった。
とはいえ、またいつ問題が起こるかわからないので、writeを伴うバッチの停止と新サーバへの機能移行を本気で開始した。まずはDNSから手を付ける。いつもだったら最新のBINDを導入しておしまいだが、今回はMyDNSを使用してみるつもりだった。データモデルにMySQLを使用出来る事が採用の大きなウェイトを占めている。今回のサーバ構築は、これに限らずなるべくデータ周りをMySQLに持たせ、バックアップにMySQLレプリケーションを利用するつもり。
MyDNS自体の設定はそれほど難しくはなかったが、自ドメイン以外の名前を引けないので、その点を構成でカバーする必要がある。最初に試したのが、別のBINDに再問い合わせる方法。しかし、この方法は必ず逆引きの再帰問い合わせを伴う為、レスポンス性能が異常に悪かった。次のアイデアは、BINDをフロントに持ってきて自ドメインのみMyDNSにフォワードする方法。この方法については以前もBINDで運用していたので、レスポンス周りに不安はなかった。結局、BINDとMyDNSが並存する面倒な構成になってしまったが、自ドメインの運用に限って言うと幾つかメリットがある。
上記構成にapache + phpの環境があれば、MyDNSConfigというツールが導入できる。これを利用すれば、ウェブベースでネームサーバのレコードを管理でき、且つDB上でそのデータを運用できる。DNSレコードを機能ごとに準備して、それなりに増やしていく自分としては非常に作業し易い。実際にウェブベースのインタフェースも触ってみたが、直感的で問題なく使用できた。しばらくは、この構成での運用が自分のスタンダードになりそうだ。
セキュリティ上の問題もあるのでこちらも参照下さい(2015年11月追記)
以下、参考までに。
- BINDのインストールと構築
wget -P /usr/local/src http://ftp.isc.org/isc/bind9/9.5.0/bind-9.5.0.tar.gz
tar xzf /usr/local/src/bind-9.5.0.tar.gz
cd /usr/local/src/bind-9.5.0
./configure \
--prefix=/usr/local/bind \
--with-openssl=/usr/local/openssl
make
make install
mkdir -p /usr/local/bind/chroot/etc
cd /usr/local/bind/chroot
# 外部zoneは別サーバのスレーブ、内部zoneはmydnsへforwardする設定。ついでにfletsも。
vi etc/named.conf
----
options {
directory "/zone";
pid-file "/var/run/named/named.pid";
statistics-file "/named.stats";
listen-on { 192.168.0.1; };
};
server 192.168.211.10 { edns no; };
include "/etc/rndc.key";
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
acl private {
192.168.0.0/24;
127.0.0.1;
};
view "internal" {
match-clients { private; };
recursion yes;
zone "." {
type hint;
file "named.ca";
};
zone "localhost" {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
zone "0.0.127.in-addr.arpa" {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
zone "domain.com" {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
zone "0.168.192.in-addr.arpa" {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
zone "flets" {
type forward;
forward only;
forwarders { 220.210.194.67; 220.210.194.68; };
};
};
view "external" {
match-clients { any; };
recursion no;
zone "." {
type hint;
file "named.ca";
};
zone "localhost" {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
zone "0.0.127.in-addr.arpa" {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
zone "domain.jp" {
type slave;
masters { 222.222.222.222; };
file "domain.jp";
};
zone "domain.com" {
type slave;
masters { 222.222.222.222; };
file "domain.com";
};
};
----
wget ftp://ftp.rs.internic.net/domain/named.root
mkdir zone
mv named.root zone/named.ca
rndc-confgen -a -b 512 -k rndckey -c etc/rndc.key
vi etc/rndc.conf
----
options {
default-server localhost;
default-key "rndckey";
};
server localhost {
key "rndckey";
};
include "/usr/local/bind/chroot/etc/rndc.key";
----
sed -ie 's/usr\/sbin/usr\/local\/bind\/sbin/g' /etc/init.d/named
sed -ie 's/# OPTIONS="${OPTIONS} -t ${ROOTDIR}"/ OPTIONS="${OPTIONS} -t ${ROOTDIR} -c ¥/etc¥/named.conf"/g' /etc/init.d/named
sed -ie 's/rndc/rndc -c ${ROOTDIR}\/etc\/rndc.conf/g' /etc/init.d/named
sed -ie 's/#ROOTDIR=¥/var¥/named¥/chroot/ROOTDIR=/usr/local/bind/chroot/g' /etc/sysconfig/named
service named start
- MyDNSのインストールと構築
wget -P /usr/local/src http://mydns.bboy.net/download/mydns-1.1.0.tar.gz
tar xzf /usr/local/src/mydns-1.1.0.tar.gz
cd /usr/local/src/mydns-1.1.0
sed -ie 's/node->sort1 = 65535 - order++;/node->sort1 = order++;/' src/mydns/sort.c
./configure \
--prefix=/usr/local/mydns \
--with-mysql-lib=/usr/local/mysql/lib/mysql \
--with-mysql-include=/usr/local/mysql/include/mysql
make
make install
# インストール済みのmysqlに、既存bindからデータを移行する。
mysql -uroot -e'create database mydns'
mysql -uroot -e'grant all on mydns.* to mydns@localhost'
/usr/local/mydns/sbin/mydns --create-tables | mysql -umydns mydns
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 localhost
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 0.0.127.in-addr.arpa
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 domain.com
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 0.168.192.in-addr.arpa
vi /usr/local/mydns/mydns.conf
----
db-user = mydns
database = mydns
listen = 127.0.0.1
----
vi /etc/resolv.conf
----
search domain.com
nameserver 192.168.0.1
----
# 起動テスト、名前引けるか試す。
/usr/local/mydns/sbin/mydns -c /usr/local/mydns/etc/mydns.conf --background
# 起動用スクリプト
vi /etc/init.d/mydns
----
#! /bin/sh
#
# mydns Start the MyDNS server
#
# Author: Falko Timme <ft@falkotimme.com>.
#
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=mydns
DAEMON=/usr/local/mydns/sbin/$NAME
DESC="DNS server"
SCRIPTNAME=/etc/init.d/$NAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
$DAEMON -c /usr/local/mydns/etc/mydns.conf --background
echo "."
;;
stop)
echo "Stopping $DESC: $NAME."
kill -9 `pidof $NAME` &> /dev/null
;;
restart)
echo "Restarting $DESC: $NAME."
$0 stop && sleep 1
$0 start
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
exit 1
;;
esac
exit 0
----
chkconfig --add mydns
chkconfig mydns on
service mydns start
- MyDNSConfigのインストールと構築
wget -P /usr/local/src http://downloads.sourceforge.net/mydnsconfig/MyDNSConfig-1.1.0.tar.gz?modtime=1173183827
tar xzf /usr/local/src/MyDNSConfig-1.1.0.tar.gz
cd /usr/local/src/MyDNSConfig-1.1.0
mysql -uroot mydns < install/mydnsconfig.sql
vi interface/lib/config.inc.php
----
$conf["rootpath"] = "/usr/local/mydnsconfig";
$conf["db_user"] = 'mydns';
$conf["db_password"] = '';
$conf["default_ns"] = 'ns.domain.com.';
$conf["default_mbox"] = 'postmaster.domain.com.';
$conf["default_refresh"] = 7200;
$conf["default_retry"] = 1800;
$conf["default_expire"] = 1209600;
----
# あとはhttpdがこのディレクトリを参照できるようにする。