我无法 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 是否完全通过。即,证明问题出在防火墙上。