BINDとMySQL

Red Hat Linuxのページトップへ

ここでは、MySQL 4.0.13でBIND 9.2.2を管理するする方法について説明します。一部には、MySQLとは関係のない記述も含まれています。


インストール
設定
起動
データベース
リロード
インストール
MySQLに対応したBINDは、Bind-Mysql Projectからダウンロードできます。インストール方法は、通常と変わりありません。

# tar zxvf bind-9.2.2.tar.gz
# cd bind-9.2.2
# ./configure
# make
# make install
以上により、/usr/local/sbin/namedがインストールされます。FreeBSDが標準で持っている/usr/sbin/namedとは異なるので、注意して下さい。

設定
ループバックアドレスのゾーンファイル
ループバックアドレスのゾーンファイルを作成します。

# cd /etc/namedb
# /bin/sh make-localhost
上のコマンドを実行すると、/etc/namedb/localhost.revと/etc/namedb/localhost-v6.revが作成されます。

pidファイル
BINDはデフォルトでは/var/run/named.pidにpidファイルを作成しますが、オーナーがroot:wheelである/var/runディレクトリにbindユーザがファイルを作成しようとすると、"couldn't open pid file '/var/run/named.pid': Permission denied"となり、失敗します。この対策として、pidファイルを/var/run/namedディレクトリに作成します。

/etc/namedb/named.confのoptionsの中に、

pid-file "/var/run/named/named.pid";
を追加します。

オーナーがbind:bindである/var/run/namedディレクトリを作成します。

# mkdir /var/run/named
# chown bind:bind /var/run/named
# chmod 700 /var/run/named
# ls -al
:
drwx------ 2 bind bind 512 Jun 20 16:15 named/
:
rndc
namedの操作は、/usr/local/sbin/rndcコマンドから実行します。ここでは、その設定を行います。

# /usr/sbin/rndcontrol -s "0 1 2 3 4"
/usr/sbin/rndcontrol: setting irq 0
/usr/sbin/rndcontrol: interrupts in use: 0
# /usr/local/sbin/rndc-confgen > /root/rndc.conf
上のコマンドを実行すると、/root/rndc.confに以下の設定ファイルの内容が出力されます。

# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "secret";
};

options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "secret";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
secretには、適当な暗号鍵が入ります。上の/root/rndc.confの前半(コメントアウトされていない部分)を元に、/etc/rndc.confと/etc/rndc.keyを作成します。/etc/rndc.keyはオーナーをbind:bindとし、それ以外のユーザからはアクセスできないようにします。

# chown bind:bind /etc/rndc.key
# chmod 600 /etc/rndc.key
# ls -l /etc/
:
-rw------- 1 bind bind 77 Jun 20 16:15 rndc.key
:
# cat /etc/rndc.conf
include "/etc/rndc.key";
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# cat /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "secret";
};
更に/root/rndc.confの後半(コメントされている部分)を抜き出して、/etc/namedb/named.confに追加します。

key "rndc-key" {
algorithm hmac-md5;
secret "secret";
};

controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
起動
起動
namedを起動する前に、まずMySQLを起動して下さい。その後でnamedを起動しますが、このとき設定ファイルを指定する-cオプションとユーザを指定する-uオプションを指定します。

# /usr/local/sbin/named -c /etc/namedb/named.conf -u bind
起動後、/var/log/messagesにエラーメッセージが出力されているか、確認して下さい。

停止は、/usr/local/sbin/rndcから行います。

# /usr/local/sbin/rndc stop
設定ファイルを変更したら、/usr/local/sbin/rndcからリロードします。

# /usr/local/sbin/rndc reload
自動起動
上でも述べたように、データベースを読み込むようになったBINDは、起動時にMySQLに接続できなくてはなりません。OSと同時に起動したいとき、ネームサーバとデータベースサーバが別々のマシンにある場合は単に人間がコンピュータを起動する順番を守れば済みますが、2つが同じマシンにある場合は注意が必要です。

FreeBSDでは/etc/rc.confに、

named_enable="YES"
とすることでOSの起動時にnamedも起動できるようになりますが、MySQLは/usr/local/etc/rc.d/mysql-server.shスクリプトから起動します。/usr/local/etc/rc.dディレクトリにあるスクリプトはnamedが起動した後に実行されるので、このままだと起動する順序が逆になってしまいます。

このため、/etc/rc.confでは、

named_enable="NONE"
としておいて、別途namedを起動するスクリプトnamed.shを/usr/local/etc/rc.dに作成します。MySQLが起動しても、namedが読み込めるようになるまでは数秒必要みたいだったので、私が作成したnamed.shでは、MySQLのプロセスIDが得られてからnamedを起動するようになっています。

データベース
named.conf
named.confには以下のように、ゾーンごとに使用するデータベースを指定します。

zone "example.com" {
type master;
database "mysql database table hostname user password";
};
databaseにはデータベース名を、tableにはテーブル名を、hostnameにはデータベースサーバ名を、userにはデータベースのユーザ名を、passwordにはデータベースのパスワードを指定します。

テーブル
データベースのテーブルは、以下の構造をしている必要があります。データ型や主キーを変更することはできますが、列名を変更することはできません。

mysql> describe table
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| name   | varchar(128)        | YES  |     | NULL    l       |
| ttl    | bigint(20) unsigned | YES  |     | NULL    |       |
| rdtype | varchar(128)        |      |     |         |       |
| rdata  | varchar(128)        |      |     |         |       |
+--------+---------------------+------+-----+---------+-------+

name列には、ドメイン名やホスト名を指定します。ただし、通常のゾーンファイルのように"@"を指定したり、ドメイン名を省略したりする(例えば、"www")ことはできません。すべて、完全なドメイン名("www.example.com")を指定する必要があります。複数のゾーンファイルの内容が1つのテーブルに収められるので、こういった仕様となります。逆引きのときも、"1.0.168.192.in-addr.arpa"などとします。また、末尾に"."を記述してはいけません。

ttl列には、各レコードのTTLを指定します。

tdtype列には、レコードの種別を指定します。すなわち、"SOA"や"NS", "MX", "A", "CNAME", "PTR"です。

rdata列には、レコードの各種別に特有のデータを指定します。複数のデータを持つ場合(SOAレコードやMXレコード)は、スペースで区切って繋げます。すなわち、

@ IN SOA ns.example.com. root.example.com. (
2003070501 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600) ; Minimum
というSOAレコードは、rdata列では、

ns.example.com root.example.com 2003070501 3600 900 3600000 3600
となります。MXレコードの場合は、"10 mgate.example.com"のように優先度とホスト名をスペースで区切ります。なおrdata列でも、ドメイン名を省略することはできません。

以上のように、ゾーンファイルをデータベースのテーブルに置き換える訳ですが、ドメイン名が省略できなかったりして、そっくりそのまま移し変えられる訳ではありません。これは、BINDがゾーンファイルを読み込み、ドメイン名の補完などを行った後のものをテーブルに保管すると考えれば、理解できると思います。

ゾーンファイルの変換
既存のゾーンファイルをデータベースに格納するプログラムは、www.poptix.netさんからダウンロードできます。mysqldb-1.1.tar.gzに入っているzonetomysql.cがそれです。

zonetomysql.cのコメントによると、

gcc -g `./isc-config --cflags isc dns` -c zonetomysql.c
gcc -g -o zonetomysql zonetomysql.o `./isc-config --libs isc dns` -lmysqlclient
とすると、コンパイルとリンクができるとのことです。ここでisc-config.shというのは、/usr/local/binにあるシェルスクリプトで、BINDに関わるライブラリのパスなどを、コンパイラのオプションの形式で出力します。例えば、私の環境では、"`"で囲まれているコマンドを実行すると、

# /usr/local/bin/isc-config.sh --cflags isc dns
-I/usr/local/include
# /usr/local/bin/isc-config.sh --libs isc dns
-L/usr/local/lib -ldns -lisc
が出力されます。また実際には、リンク時にMySQLのライブラリの場所を指定する必要があるので、実行ファイルの作成は以下の手順になります。

# gcc -g `/usr/local/bin/isc-config.sh --cflags isc dns` -c zonetomysql.c
# gcc -g -o zonetomysql zonetomysql.c `/usr/local/bin/isc-config.sh --libs isc dns` -lmysqlclient -L/usr/local/lib/mysql -R/usr/local/lib/mysql
出来上がったzonetomysqlのコマンドラインシンタックスは、以下の通りです。

zonetomysql origin file dbname dbtable dbuser [dbpass]
originは、変換するゾーンファイルの基点となるドメイン名(要するにゾーン名)、fileはゾーンファイル名、dbnameはデータベース名、dbtableはテーブル名、dbuserはユーザ名、dbpassはパスワードでオプションです。これは例えば、次のように実行します。

# ./zonetomysql example.com example.com.zone dns zone bind pass
ただし、このzonetomysqlは、指定されたテーブルを最初に削除してから再び作り直し、データを登録します。このため、既存のテーブルにレコードを追加することはできません。

この問題を解決するためと、データベースに標準以外のデータ(レコードの通し番号など)を保存したかったため、私はレコードをタブで区切って出力することができるようにzonetomysql.cを改造しました。コンパイルとリンクの方法は同じです(簡単なMakefileも作成しました)。改造したzonetomysqlでは、上のシンタックスに加え、以下のコマンドラインシンタックスが使用できます。

zonetomysql -t origin file
これを実行すると、テーブルの各列の値が、タブで区切られて出力されます(データベースは一切変更しません)。

リロード
BINDは、必要になると毎回データベースを参照します。起動時に読み込んでメモリにキャッシュするといったことはしません。よって、ゾーンの変更後にリロードをする必要はありません。リロードしても、セカンダリDNSサーバにNOTIFYを送信するといったことはありません。

Bind-Mysql Project MySQL BIND SDB Driver

ぺんたん.info
あかいひ.com
IPくん.com
8枠.com - 競馬情報
galhime.com

PC Q&A||古い記事|雑学|ラーメン