Practice of Programming

プログラム とか Linuxとかの話題

MyDNSを試す

DNSサーバを探してて、dnsmasqとか出てきて調べようかなぁとか思ったら、同僚から、MyDSNってのを、DeNAで使っているらしいと聞いたので。

で、DeNA 技師のメモ(id:tokiharuさん)のblogに、DBマガジンの6月号に、MyDNSについて書いているとのことなので、読んでみてやってみた。ちょうど使いたい用途も同じでした。

インストール

Debianのパッケージがあったので、

% apt-get install mydns-common mydns-mysql

を実行して、いくつか設定に関する質問に答えて終わり。

Debianの場合(?)、既にテーブルとか作られちゃってるので、後はテーブルにデータを入れるだけ。

テーブル構造

SOAテーブル
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(10) unsigned |      | PRI | NULL    | auto_increment |
| origin  | char(255)        |      | UNI |         |                |
| ns      | char(255)        |      |     |         |                |
| mbox    | char(255)        |      |     |         |                |
| serial  | int(10) unsigned |      |     | 1       |                |
| refresh | int(10) unsigned |      |     | 28800   |                |
| retry   | int(10) unsigned |      |     | 7200    |                |
| expire  | int(10) unsigned |      |     | 604800  |                |
| minimum | int(10) unsigned |      |     | 86400   |                |
| ttl     | int(10) unsigned |      |     | 86400   |                |
+---------+------------------+------+-----+---------+----------------+
rr テーブル
+-------+---------------------------------------------------------------------------+------+-----+---------+----------------+
| Field | Type                                                                      | Null | Key | Default | Extra          |
+-------+---------------------------------------------------------------------------+------+-----+---------+----------------+
| id    | int(10) unsigned                                                          |      | PRI | NULL    | auto_increment |
| zone  | int(10) unsigned                                                          |      | MUL | 0       |                |
| name  | char(64)                                                                  |      |     |         |                |
| type  | enum('A','AAAA','ALIAS','CNAME','HINFO','MX','NS','PTR','RP','SRV','TXT') | YES  |     | NULL    |                |
| data  | char(128)                                                                 |      |     |         |                |
| aux   | int(10) unsigned                                                          |      |     | 0       |                |
| ttl   | int(10) unsigned                                                          |      |     | 86400   |                |
+-------+---------------------------------------------------------------------------+------+-----+---------+----------------+

zone は、soa テーブルのIDと対応します。

soa の id 1 が "example.com" であれば、rr zone 1 の name "hoge" は、hoge.example.com についてのデータです。

create tableのSQLは、コマンドオプションで見れますので、自分で作るのも、作りなおすのも簡単。

% mydns --create-tables | mysql mydns

データのインサート

insert into soa (origin, ns) values ('rwds.net.local.', 'ns1.rwds.net.local');
insert into rr (zone, name, type, data) values(1, 'cat', 'A', '127.0.0.1');
insert into rr (zone, name, type, data) values(1, 'dog', 'A', '127.0.0.2');

これで、

cat.rwds.net.local
dog.rwds.net.local

のできあがり。

テスト

% host cat.rwds.net.local 127.0.0.1                                                                                        
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases: 

cat.rwds.net.local has address 127.0.0.1

問題なし。簡単ですねぇ。

tinydnsからの移行

tinydns を使っている場合、移行が簡単にできます。

% mydnsimport -t /service/tinydns/root/data

これだけ。
ですが、なんか微妙に足りてない...サブドメイン無しがひけない。
tinydnsの設定が悪いのか?

設定ファイル

/etc/mydns.confにあります。
Listen のIPの指定くらいしか試してません。

listen = 127.0.0.1      # Listen on these addresses ('*' for all)

いいとこ

Databaseで管理できるので非常に簡単ですね。SQL使えるのはいい感じです。負荷分散に使うには、DBマガジン6月号の記事内にあるパッチを使わなければいけませんが、そちらはまだ試してません。

詳しいドキュメントは、下記。
http://mydns.bboy.net/doc/html/index.html#SEC_Top