各DNSキャッシュサーバへクエリパケット(a)を送信し、キャッシュサーバから権威サーバへDNSクエリパケット(b)を送信させます。 その応答としてEDNS0のようなDNSレスポンスパケット(c)をキャッシュサーバへ応答した場合、 キャッシュサーバがDNSクライアントへ応答するDNSレスポンスパケット(d)を比較してみました。
+--------+ (a)www.example.com. IN A ? +-------+ (b)www.example.com. IN A ? +------+
| |--------------------------->| |------------------------------>| |
| client | | cache | | auth |
| |<---------------------------| |<------------------------------| |
+--------+ (d)????? +-------+ (c)crafted response +------+
- OS: CentOS 6.6 on VirtualBox
- DNSクライアント: DiG 9.10.2-P3
- IPアドレス: 192.168.33.103
- OS: CentOS 6.6 on VirtualBox
- DNSサーバ
- Bind: 9.10.2-P3
- Unbound: 1.5.4
- PowerDNS Recursor: 3.7.3
- IPアドレス:
- Bind: 192.168.33.101
- Unbound: IPアドレス: 192.168.33.102
- PowerDNS: IPアドレス: 192.168.33.104
- OS: Ubuntu Mate 14.04
- DNSサーバ: C++で作成したDNSパケットを応答するサーバ
- IPアドレス: 192.168.33.1
DNSクライアントから各キャッシュサーバへwww.example.comのAレコードを問い合わせました(a)。 キャッシュサーバは権威サーバへ問い合わせを行い(b)、その応答を受信します(c)。 正しいEDNS0では、ADDITIONAL SECTIONに一つだけOPT pseudo-RRが存在ますが、 ここでは、このルールに反したDNSレスポンスを権威サーバからキャッシュサーバへ応答し(c)、 そのキャッシュサーバがDNSクライアントへ応答するDNSレスポンス(d)を比較しました。
動作を比較するために、キャッシュサーバ上でパケットキャプチャを取得しました。
下記は、通常のレスポンスパケットを応答した時にtcpdumpにて取得したパケットキャプチャのデータへのリンクです。
下記は、2個のOPT pseudo-RRを含むレスポンスパケットを応答した時の、パケットキャプチャのデータです。 このとき、2個のOPT pseudo-RRのペイロードサイズ(CLASS値)は同じ値1280を使用しました。
-
SERVFAIL
を応答しました。 -
NoError
を応答しました。 -
NoError
を応答しました。
下記は、2個のOPT pseudo-RRを含むレスポンスパケットを応答した時の、パケットキャプチャのデータです。 このとき、2個のOPT pseudo-RRのペイロードサイズ(CLASS値)は異なる値1280,1500を使用しました。
-
ServFail
を応答しました。 -
ServFail
を応答しました。 -
NoError
を応答しました。
下記は、ANSWER SECTIONにOPT pseudo-RRを含むレスポンスパケットを応答した時の、パケットキャプチャのデータです。
-
NoError
を応答しました。 -
ServFail
を応答しました。 -
NoError
を応答しました。
下記は、AUTHORITY SECTIONにOPT pseudo-RRを含むレスポンスパケットを応答した時の、パケットキャプチャのデータです。
-
NoError
を応答しました。 -
ServFail
を応答しました。 -
NoError
を応答しました。
下記は、OPT pseudo-RRのドメイン名を*www.example.com*にしたレスポンスパケットを応答した時の、パケットキャプチャのデータです。
-
ServFail
を応答しました。 -
ServFail
を応答しました。 -
NoError
を応答しました。
下記は、OPT pseudo-RRをextend-rcodeを常にBADVERSにしたレスポンスパケットを応答した時の、パケットキャプチャのデータです。
-
ServFail
を応答しました。 -
NoError
を応答しました。 -
NoError
を応答しました。
Bind | Unbound | PowerDNS | |
---|---|---|---|
ケース1:OPT pseudo-RR x 2(同じCLASS) | ServFail | NoError | NoError |
ケース2:OPT pseudo-RR x 2(異なるCLASS) | ServFail | ServFail | NoError |
ケース3:OPT pseudo-RR in ANSWER | NoError | ServFail | NoError |
ケース4:OPT pseudo-RR in AUTHORITY | NoError | ServFail | NoError |
ケース5:OPT pseudo-RRのドメイン名を変更 | ServFail | ServFail | NoError |
ケース6:OPT pseudo-RRのextend-rcodeをBADVERS | ServFail | NoError | NoError |
権威サーバが常にextend-rcode = BADVERSを返す場合、キャッシュサーバのBind 9.10.2-P3は何度も権威サーバへ 問い合わせを行います。そのため、権威サーバとキャッシュサーバ間でクエリ/レスポンスが往復し続けます。 ただし、このクエリ/レスポンスは、無限に継続することはなくresolver-query-time(デフォルト10秒)で止まります。
この現象は、Bind 9.10.3rc1で修正されています。
BADVERS responses from broken authoritative name servers were not handled correctly. [RT #40427]