Linux PC 向 DNS 服务器发送“ICMP udp 端口​​不可达”

Linux PC 向 DNS 服务器发送“ICMP udp 端口​​不可达”

因此,在我的系统日志中挖掘我注意到很多 ICMP 数据包被我们的 ASA 标记:

 %ASA-4-313005: No matching connection for ICMP error message: icmp src Internet:x.x.21.122 dst MGMT:x.x.36.55 (type 3, code 3) on Internet interface.  Original IP payload: udp src x.x.36.55/53 dst x.x.21.122/47927.

在 ICMP 回复的发起者(xxx122,一台 Linux 机器)上执行 tcpdump 时,我注意到已发送 DNS 查询请求,一段时间后,DNS 服务器回复。回复后,Linux 服务器立即向 DNS 服务器发送一条消息,表示端口无法访问。请参见下文:

19:29:06.684523 IP x.x.21.122.47927 > DNS.domain: 7182+ PTR? x.x.x.x.in-addr.arpa. (43)
19:29:11.690336 IP x.x.21.122.33897 > DNS.domain: 58231+ PTR? x.x.x.x.in-addr.arpa. (45)
19:29:13.850887 IP DNS.domain > x.x.21.122.47927: 7182 ServFail 0/0/0 (43)
19:29:13.850929 IP x.x.21.122 > DNS: ICMP x.x.21.122 udp port 47927 unreachable, length 79

19:29:16.692581 IP x.x.21.122.33897 > DNS.domain: 58231+ PTR? x.x.x.x.in-addr.arpa. (45)
19:29:21.697217 IP x.x.21.122.42976 > DNS.domain: 19120+ PTR? x.x.x.x.in-addr.arpa. (45)
19:29:22.977289 IP DNS.domain > x.x.21.122.42976: 19120 ServFail 0/0/1 (56)
19:29:22.977342 IP DNS.domain > x.x.21.122.33897: 58231 ServFail 0/0/0 (45)
19:29:22.977382 IP x.x.21.122 > DNS: ICMP x.x.21.122 udp port 33897 unreachable, length 81

我认为 Linux 机器可能只是等待 DNS 回复的时间不够长,因此我增加了等待时间/etc/resolv.conf...但没有运气。

我知道 Linux PC 正在进行反向 DNS 查找,而 DNS 服务器回复说它无法解析该名称(因为该名称在 DNS 服务器中不存在。它查询的特定主机由于某种原因在 DNS 中没有条目)。这就是请求花费这么长时间的原因。但我只是想找出如何修改 Linux PC,以便它不会在每次发生这种情况时发送这些 ICMP 消息。

如果有人能帮助我弄清楚如何阻止这些消息出现,我将不胜感激。

使用 show run | inc icmp 进行 ASA 配置

 ASA# show run | inc icmp
    icmp unreachable rate-limit 1 burst-size 1
    icmp permit any echo Internet
    icmp permit any echo-reply Internet
    icmp permit any echo DATA
    icmp permit any echo-reply DATA
    timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 icmp 0:00:02

答案1

这听起来很熟悉,而且我在基于 Linux 的服务中也看到过同样的行为。

这是一种特定于应用程序的行为,尽管我不记得我在哪个应用程序中跟踪过这个行为......或者即使我确实将它跟踪到某个应用程序......

基本上,相关应用程序使用常规 libC 解析器执行自己的 DNS 查找(这在类似nscd或 之类的程序dnsmasqd未作为本地缓存运行的情况下是正常的),并且在响应返回之前关闭客户端套接字。由于响应返回并且该(未连接的 UDP)套接字上不再有任何监听,因此它会以端口不可访问来响应。

有两点可以改进:

1)使用客户端 DNS 缓存(如果您关心短 TTL,最好不要使用 nscd)

2)(未经测试)在 OUTPUT 链上丢弃发往端口 UDP/53 的 ICMP 不可达数据包

我建议前者是首选解决方案,这可能解释了为什么你不会在 Windows 机器(具有本地缓存​​)上看到这种情况

答案2

尝试将所有来自 xx21.122 的流量传递到您的 DNS。如果错误消失 - 那么您应该改进防火墙规则。

根据您提供的日志,我们在端口 39132 上找不到任何连接。另外,请发布您的 asa 配置。

答案3

如果客户端配置了多个 DNS 服务器,它可能会同时尝试多个。它将接受第一个响应并关闭该请求的端口,因此后续响应将获得 ICMP 响应。

相关内容