我只是想通过互联网访问我系统上托管的服务。为此,我遵循了No-IP 的指南。
- 创建了无 IP 的动态 DNS
padmahasa-desktop.ddns.net
。 - TP-Link 路由器上的端口转发。
192.168.0.107
是我当前的内部 IP 地址。 - 但“端口检查器”显示我转发的所有端口均未打开。我尝试检查图像中显示的所有端口 9099、80、8080 等。
由于我使用的是 Ubuntu 24.04.1,我尝试使用以下命令检查是否有防火墙处于活动状态。但它显示防火墙处于非活动状态。
$ sudo ufw status
Status: inactive
这里需要另外注意的是,UDP 端口 20595 是在 0AD 游戏中托管多人游戏比赛的一部分转发的,当时它运行良好(大约 8 年前)。
如何开始诊断以找出问题的确切所在?
“打开”和“关闭”有点模糊,因为您至少有 3-5 个不同的“门”可能打开或关闭 - ISP 的防火墙、路由器的防火墙(和端口转发)、服务器的防火墙,以及最后您的服务器当前是否正在运行任何正在侦听该端口连接的服务。因此,仅在路由器上设置端口转发规则不足以使其完全“打开”。
在进行端口检查时,运行数据包捕获,例如 Wireshark (GUI) 或 tshark/tcpdump (CLI)。这将告诉您数据包是否到达您的系统。
如果您看到数据包到达服务器并被忽略,则问题可能出在服务器的防火墙上。(ufw 不是唯一的防火墙;事实上,它只是一个自动配置 iptables 的工具,并且可以在 ufw 没有激活的情况下加载 iptables 规则。)
如果您看到数据包到达并且 TCP“RST”答复发出,则防火墙没有问题,但是服务器没有运行任何可以接受该端口上的连接的服务。
如果您没有看到任何数据包,则表明它们被路由器或 ISP 阻止了。如今,ISP 成为问题非常常见 - 请参阅另一点。
确保您的路由器具有公共 IP 地址。外部系统看到的关于您的信息(例如您的 DDNS 提供商看到的,或“我的 IP 是什么”网站看到的)不一定是实际属于您系统的地址。
也就是说,转到您的 TP-Link 路由器的“WAN 状态”页面(或类似页面)并找到您的 ISP 分配的 WAN IP 地址。
如果那里显示的地址与 DDNS 提供商显示的 103.228.222.115 地址不匹配,则表示您的连接位于 CGNAT(即您的 ISP 完成的第二层 NAT)后面,并且您自己的端口转发规则将无法执行任何操作。
也就是CGNAT,即ISP级别的NAT。
99% 的时间里,CGNAT 的设置方式都是阻止客户接收任何入站连接。
有时是因为 ISP 执行“多对一”NAT,并且公共 IP 地址在多个客户之间共享(就像您自己的路由器的 NAT 在多个设备之间共享其地址一样)。有时是“1:1”NAT,但 IP 分配非常短暂 - 甚至可能过于动态,甚至 DynDNS 也无法处理 - 因此 ISP 故意不设置任何入站转换。
解决方法如下:
打电话给您的 ISP,询问他们是否可以为您分配一个公共 IP 地址(或许多 ISP 收费的“静态 IP”)。有些 ISP 会以每月 1 美元的价格提供这项服务,有些 ISP 则不会。
如果 ISP 不向您提供专用的公共 IP 地址,则另一种选择是使用可提供该地址的 VPN。(可以使用商业服务,也可以通过廉价的 VPS 设置自己的 VPN。)
如果这些服务仅供您自己远程访问(即不一定是公开的),则还有更多 VPN 选项可以完成这项工作,前提是您愿意在手机/笔记本电脑/等设备上安装 VPN 客户端。Tailscale 或 ZeroTier 就可以了。
不相关,因为那是 8 年前的事了——您的互联网连接依赖于外部因素(您的 ISP 的网络配置),而该因素在这 8 年间可能已经发生了多次变化。
事实上,许多 ISP 在过去 8 年中都部署了 CGNAT,以至于这实际上已成为本网站上每周都会出现的问题。(我一直在发布答案,想着“我会写一个通用答案,以便将来可以用于重复问题”,但最终还是会再次写新的答案……)