![目标主机无法到达 (ICMP),尽管简单的 ping 即可到达同一主机](https://linux22.com/image/182389/%E7%9B%AE%E6%A0%87%E4%B8%BB%E6%9C%BA%E6%97%A0%E6%B3%95%E5%88%B0%E8%BE%BE%20(ICMP)%EF%BC%8C%E5%B0%BD%E7%AE%A1%E7%AE%80%E5%8D%95%E7%9A%84%20ping%20%E5%8D%B3%E5%8F%AF%E5%88%B0%E8%BE%BE%E5%90%8C%E4%B8%80%E4%B8%BB%E6%9C%BA.png)
我已经在两台直接相互连接的 CentOS 主机上使用端口 179 (BGP) 设置了一些应用程序,但它们似乎无法建立连接,所以我开始tcpdump
检查发生了什么:
$ tcpdump --interface ens20 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens20, link-type EN10MB (Ethernet), capture size 262144 bytes
09:10:53.715981 IP 10.0.5.2.46577 > 10.0.5.3.179: Flags [S], seq 4065918158, win 29200, options [mss 1460,sackOK,TS val 2186333430 ecr 0,nop,wscale 7], length 0
09:10:53.716897 IP 10.0.5.3 > 10.0.5.2: ICMP host 10.0.5.3 unreachable - admin prohibited filter, length 68
09:10:59.179303 ARP, Request who-has 10.0.5.2 tell 10.0.5.3, length 28
09:10:59.179322 ARP, Reply 10.0.5.2 is-at 3e:63:58:e9:a3:d9, length 28
好的,看起来其他主机甚至无法访问。这很奇怪,因为我已经尝试过 ping 并确信它有效。因此,ping -I ens20 10.0.5.2
在主机上再尝试一次10.0.5.3
。 (而且,为了确保我也尝试了相反的效果,效果相同。)
09:11:40.186862 IP 10.0.5.2 > 10.0.5.3: ICMP echo request, id 3941, seq 1, length 64
09:11:40.187309 IP 10.0.5.3 > 10.0.5.2: ICMP echo reply, id 3941, seq 1, length 64
09:11:41.233187 IP 10.0.5.2 > 10.0.5.3: ICMP echo request, id 3941, seq 2, length 64
09:11:41.233570 IP 10.0.5.3 > 10.0.5.2: ICMP echo reply, id 3941, seq 2, length 64
09:11:45.260415 ARP, Request who-has 10.0.5.2 tell 10.0.5.3, length 28
09:11:45.260438 ARP, Reply 10.0.5.2 is-at 3e:63:58:e9:a3:d9, length 28
09:11:45.457134 ARP, Request who-has 10.0.5.3 tell 10.0.5.2, length 28
09:11:45.457418 ARP, Reply 10.0.5.3 is-at ae:e9:68:81:26:dc, length 28
太好了,ping
成功了,我可以联系到房东了。好的,下一个想法:我可以自己通过端口 179 到达另一台主机,例如通过telnet -b 10.0.5.2 10.0.5.3 179
(from 10.0.5.2
)。没有,telnet: connect to address 10.0.5.3: No route to host
。但港口开放了吗?是的,telnet -b 10.0.5.2 10.0.5.3 179
有效(来自10.0.5.3
)。tcpdump
显示了与上述应用程序相同的 telnet 实验错误。
为了完整起见,这里也给出了接口配置(/etc/sysconfig/network-scripts/ifcfg-ens20
):
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens20
UUID=7f8ca407-e96a-497e-865c-972a6f1940d6
DEVICE=ens20
ONBOOT=yes
IPADDR=10.0.5.2
PREFIX=24
(同一主机上还配置了另一个接口,但我希望该接口配置为使用外部 IP 地址,并且不应干扰 10.0.5.0/24。)
这些主机上没有启用防火墙(干净的 CentOS 最小安装),并且这些主机是直接连接的。我不知道为什么一个请求不被允许通过,而另一个则不允许,但可能与多个接口的使用有关。您会在哪里寻找有关正在发生的事情的更多详细信息?
答案1
代码为“目标不可达”且类型为“管理禁止”的 ICMP 数据包是由数据包过滤器生成的,而不是 TCP/IP 堆栈。
nftables
鉴于此, (或遗产)的状态iptables
应该能够明确原因。
正如评论中所发布的,CentOSfirewalld
默认情况下已启用。该软件包提供了firewall-cmd
用于配置防火墙的命令。应添加新规则以打开目标端口。
当然,禁用它firewalld
也是可能的,但前提是您了解风险。