我正在尝试为我的计算机设置 DDNS,它在大多数情况下都能正常工作。而且,我想远程 ping 到该计算机。现在,DDNS 配置正确,并且它正在正确进行 IP 刷新。
我已将 Windows 10 计算机上的防火墙设置更改为允许 ICMP-In 流量,这样 ping 就可以了。但是,它只是显示请求超时。
我还想补充一点,LAN 上的 ping 工作正常,似乎只有来自互联网的 ICMP 流量被阻止。我正在使用 Windows Defender 作为防火墙。
可能出了什么问题?
答案1
我还想补充一点,LAN 上的 ping 工作正常,似乎只有来自互联网的 ICMP 流量被阻止了。我正在使用 Windows Defender 作为防火墙。
这并不是说特意阻止了到您电脑的流量,而是恰恰相反。
正如您所说,您尝试 ping 的 IP 地址实际上并不属于您的计算机 - 它属于执行 NAT 的路由器,因此您实际上是在 ping 您的路由器。
预期的结果是路由器本身应该发送 Echo Reply 数据包,但它可能带有自己的防火墙规则,导致它忽略来自外部的 ICMP Echo ping(许多 ISP 将此作为其默认配置的一部分)。无论哪种方式,它都不会将这些 ping 转发到您的任何 LAN 机器,因此它们根本不会击中 Windows 防火墙,这是完全正常的。
(这同样适用于位于 NAT 后面的任何其他流量:除非它匹配明确的“端口转发”规则或隐式 NAT 状态,否则默认结果是数据包被路由器本身使用,因为它是被寻址的设备。)
我不确定应该为 ICMP 流量启用哪个端口。我一直认为它是无端口的。
ICMP 确实是无端口的。
尽管“港口转发”是即使对于“无端口”协议(如 ESP 或 GRE),也可能有 DNAT 规则,但大多数家用路由器不会提供该选项。它们做经常提供“DMZ”作为总体规则全部协议,其中很可能也包括 ICMP Echo 数据包。
但一个重要的限制是,如果没有端口号,你就无法发送一些将数据包回显到主机 A,并将一些数据包回显到主机 B – 您所能做的就是转发全部将它们放到同一主机。
(当 ICMP错误数据包到达时,它们携带触发错误的原始数据包的几个字节 - 最重要的是原始端口字段 - 因此您的路由器仍然可以将每个 ICMP 错误与特定的 TCP 连接相关联,并将其转发到正确的 LAN 主机。
当 ICMP回显答复数据包到达时,它们也具有独特的“ID”值,该值与端口号非常相似,尽管只有一个而不是两个。但它仍然可以帮助您的路由器的 NAT 识别哪个 LAN 主机发送了原始 ICMP Echo 请求并将回复路由回去。
但是当ICMP回应请求(ping)从互联网到达路由器,它没有足够的信息来处理它们。实际上只有两个选择:要么路由器转发全部ICMP 回应请求一LAN 主机(类似于具有‘DMZ’功能),或者它直接处理它们而不进行转发(即路由器本身响应)。