NSD4 beta4 vs BIND9.8.1 ~NSDの逆襲~

前回の POST で BIND からの NSD4 の移行について書いたのだが、
その際にテスト程度に走らせたベンチマークについて物議を呼んだので
(NSDがBINDなんかに負けるはずが無い!とか config煮詰めろとか)
NSD4 側の config をいじりながら再度ベンチマークを取ってみた。

そうしたところ、とても興味深い結果が得られたので記しておく。

 

0. 検証環境

CPU : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz stepping 07 × 2

Memory : DDR3 1333 NonReg ECC 16GB

HDD : 146GB 15000rpm SAS RAID 1

OS : Ubuntu 12.04.2

DNS : NSD4 beta4 / BIND9.8.1 -P1(Ubuntu Packege)

 

1. ベンチマーク方法

ベンチの方法は前回と同様に 32110行のクエリを dnsperf に食わせて行う。
クエリを飛ばす側のマシンも上記とほぼ同様のスペックで用意した。

コマンドは下記のとおり。

 # dnsperf -c 16 -s 10.200.4.230 -d querylist -l 300

※10.200.4.230 は被験体

  • nsd.conf の server-count を変更しながらベンチマーク
  • 16クライアント(並列)で300秒クエリを飛ばす

server-count はリクエストを受け付ける nsd の子プロセスの数なので、
多ければ多いほどクエリを捌けるはず(素人考え)

config は下記のとおり Rate limit は Off にしておく。

server:
server-count: 4
username: nsd
zonesdir: “/etc/nsd4/zones”
zonelistfile: “/var/cache/nsd4/zone.list”
database: “/var/cache/nsd4/zone.db”
logfile: “/var/log/nsd4.log”
pidfile: “/var/run/nsd4/nsd4.pid”
xfrdfile: “/var/cache/nsd4/xfrd.state”
rrl-ratelimit: 0
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: “/etc/nsd4/nsd_server.key”
server-cert-file: “/etc/nsd4/nsd_server.pem”
control-key-file: “/etc/nsd4/nsd_control.key”
control-cert-file: “/etc/nsd4/nsd_control.pem”

 

2. ベンチマーク結果

 

表1 BIND と NSD4 の qps 比較

 Server (server-count) qps
BIND9.8.1 -P1 362923.554683
NSD4 b4 (1) 237789.686302
NSD4 b4 (2) 287640.556382
NSD4 b4 (4) 409956.827579
NSD4 b4 (6) 178863.252545
NSD4 b4 (8) 129717.122177
NSD4 b4 (16) 70822.115927

 

nsd4_svcount
図1 NSD4 beta4 server-count と qps

nsd_bind_comp

図2 ベンチマーク中のロードアベレージの推移 (NSD4 beta4/BIND9.8.1-P1)

3. 考察

今回の実験では NSD4の server-count を 4 にした場合は最もパフォーマンスがよく、
サーバへの負荷(ロードアベレージ)も低目の値を推移している。
これはゾーンをバイナリ化してメモリに保持している効果と思われる。

また、当初想定していた結果とは異なり、server-count の値と qps は比例しないという結果が出たのが興味深い。
ハードウェア(CPU) 依存の可能性もあるので、AMD製のCPUなどでも試してみようかと思う。

BIND に関しては qps  で言うと NSD4 に匹敵する値をたたき出しているが、ロードアベレージが高めを推移している。
コスト的にはあまりお得な感じはしないと言えるだろう。

ざっとベンチマークを取り直してみて NSD4 が速いことを証明できたので、
今回の目的は達成できたかな。

 

4. 参考文献

Unbound/NSD最新情報(OSC 2013 Tokyo/Spring) http://www.slideshare.net/ttkzw/unboundnsdosc-2013-tokyospring-16708977

NLnetLabs : DNS Response Rate Limiting as implemented in NSD. http://www.nlnetlabs.nl/blog/tag/nsd4/

BIND9 からの卒業 – PowerDNS 3.0 編

BIND9  の脆弱性の対応に疲れた今日この頃、
なぜ BINDを使っているのか自問自答して欝になりかけた日もある(嘘)

そんなこんなで、 BIND9 との決別を決めた。

次の相棒は今 最もホットでナウい PowerDNSNSD4 (beta)
この Post では PowerDNS にフォーカスする。

0. 検証環境

CPU : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz stepping 07

Memory : DDR3 1333 NonReg ECC 16GB

HDD : 146GB 15000rpm SAS RAID 1

OS : Ubuntu 12.04.2

DNS : PowerDNS 3.0

DB : MySQL 5.5.29

 

1. 構築手順(メモ程度) 

  • MySQL と PowerDNS のパッケージインストール

# apt-get install pdns-server pdns-backend-mysql mysql-server mysql-client

  • MySQL にログインしてデータベースとテーブルを作る

# mysql -u root -p

mysql> create database pdns;

Query OK, 1 row affected (0.00 sec)
Create MySQL User

mysql> GRANT ALL ON pdnstest.* TO ‘pdns’@’localhost’ IDENTIFIED BY ‘hogehogepasswd’;

mysql> FLUSH PRIVILEGES;
Change Database

mysql> use pdns;
Database changed
Create Tables

mysql> create table domains (
id INT auto_increment,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
primary key (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
) Engine=InnoDB;

CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);

create table supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
) Engine=InnoDB;

mysql> quit;

  • コンフィグを編集

ここでは Masterでの動作を念頭において設定している。

# vi /etc/powerdns/pdns.conf

allow-axfr-ips=10.200.8.0/24  # <- AXFRできるネットワーク or IPアドレス
config-dir=/etc/powerdns
daemon=yes
default-soa-name=ns0.mykw.jp  # <- SOAレコードに書くDNSのホスト名
disable-axfr=no
disable-tcp=no
local-port=53
log-dns-details=yes
log-failed-updates=yes
logfile=/var/log/pdns.log
logging-facility=0
loglevel=4
master=yes
module-dir=/usr/lib/powerdns
negquery-cache-ttl=60
setgid=pdns
setuid=pdns
use-logfile=yes
version-string=powerdns
include=/etc/powerdns/pdns.d 

DB接続情報は別ファイルに分けて書く

# vi /etc/powerdns/pdns.d/pdns.local.gmysql
# MySQL Configuration
#
# Launch gmysql backend

launch=gmysql
gmysql-socket=/var/run/mysqld/mysqld.sock  # <-ローカルの DB 使うなら Socket 使った方が
gmysql-user=pdns
gmysql-password=hogehogepasswd
gmysql-dbname=pdns

これで一通り使う準備は完了。

 

2. 既存のゾーンファイルを SQL に変換

PowerDNS には zone2sql という便利な SQL 変換スクリプトが標準で用意されている。

BIND で使っていたゾーンファイルを以下の手順で変換・DBへの投入を行う。
素直に変換できないことが多いので、named.conf 調整しながら変換しよう。

  • ゾーンファイルを変換

# zone2sql –gmysql –dnssec=no –named-conf=/etc/bind/named.conf –start-id=1 > zone.sql

  • 変換したレコードをDBにぶち込む

# mysql -updns -phogehogepasswd pdns < zone.sql

  • 変換したゾーンに MASTER のフラグを立てる

これをしないと AUTOSERIAL が有効にならない。

# mysql -u pdns -phogehogepasswd -e “update pdns.domains set type=’MASTER’;”

詳しい説明については公式サイトの Wiki にお任せしよう。

http://wiki.powerdns.com/trac/wiki/Zone2SQLFAQ

 

これでお引越しは完了したはずだ。

 

3. 動作確認

適当に dig とかして動作確認をしてみよう。

ちゃんと回答が帰ってくれば動いているはずだ。

# dig @10.200.4.230 mykw.jp soa

ついでに dnsperf でベンチマーク

32110 行のクエリリストを食わせて 4thread でいじめてみた

  • PowerDNS
# dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300
DNS Performance Testing Tool
Nominum Version 2.0.0.0

[Status] Command line: dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300
[Status] Sending queries (to 10.200.4.230)
[Status] Started at: Fri Mar 15 18:01:29 2013
[Status] Stopping after 300.000000 seconds
n[Status] Testing complete (time limit)

Statistics:

  Queries sent:         33040355
  Queries completed:    33040355 (100.00%)
  Queries lost:         0 (0.00%)

  Response codes:       NOERROR 32976558 (99.81%), NXDOMAIN 63797 (0.19%)
  Average packet size:  request 36, response 52
  Run time (s):         300.000634
  Queries per second:   110134.283916

  Average Latency (s):  0.000890 (min 0.000144, max 0.431226)
  Latency StdDev (s):   0.001421

ちなみにBINDは以下のような結果になった。

  • BIND 9.8.1-P1

# dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300
DNS Performance Testing Tool
Nominum Version 2.0.0.0

[Status] Command line: dnsperf -c 4 -s 10.200.4.230 -d querylist -l 300
[Status] Sending queries (to 10.200.4.230)
[Status] Started at: Sun Mar 31 00:28:16 2013
[Status] Stopping after 300.000000 seconds

[Status] Testing complete (time limit)

Statistics:

Queries sent: 58084969
Queries completed: 58084969 (100.00%)
Queries lost: 0 (0.00%)

Response codes: NOERROR 57898647 (99.68%), NXDOMAIN 112154 (0.19%), REFUSED 74168 (0.13%)
Average packet size: request 36, response 225
Run time (s): 300.003788
Queries per second: 193614.118632

Average Latency (s): 0.000313 (min 0.000227, max 0.060098)
Latency StdDev (s): 0.000382

 

 

4. まとめ

前項の結果でも分かるように BIND9 は意外に早かった。

とはいえ、今年も夏のアップデート祭り(予定)に参戦するのはイヤということで
しばらく自宅環境はPowerDNSで頑張ってみることにした。

ちなみに今回使ったマシンの前にはRAIDキャッシュなしのマシンで検証していたのだが、
スコアは半分ぐらいであまりふるわない成績だった。
SQL を使っているので Disk I/O に引っ張られる印象があるが、
update が多いようなアプリケーションではないので DISKが遅いマシンでも
querycache をたんまり盛ってあげればそこそこ捌いてくれそうな気がする。

SSDとかNANDフラッシュ系の高級ストレージって楽するという選択もありですかね。
空から iodrive か intel SSD 910 降ってこないかな。

resolvconfd と dnsmasq と libvirt と unbound と私

※忘れそうなのでメモです。

私が会社で使っている作業用サーバはUbuntuのKVM上で動いているFreeBSDです。(ホストのUbuntuも使ってるけど)
気が向いたときにホストのapt-get update/upgradeをするのですが、たまにKernelのアップデートがくると
再起動をしなくてはいけないので、仕方なく再起動をしています。

この時点で resolv.conf を手書きで書き換えていたりすると、楽しいことが起こったりします。

Ubuntu12.04では resolv.conf  の管理を resolvconfd で行っていて、デフォルトではローカルで起動している
リゾルバ(dnsmasq) を参照するように、起動のたびに 127.0.0.1 を参照するように resolv.conf を書き換えてくれるという仕様になっています。

とても親切ですね。

私が仕事で使っている環境は同ホストで unbound を起動してキャッシュリゾルバとしても使用しているので、
dnsmasq が起動されると bind しているアドレス・ポートがかぶって unbound が起動しなかったりで
一筋縄には行かないのです。(dnsmasqの存在を意識していなかった)

ということで、「dnsmasq が邪魔なら dnsmasq を起動しなければ良い!」 という安直な考えに至り、dnsmasq を stop

[email protected]:/# /etc/init.d/dnsmasq stop
* Stopping DNS forwarder and DHCP server dnsmasq
…done.
[email protected]:/#

これで、安心だろ。
と、おもって KVM の FreeBSD (ゲスト)にログインするとネットワークがつながらない・・・
libvirt で仮想マシンを管理しているので、dnsmasq を切ってしまうとどうやら外に出られなくなるみたいだ(詳しくは調べてません)

「そうしたら  dnsmasq と unbound を共存させればいいんだろ?」という安直な考えに至り、 conf を編集

[email protected]:/# vi /etc/unbound/unbound.conf

server:
interface: 192.168.10.70

(略)

 

[email protected]:/# vi /etc/dnsmasq.conf

listen-address=127.0.0.1
bind-interfaces

これでデーモンを再起動すれば dnsmasq/unbound が共存できます。

ちなみに、前置きが長くなりましたが、ここからが本編です。
resolvconfd の挙動が良く分からなかったので今回はじっくり観察してみました。

Googleなんかで “ubuntu 12.04 resolv.conf” などと検索すると、
大抵のBlog記事は /etc/resolvconf/resolv.conf.d/ 以下のファイルを編集しろと書かれています。

[email protected]:/etc/resolvconf/resolv.conf.d# ls
base  head  original

ここで引っかかりました。
いくら編集して、resolvconfd/networking/server再起動しても  resolv.conf が思ったように書き換わらないので、
Ubuntuのマニュアルをよく読んでみた。

http://manpages.ubuntu.com/manpages/precise/man8/resolvconf.8.html

/etc/network/interfaces を編集すればよいことが判明。(ちゃんと書いてあるじゃん)
オフィシャルなマニュアルをちゃんと読まないと遠回りしてしまうんですね。

ということで  /etc/network/interfaces を以下のようにしてみた

auto br0
iface br0 inet static
address 192.168.10.70
network 192.168.0.0
netmask 255.255.0.0
broadcast 192.168.255.255
gateway 192.168.0.1
dns-nameservers 192.168.10.70 192.168.0.20 8.8.8.8
dns-domain hoge.com
dns-search fuga.net foo.com
bridge_ports eth0
bridge_stp off

iface eth0 inet manual

どうやら “dns-*” な行を読み取って resolv.conf を読みよってくれるようなので、
これでネットワークをリスタートして resolv.conf を見てみましょう。

[email protected]:/# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND — YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search choge.com fuga.net foo.com
[email protected]:/#

nameserver が 127.0.0.1 になっていますが、心配ありません。
dnsmasq がロードしている conf を参照すると以下のようになっています。

[email protected]:/# cat /var/run/dnsmasq/resolv.conf
nameserver 192.168.10.70
nameserver 192.168.0.20
nameserver 8.8.8.8

コレに気づかず30分ぐらい時間を無駄にしました。

ちなみに、 dnsmasq や unbound などのデーモンが起動していない(起動しない)環境では /etc/resolv.conf の
nameserver  は 127.0.0.1 ではなく、 /etc/networl/interfaces に書かれている dns-nameservers の値が明示的に入るようです。

親切というか、なんと言うか、今までの掟的なものが頭から離れないとハマること間違いなしですね。

BIND9とAAAAレコードと私(追記あり)

自分のBlogを自宅サーバに移転していてDNSのゾーンファイルを弄っていたのですが変な挙動をしたのでメモします。

バージョンはUbuntuのパッケージ最新版の

sakura# named -v
BIND 9.7.0-P1
sakura#

です。

IPv6ユーザとしてはAレコードよりAAAAレコードが好きなので以下のようにゾーンを定義しました。

 

ゾーンファイル(Before)

sakura# cat yutarommx.com.zone
$TTL   180
@               IN SOA  yutarommx.com.  yutaro.mykw.jp. (
2012041506     ; serial (d. adams)
3H             ; refresh
15M            ; retry
1W             ; expiry
15M)           ; minimum

IN NS           ns0.mykw.jp.
IN NS           ns1.mykw.jp.

IN AAAA         240f:1:33f2:1::beef
www             IN AAAA         240f:1:33f2:1::beef
IN A            124.214.243.203
www             IN A            124.214.243.203

tumblr          IN A            72.32.231.8

そうしたところ、家のPCからはBlogが見えるのですが、リモートで繋いでいた会社(IPv4)から閲覧ができないorz
何だろなとおもい、自宅サーバから dig してみたところ、以下のような結果が。

AAAAレコードの結果(Before)

micro# dig @ns0.mykw.jp yutarommx.com aaaa

; <<>> DiG 9.7.0-P1 <<>> @ns0.mykw.jp yutarommx.com aaaa
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51434
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;yutarommx.com.                 IN      AAAA

;; ANSWER SECTION:
yutarommx.com.          180     IN      AAAA    240f:1:33f2:1::beef

;; AUTHORITY SECTION:
yutarommx.com.          180     IN      NS      ns1.mykw.jp.
yutarommx.com.          180     IN      NS      ns0.mykw.jp.

;; ADDITIONAL SECTION:
ns0.mykw.jp.            180     IN      A       49.212.22.200
ns0.mykw.jp.            180     IN      AAAA    2001:e41:31d4:16c8::1
ns1.mykw.jp.            180     IN      A       183.181.172.61
ns1.mykw.jp.            180     IN      AAAA    2001:2e8:603:0:2:1:0:3d

;; Query time: 15 msec
;; SERVER: 2001:e41:31d4:16c8::1#53(2001:e41:31d4:16c8::1)
;; WHEN: Sun Apr 15 12:08:35 2012
;; MSG SIZE  rcvd: 190

Aレコードの結果(Before)

micro# dig @ns0.mykw.jp yutarommx.com a

; <<>> DiG 9.7.0-P1 <<>> @ns0.mykw.jp yutarommx.com a
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50777
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;yutarommx.com.                 IN      A

;; AUTHORITY SECTION:
yutarommx.com.          180     IN      SOA     yutarommx.com. yutaro.mykw.jp. 2012041509 10800 900 604800 900

;; Query time: 15 msec
;; SERVER: 2001:e41:31d4:16c8::1#53(2001:e41:31d4:16c8::1)
;; WHEN: Sun Apr 15 12:08:30 2012
;; MSG SIZE  rcvd: 81

むむ!!?

Aレコードが引けてない・・・・
ということで以下のように書き換えてみたところ・・・

 

ゾーンファイル(Before2)

sakura# cat yutarommx.com.zone
$TTL   180
@               IN SOA  yutarommx.com.  yutaro.mykw.jp. (
2012041510     ; serial (d. adams)
3H             ; refresh
15M            ; retry
1W             ; expiry
15M)           ; minimum

IN NS           ns0.mykw.jp.
IN NS           ns1.mykw.jp.

IN A            124.214.243.203
www             IN A            124.214.243.203
IN AAAA         240f:1:33f2:1::beef
www             IN AAAA         240f:1:33f2:1::beef

tumblr          IN A            72.32.231.8

AAAAレコードの結果(Before2)

 

micro# dig @ns0.mykw.jp yutarommx.com aaaa

; <<>> DiG 9.7.0-P1 <<>> @ns0.mykw.jp yutarommx.com aaaa
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;yutarommx.com.                 IN      AAAA

;; AUTHORITY SECTION:
yutarommx.com.          180     IN      SOA     yutarommx.com. yutaro.mykw.jp. 2012041510 10800 900 604800 900

;; Query time: 15 msec
;; SERVER: 2001:e41:31d4:16c8::1#53(2001:e41:31d4:16c8::1)
;; WHEN: Sun Apr 15 12:29:57 2012
;; MSG SIZE  rcvd: 81

Aレコードの結果(Before2)

micro# dig @ns0.mykw.jp yutarommx.com a

; <<>> DiG 9.7.0-P1 <<>> @ns0.mykw.jp yutarommx.com a
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37995
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;yutarommx.com.                 IN      A

;; ANSWER SECTION:
yutarommx.com.          180     IN      A       124.214.243.203

;; AUTHORITY SECTION:
yutarommx.com.          180     IN      NS      ns0.mykw.jp.
yutarommx.com.          180     IN      NS      ns1.mykw.jp.

;; ADDITIONAL SECTION:
ns0.mykw.jp.            180     IN      A       49.212.22.200
ns0.mykw.jp.            180     IN      AAAA    2001:e41:31d4:16c8::1
ns1.mykw.jp.            180     IN      A       183.181.172.61
ns1.mykw.jp.            180     IN      AAAA    2001:2e8:603:0:2:1:0:3d

;; Query time: 15 msec
;; SERVER: 2001:e41:31d4:16c8::1#53(2001:e41:31d4:16c8::1)
;; WHEN: Sun Apr 15 12:29:41 2012
;; MSG SIZE  rcvd: 178

 

今度はAAAAレコードが返ってこない・・・
次にサブドメイン(FQDN)を揃えつつAレコードを優先して定義してみた。

ゾーンファイル(After)

sakura# cat yutarommx.com.zone
$TTL   180
@               IN SOA  yutarommx.com.  yutaro.mykw.jp. (
2012041507     ; serial (d. adams)
3H             ; refresh
15M            ; retry
1W             ; expiry
15M)           ; minimum

IN NS           ns0.mykw.jp.
IN NS           ns1.mykw.jp.

IN A            124.214.243.203
IN AAAA         240f:1:33f2:1::beef
www             IN A            124.214.243.203
www             IN AAAA         240f:1:33f2:1::beef

tumblr          IN A            72.32.231.8

AAAAレコードの結果(After)

micro# dig @ns0.mykw.jp yutarommx.com a

; <<>> DiG 9.7.0-P1 <<>> @ns0.mykw.jp yutarommx.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62064
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;yutarommx.com.                 IN      A

;; ANSWER SECTION:
yutarommx.com.          180     IN      A       124.214.243.203

;; AUTHORITY SECTION:
yutarommx.com.          180     IN      NS      ns1.mykw.jp.
yutarommx.com.          180     IN      NS      ns0.mykw.jp.

;; ADDITIONAL SECTION:
ns0.mykw.jp.            180     IN      A       49.212.22.200
ns0.mykw.jp.            180     IN      AAAA    2001:e41:31d4:16c8::1
ns1.mykw.jp.            180     IN      A       183.181.172.61
ns1.mykw.jp.            180     IN      AAAA    2001:2e8:603:0:2:1:0:3d

;; Query time: 16 msec
;; SERVER: 2001:e41:31d4:16c8::1#53(2001:e41:31d4:16c8::1)
;; WHEN: Sun Apr 15 12:39:01 2012
;; MSG SIZE  rcvd: 178

Aレコードの結果(After)

micro# dig @ns0.mykw.jp yutarommx.com aaaa

; <<>> DiG 9.7.0-P1 <<>> @ns0.mykw.jp yutarommx.com aaaa
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64265
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;yutarommx.com.                 IN      AAAA

;; ANSWER SECTION:
yutarommx.com.          180     IN      AAAA    240f:1:33f2:1::beef

;; AUTHORITY SECTION:
yutarommx.com.          180     IN      NS      ns1.mykw.jp.
yutarommx.com.          180     IN      NS      ns0.mykw.jp.

;; ADDITIONAL SECTION:
ns0.mykw.jp.            180     IN      A       49.212.22.200
ns0.mykw.jp.            180     IN      AAAA    2001:e41:31d4:16c8::1
ns1.mykw.jp.            180     IN      A       183.181.172.61
ns1.mykw.jp.            180     IN      AAAA    2001:2e8:603:0:2:1:0:3d

;; Query time: 16 msec
;; SERVER: 2001:e41:31d4:16c8::1#53(2001:e41:31d4:16c8::1)
;; WHEN: Sun Apr 15 12:39:21 2012
;; MSG SIZE  rcvd: 190

micro#

今度はちゃんと返ってきた。

教訓:FQDNはソートしてAAAAレコードはAレコードより後に書こう!(Aレコードを併記する場合)

これって昔の公務員より融通が利かないなw

この辺の挙動はバンディー君に期待しましょう。

 

追記

ブログを投稿した後に某JP〇〇の @OrangeMorishita 氏からご指摘がございました。
以下、引用文

これ、正しい動作なんじゃないかな。INの前の名前を省略した場合、*直前の行の*継続行になります。
なので、beforeの例ではIN A 124.214.243.203はwwwの継続行だし、before2の例ではIN AAAA 240f:1:33f2:1::beefはwwwの継続行になります。

なるほど、INの前を省略すると勝手にOriginのドメインが補完されると思っていたのですが、
そうではなく空白の場合は前の行の内容を引き継ぐとのことだそうです。

ということは、こんな書き方もできるということですね!

sakura# cat yutarommx.com.zone
$TTL   180
@               IN SOA  yutarommx.com.  yutaro.mykw.jp. (
2012041513     ; serial (d. adams)
3H             ; refresh
15M            ; retry
1W             ; expiry
15M)           ; minimum

IN NS           ns0.mykw.jp.
IN NS           ns1.mykw.jp.

IN AAAA         240f:1:33f2:1::beef
IN A            124.214.243.203

www                     IN A            124.214.243.203
IN AAAA         240f:1:33f2:1::beef

tumblr                  IN A            72.32.231.8
sakura#

 

ほんとにこんなんで大丈夫なのかなと思いながら dig してみると。

wktk# dig @ns0.mykw.jp yutarommx.com a +short
124.214.243.203

wktk# dig @ns0.mykw.jp yutarommx.com aaaa +short
240f:1:33f2:1::beef

wktk# dig @ns0.mykw.jp www.yutarommx.com a +short
124.214.243.203

wktk# dig @ns0.mykw.jp www.yutarommx.com aaaa +short
240f:1:33f2:1::beef

お!ちゃんと引けているではないですか!

ゾーンファイルの内容がわかりづらいのでわかってないと気持ち悪いけど、
ルールがわかってすっきりしました。

森下氏 ありがとうございました!

お家でUnboundつかってISPのDNSポイズニングから逃れてみる

数年前の話題だが、児童ポルノ法の施工に伴って、ISPのDNSキャッシュ汚染が常習的に行われるようになったのですが、
そんな自由を侵すようなリゾルバは使ってられないということ(嘘)で自宅にもUnboundを導入してみました。

※本当は自宅サービスサーバのユーザが増えてきたので、何となくLAN内でリゾルバを持ちたくなっただけ。

0. 運用環境

OS : Ubuntu 10.04 LTS
HW : HP Proliant MicroServer

1. apt-get で インストール

ゆとり世代なのでapt-getでインストール。
apt 簡単でいいね。

micro# apt-get install unbound

2. ルートヒントファイルをダウンロードしておく

これがないと、どこに聞きに行くのかわからない。はず。(なくても名前解決できたけどね。)

micro# cd /etc/unbound && wget ftp://FTP.INTERNIC.NET/domain/named.cache

3. confを目的・環境に合わせて書き換える

自分の場合は自宅内のローカルからのみ名前解決できるようするのが目的だったので、
以下の箇所を書き換えた。ちなみにIPv6を使わない場合はv6系の項目は無視しておk

micro# diff -u unbound.conf.def unbound.conf
— unbound.conf.def    2012-04-14 16:33:20.268064334 +0900
+++ unbound.conf        2012-04-14 16:47:19.748193075 +0900
@@ -34,7 +34,10 @@
# specify 0.0.0.0 and ::0 to bind to all available interfaces.
# specify every interface[@port] on a new ‘interface:’ labelled line.
# The listen interfaces are not changed on reload, only on restart.
–       # interface: 192.0.2.153
+       interface: 127.0.0.1
+       interface: 192.168.0.128
+       interface: ::1
+       interface: 240f:1:33f2:1::cafe
# interface: 192.0.2.154
# interface: [email protected]
# interface: 2001:DB8::5
@@ -44,7 +47,7 @@
# interface-automatic: no

# port to answer queries from
–       # port: 53
+       port: 53

# specify the interfaces to send outgoing queries to authoritative
# server from by ip-address. If none, the default (all) interface
@@ -116,7 +119,7 @@

# the time to live (TTL) value cap for RRsets and messages in the
# cache. Items are not cached for longer. In seconds.
–       # cache-max-ttl: 86400
+       cache-max-ttl: 86400

# the time to live (TTL) value for cached roundtrip times and
# EDNS version information for hosts. In seconds.
@@ -137,16 +140,16 @@
# infra-cache-lame-size: 10k

# Enable IPv4, “yes” or “no”.
–       # do-ip4: yes
+       do-ip4: yes

# Enable IPv6, “yes” or “no”.
–       # do-ip6: yes
+       do-ip6: yes

# Enable UDP, “yes” or “no”.
–       # do-udp: yes
+       do-udp: yes

# Enable TCP, “yes” or “no”.
–       # do-tcp: yes
+       do-tcp: yes

# Detach from the terminal, run in background, “yes” or “no”.
# do-daemonize: yes
@@ -157,9 +160,11 @@
# Choose deny (drop message), refuse (polite error reply),
# allow (recursive ok), allow_snoop (recursive and nonrecursive ok)
# access-control: 0.0.0.0/0 refuse
–       # access-control: 127.0.0.0/8 allow
+       access-control: 127.0.0.0/8 allow
+       access-control: 192.168.0.0/24 allow
# access-control: ::0/0 refuse
–       # access-control: ::1 allow
+       access-control: ::1 allow
+       access-control: 240f:1:33f2:1::0/64 allow
# access-control: ::ffff:127.0.0.1 allow

# if given, a chroot(2) is done to the given directory.
@@ -214,7 +219,7 @@

# file to read root hints from.
# get one from ftp://FTP.INTERNIC.NET/domain/named.cache
–       # root-hints: “”
+       root-hints: “/etc/unbound/named.cache”

# enable to not answer id.server and hostname.bind queries.
# hide-identity: no
@@ -437,27 +442,27 @@
remote-control:
# Enable remote control with unbound-control(8) here.
# set up the keys and certificates with unbound-control-setup.
–       # control-enable: no
+       control-enable: yes

# what interfaces are listened to for remote control.
# give 0.0.0.0 and ::0 to listen to all interfaces.
–       # control-interface: 127.0.0.1
–       # control-interface: ::1
+       control-interface: 127.0.0.1
+       control-interface: ::1

# port number for remote control operations.
–       # control-port: 953
+       control-port: 953

# unbound server key file.
–       # server-key-file: “/etc/unbound/unbound_server.key”
+       server-key-file: “/etc/unbound/unbound_server.key”

# unbound server certificate file.
–       # server-cert-file: “/etc/unbound/unbound_server.pem”
+       server-cert-file: “/etc/unbound/unbound_server.pem”

# unbound-control key file.
–       # control-key-file: “/etc/unbound/unbound_control.key”
+       control-key-file: “/etc/unbound/unbound_control.key”

# unbound-control certificate file.
–       # control-cert-file: “/etc/unbound/unbound_control.pem”
+       control-cert-file: “/etc/unbound/unbound_control.pem”

# Stub zones.
# Create entries like below, to make all queries for ‘example.com’ and
micro#

4. リモートコントロールできるようにする

unbound-control を使えるようにするために秘密鍵、公開鍵を生成。
unbound-control は BIND でいうところの rndc ですね。

# unbound-control-setup
setup in directory /etc/unbound
generating unbound_server.key
Generating RSA private key, 1024 bit long modulus
………………..++++++
………………………….++++++
e is 65537 (0x10001)
generating unbound_control.key
Generating RSA private key, 1024 bit long modulus
……….++++++
..++++++
e is 65537 (0x10001)
create unbound_server.pem (self signed certificate)
create unbound_control.pem (signed client certificate)
Signature ok
subject=/CN=unbound-control
Getting CA Private Key
Setup success. Certificates created. Enable in unbound.conf file to use
micro#

5. Unboundを再起動する

micro# /etc/init.d/unbound restart
* Restarting recursive DNS server unbound                                                                       [ OK ]
micro#

6. 名前解決ができるか確認

とりあえずローカルホストから確認。
LAN内のほかのホストからも確認した方が良い。

micro# dig @localhost mykw.jp

; <<>> DiG 9.7.0-P1 <<>> @localhost mykw.jp
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13101
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4

;; QUESTION SECTION:
;mykw.jp.                       IN      A

;; ANSWER SECTION:
mykw.jp.                180     IN      A       180.222.80.63

;; AUTHORITY SECTION:
mykw.jp.                180     IN      NS      ns0.mykw.jp.
mykw.jp.                180     IN      NS      ns1.mykw.jp.

;; ADDITIONAL SECTION:
ns0.mykw.jp.            180     IN      A       49.212.22.200
ns0.mykw.jp.            180     IN      AAAA    2001:e41:31d4:16c8::1
ns1.mykw.jp.            180     IN      A       183.181.172.61
ns1.mykw.jp.            180     IN      AAAA    2001:2e8:603:0:2:1:0:3d

;; Query time: 15 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Apr 14 17:00:02 2012
;; MSG SIZE  rcvd: 165

micro#

7. リモートコントロールの動作確認

ステータスが取れれば成功

micro# unbound-control status
version: 1.4.1
verbosity: 1
threads: 1
modules: 2 [ validator iterator ]
uptime: 4 seconds
unbound (pid 5050) is running…
micro#

 

これでISPのDNSポイズニングから抜け出せますね。

めでたしめでたし

 

参考資料・サイト

日本Unboundユーザ会 http://unbound.jp/

 

dnsperf で DNS DoS(違) ベンチマーク

大先生に教わりながら仕事で使ったので忘備録

 

0. 検証環境

筐体:IBM System X3550M2
OS:Ubuntu Server 11.10

 

1. 必要そうなパッケージを入れる

mykw# apt-get install bind9utils libbind-dev libkrb5-dev libssl-dev libcap-dev libxml2-dev gnuplot

GNU Plotは resperf-report するときに使うのかな。

2. ソースを拾って展開して make


mykw# wget ftp://ftp.nominum.com/pub/nominum/dnsperf/1.0.1.0/dnsperf-src-1.0.1.0-1.tar.gz

mykw# tar xzf dnsperf-src-1.0.1.0-1.tar.gz && cd dnsperf-src-1.0.1.0-1

mykw# ./configure prefix=/usr/local

mykw# make && make install

 

3. 実行してみる

初めに以下のようなリストを作る

mykw# cat domainlist

www.wktk.so A
yutarommx.com A

 

クエリー飛ばす先と、リストファイル名、実行時間を引数に入れて実行。


mykw# dnsperf -s ${DIST}  -d ${domainlist} -l ${exectime}

mykw# dnsperf -s 192.168.10.139  -d domainlist -l 60

 

ほかにもいろいろオプションがある模様。


mykw# dnsperf –help

DNS Performance Testing Tool

Nominum Version 1.0.1.0

dnsperf: invalid option — ‘-‘

Usage: dnsperf [-d datafile] [-s server_addr] [-p port]
               [-b bufsize] [-f family] [-e] [-D]
               [-y name:secret] [-v] [-A] [-h]
               [-q num_queries] [-t timeout] [-Q max_qps] [-1] [-l limit]
               [-c] [-H histogram_buckets] [-T histogram_seconds] [-u]
  -d specifies the input data file (default: stdin)
  -s sets the server to query (default: 127.0.0.1)
  -p sets the port on which to query the server (default: 53)
  -b set socket send/receive buffer size in kilobytes (default: 32 k)
  -f specify address family of DNS transport, inet or inet6 (default: any)
  -e enable EDNS 0
  -D set the DNSSEC OK bit (implies EDNS)
  -y specifies the TSIG name and secret (no default)
  -A report command-line arguments
  -h print this usage
  -q specifies the maximum number of queries outstanding (default: 20)
  -t specifies the timeout for query completion in seconds (default: 5)
  -Q limit the number of queries per second (no default)
  -1 run through input only once (default: multiple iff limit given)
  -l specifies how a limit for how long to run tests in seconds (no default)
  -c print the number of packets with each rcode
  -H print a response latency histogram with this many buckets
  -T include latencies up to this many seconds in histogram (use with -H)
  -u send dynamic updates instead of queries
  -v verbose: report the RCODE of each response on stdout

 

 5. 実行結果

mykw# dnsperf -s dti.mykw.jp -d domainlist -l 30

DNS Performance Testing Tool

Nominum Version 1.0.1.0

[Status] Processing input data
[Status] Sending queries (to 2001:2e8:603:0:2:1:0:3d)
[Status] Testing complete

Statistics:

Parse input file:     multiple times
Run time limit:       30 seconds
Ran through file:     12836 times

Queries sent:         25672 queries
Queries completed:    25672 queries
Queries lost:         0 queries

Avg request size:     28 bytes
Avg response size:    175 bytes

Percentage completed: 100.00%
Percentage lost:        0.00%

Started at:           Thu Mar 15 02:04:21 2012
Finished at:          Thu Mar 15 02:04:51 2012
Ran for:              30.113407 seconds

Queries per second:   852.510644 qps

mykw#

 

ちなみに、マルチコアな筐体で動かく場合はコア分並行して実行しないと全力投球できない模様。
そのような場合は screen を使うか、シェルスクリプト等で対応する形になるもよう。