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

syn*_*pse 20 domain-name-system linux linux-networking

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

HBr*_*ijn 26

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

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

# iptables -I OUTPUT -p udp -d <iIP of DNS server> --dport 53 -j DROP
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

这会产生 200 毫秒的延迟,具有 ± 10 毫秒的随机变化。


gro*_*lex 20

你需要的是一个“黑洞服务器”。您可以使用blackhole.webpagetest.org( 72.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
Run Code Online (Sandbox Code Playgroud)

  • 就在我以为我已经看到这一切的时候;一个专门做的专用服务器......什么都没有。杰出的!(可能只是一个网络配置的东西,而不是一个带有过滤器防火墙的实际服务器,但仍然) (2认同)

sys*_*end 11

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

nslookup example.com 192.0.2.10

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

  • @JeffMeden 你可能知道,但范围 192.0.2.0/24 [保留用于文档目的](https://tools.ietf.org/html/rfc5737),所以它不应该在任何地方使用(并且被拒绝作为一个bogon通过任何自尊的防火墙)。 (4认同)
  • @Dubu 这实际上是一个更有趣的警告;根据规范,应该在路由器上拒绝流量,这可能会将“目标主机无法访问”返回给堆栈,这又与超时不同。 (2认同)