无法 ping 通我的 IP 地址

无法 ping 通我的 IP 地址

我无法 ping 运行 Ubuntu 的机器的 IP 地址。我尝试使用外部 VPS ping 机器,但仍然没有成功。我打开了端口 80 (TCP),尽管我认为这没有必要。我相信这与我的防火墙设置有关,但我搞不清楚。

非常感谢!

答案1

ping使用称为 ICMP 数据包的东西,它与 TCP 数据包完全无关,例如携带 HTTP 有效负载的数据包。

如果希望 ping(以及可能依赖于 ICMP 的其他 IP 协议)正常工作,则必须配置防火墙以传递 ICMP 数据包(可能只过滤您感兴趣的数据包,见下文)以及从这些数据包生成的回复。(使用正确的防火墙,您可能还能够保持状态,即使 ICMP 是本质上无状态。但这对于 ping 工作来说并非必不可少。

我本来要添加您想要传递的 ICMP 数据包类型,但它们已在 security.se 上讨论过:https://security.stackexchange.com/questions/22711/is-it-a-bad-idea-for-a-firewall-to-block-icmp

一般来说,你想要的是类似这样的东西(这是超级手势,只有相关的细节):

[主机 A] <--(互联网或不受信任的网络)--> [防火墙] <--[主机 B]-->

主机 A 和主机 B 之间的流量根据流量的性质和流量的状态进行过滤。有时主机 B 和防火墙是相同的。这实际上没有太大区别,因为防火墙本身有点在某些方面是一个虚拟主机。

对于不同类型的 ICMP 有效负载,主机 A 可将其发送到它知道位于防火墙上或防火墙后面的网络(通常它不知道是哪个)。此流量必须通过防火墙,发送到主机 B,并且必须将主机 B 的回复作为该对话的一部分接收,进行 NAT,然后发送回主机 A。

因此,这些流量必须通过两个都方式,这有时对防火墙很重要。

首先要检查的是,我们感兴趣的 ICMP 数据包类型(您在此处和评论中的引用说明了我们关心的数据包)是否实际上正在通过防火墙并发送到主机 B。我确信会有一些日志记录或某种接口允许我们检查和查询防火墙。

一旦我们知道该流量正在传递,我们需要确保它正在到达主机 B(或传递到本地主机上的 IP 堆栈)并且答复也正在传递。

“如何使 iptables 工作”的细节超出了这个问题的范围,但其他人可能会给你更多提示。或者也许这些细节可以在另一个 SO 答案中找到。

一个技巧是将防火墙规则保存在一个文件中,然后创建一个新的规则集,该规则集基本上是“传入所有内容并记录,将所有内容通过 NAT 传出并记录”,然后启用该规则集进行测试。然后查看 ping 是否完全通过。即,证明问题出在防火墙上。

相关内容