web-dev-qa-db-ja.com

DNSサーバーの応答タイムアウトをシミュレートするにはどうすればよいですか?

タイムアウトのためにホスト名を解決できない場合のアプリケーションの動作をテストする必要があります。設定nameserver 127.0.0.1/etc/resolv.confが機能しませんでした。関連する関数は例外を除いてすぐに戻ります。テストリグは、DHCP経由でIPアドレスを受け取るVagrantで作成されたVMです。

19
synapse

nameserver 127.0.0.1は、デフォルトの動作がすでに動作しているため機能しません。代わりに、存在しないDNSを使用してみてください。確認するには、次のようにします。

nslookup example.com 192.0.2.10

応答がない場合は、DNSサーバーとして192.0.2.10を使用できます。

11
sysfiend

接続タイムアウトは、DNSサーバーがまったく応答しない、またはタイムリーに応答しない場合に発生します。

最初のものは、たとえばLinuxシステム上でDNSサーバーへのすべてのトラフィックを単にブロックすることでシミュレートできます。

# iptables -I OUTPUT -p udp -d <iIP of DNS server> --dport 53 -j DROP

DROPをターゲットとして使用すると、接続拒否エラーが発生することはなく、単なるブラックホールになります。 (通常はゾーン転送を行う可能性は低いため、TCPプロトコルをブロックする必要はありません。)

遅延の作成は少し複雑です。 netem manual から:

# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit  3000
# tc qdisc add dev eth0 parent 30:1 handle 31: netem  delay 200ms 10ms distribution normal
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32  match ip dst <IP_of_DNS_server>/32 flowid 1:3

これにより、±10ミリ秒のランダムな変動で200ミリ秒の遅延が生じます。

26
HBruijn

必要なのは「ブラックホールサーバー」です。 blackhole.webpagetest.org72.66.115.13)を使用すると、すべてのリクエストが通知なしで破棄されます。

これを他の答えよりも推奨するのは、前述のサーバーがこの唯一の目的のために確立されているためです。

例:

barend@shells:~$ Dig example.com @72.66.115.13

; <<>> Dig 9.10.3-P4-Debian <<>> example.com @72.66.115.13
;; global options: +cmd
;; connection timed out; no servers could be reached
18
grooveplex

テストシステムでDNSサーバーを実行していない場合は、そのIPアドレスを使用できるはずです。

未使用の rfc1918 アドレスを使用してみてください。

サーバーのファイアウォールを使用して、宛先ポート53の発信パケットをブロックできます。

3
user9517