
DNS リゾルバ VM の最大 QPS (1 秒あたりのクエリ数) を見つけようとしています。
私たちのインフラストラクチャは Azure でホストされており、Azure ネイティブ DNS ( ) とオンプレミス DNS を照会するリゾルバとして機能する VM (バインド ベース) があります168.63.129.16
。リゾルバでクエリをキャッシュしておらず、各 A レコードの TTL は 300 秒です。
dnsperf
&を使用してresperf
負荷をトリガーしています (A レコードのみ)。現在、最大 100K QPS の DDOS 攻撃に耐えられるように DNS リゾルバーを準備しています。リゾルバーと Azure ネイティブ DNS リゾルバー間のクエリ レート制限などの問題に直面しています。この結果、QPS が増加すると、リゾルバーはクライアントに応答を返します。ただし、リゾルバーとオンプレミス ベースの DNS 間では応答がSERVFAIL
見られませんでした。SERVFAIL
Azure DNS をターゲットにしているときに確認できた最大 QPS は約 2100 です。Azure によってこのようなレート制限が行われているかどうかをオンラインでたくさん検索しましたが、関連するものは見つかりませんでした。2K QPS は Azure インフラストラクチャの規模に対して非常に低いため、リゾルバ VM がボトルネックになっているのではないかと思います。
いくつかの変更 (カーネル sysctl の変更) を自分の側で行いましたが、少しは改善されましたが、それほど大きな改善はありませんでした。
バインド構成の変更::
recursive-clients
から1000
->30000
26214400
バッファ障害を停止するには、UDP バッファをより高い値に設定します。
net.core.rmem_max
net.core.rmem_default
ローカル ポート範囲は から で
32768 61000
、1024 61000
DNS に使用できる最大ポート数は です::
net.ipv4.ip_local_port_range
その他の変更::
txqueuelen
から1000
->20000
ulimits
100000に変更net.netfilter.nf_conntrack_max
はるかに高い値に変更されました
上記に加えて、VM サイズを (1 コア、2 GB RAM) -> (4 コア、8 GB RAM) に増やしました。増やした後、パケット エラーは消えましたが (確認済みnetstat -s
)、エラーは改善されませんでしたSERVFAIL
。
tcpdump
エラーのパターンをチェックできるようにしましたSERVFAIL
。失敗した場合、リゾルバーは Azure DNS にクエリを 5 回 (1 秒ごとに) 送信しようとしますが、Azure DNS から何も受信していないため、応答をSERVFAIL
クライアントに返します。pcap
ファイルを にロードすると、Azure DNS は に応答を返しますが、すでにクライアントに応答を送信していることWireshark
がわかります。resolver
resolver
SERVFAIL
応答を得る前に接続が閉じられるのはなぜですか? 現在は数秒間net.netfilter.nf_conntrack_udp_timeout
そのまま残されます30
が、5 秒後にクライアントにresolver
送信されます。SERVFAIL
以下は、::tcpdump
中のログです。ServFail
reading from file dns4.pcap, link-type EN10MB (Ethernet)
10.0.0.10.57710 > 10.0.0.11.domain: [udp sum ok] 1612+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.44513 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x8cfd!] 52637+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=4096 DO (77)
10.0.0.11.32378 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x3950!] 20672+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.59973 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0xe2e5!] 15199+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.29976 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0x051b!] 47104+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.43442 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0xe791!] 41199+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.domain > 10.0.0.10.57710: [bad udp cksum 0x2a89 -> 0x5e30!] 1612 ServFail q: A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. 0/0/0 (66)
下の行からわかるように、ServFail
5 回の試行後に送信されます。
ここまで読んでくださった方は、この長い質問を読んでくださったことに感謝いたします。これはあまりにも無理なお願いだとは思いますが、ボトルネックが何なのか私にはわからないので、何かヒントがあれば教えていただけるとありがたいです。
元々はsuperuserに投稿されましたここ
答え1
それで、私の質問に答えます。
実際、Azure では 1 秒あたりのクエリ数が1000
VM ごとにレート制限されています。
文書化されているここどのようなsysctl
チューニングを行っても、このレート制限のために Azure で問題が発生します。