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


19

当由于超时而无法解析主机名时,我需要测试应用程序的行为。设置nameserver 127.0.0.1/etc/resolv.conf没有工作:相关功能有异常立即返回。测试平台是使用Vagrant创建的VM,可通过DHCP接收其IP地址。

Answers:


11

nameserver 127.0.0.1将无法正常工作,因为默认行为已经如此。而是尝试使用不存在的DNS。要确保,您可以执行以下操作:

nslookup example.com 192.0.2.10

如果没有响应,则可以192.0.2.10用作DNS服务器。


这不能保证会产生超时,因为192.0.2.10可以(尽管不太可能)是真实主机,并且像127.0.0.1一样,它可以在查询后立即返回“端口不可达”。你并不需要选择一台主机,你是肯定没有运行DNS(如您的nslookup命令检查),你需要选择一个主机,你肯定不会回应所有
杰夫·梅登

nslookup example.com non_existent_dns_ip输出:;; connection timed out; trying next origin ;; connection timed out; no servers could be reached
sysfiend '16

4
@JeffMeden您可能知道,但是192.0.2.0/24范围是出于文档目的而保留的,因此不应在任何地方使用(并且任何自重防火墙都将其拒绝为Bogon)。
迪布

2
@Dubu实际上是一个更有趣的警告;根据规范,流量应在路由器处被拒绝,这很可能将“目标主机不可达”返回到堆栈,这又与超时不同。
杰夫·梅登

26

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

可以通过在Linux系统上简单地阻止所有DNS服务器流量来模拟第一个,例如:

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

使用DROP作为目标意味着您甚至都不会收到连接被拒绝的错误,它只是一个黑洞。(通常不太可能进行区域传输,因此除了UDP之外,不需要阻止TCP协议。)

造成延迟要稍微复杂一些。从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的随机变化。


18

您需要的是“黑洞服务器”。您可以使用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

2
就在我以为自己看完了一切的时候;专门执行任何操作的专用服务器。辉煌!(可能只是网络配置,而不是带有全过滤防火墙的实际服务器,但仍然如此)
杰夫·梅登

1
这是一个Raspberry PI,其中设置了防火墙,可以丢弃所有内容,因此它仍然可以路由并响应ARP(只是为了确保流量不会得到ICMP无法访问的响应)。
下午

@pmeenan很有意思!感谢分享!(哇,简直不敢相信您加入了,只是发表评论:D)
凹槽复数

3

如果您未在测试系统上运行DNS服务器,则应该能够使用其IP地址。

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

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


1
某些防火墙还可以返回ICMP数据包,因此超时是即时的。
内森·高斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.