如何模拟DNS服务器响应超时?

当由于超时而无法parsing主机名时,我需要testing应用程序的行为。 在/etc/resolv.conf设置nameserver 127.0.0.1不起作用:相关函数立即返回一个exception。 testing装置是一个由Vagrant创build的虚拟机,通过DHCP接收其IP地址。

nameserver 127.0.0.1将无法正常工作,因为默认行为已经是这样了。 相反,请尝试使用不存在的DNS。 为了确保,你可以这样做:

nslookup example.com 192.0.2.10

如果你没有回应,那么你可以使用192.0.2.10作为你的DNS服务器。

当DNS服务器根本没有响应,或没有及时响应时,就会发生连接超时。

第一种可以通过在Linux系统上简单地阻塞所有DNSstream量来模拟,例如:

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

使用DROP作为目标意味着你甚至不会连接被拒绝的错误,这就变成了一个黑洞。 (通常情况下,您不太可能进行区域传输,因此不需要使用UDP来阻止TCP协议。)

创build延迟稍微多一些。 从netem手册 :

 # 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 

这产生了一个200ms的延迟,随机变化为±10ms。

你需要的是一个“黑洞服务器”。 您可以使用blackhole.webpagetest.org72.66.115.13 ),它将默默地放弃所有请求。

为什么我对其他答案提出这个build议,是因为上述服务器是为了这个唯一目的而build立的。

例:

 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 

如果您的testing系统上没有运行DNS服务器,您应该可以使用它的IP地址。

你可以尝试使用未使用的rfc1918地址。

您可以使用服务器的防火墙来阻止目标端口53的传出数据包。