当 WAN IP 在国外无法访问时,如何在单个 IP 地址上进行端口转发

当 WAN IP 在国外无法访问时,如何在单个 IP 地址上进行端口转发

泰国(和其他国家)有政府批准的防火墙/网关,可将您的所有流量路由到该网关。因此,转发到您的 WAN IP 的任何 LAN 端口在泰国境内可用,但在境外不可用。因此,当我通过 whatsmyip.org 或 ident.me 等西方网站查询时,我的调制解调器的 WAN IP 会有所不同。据我所知,这是因为我通过政府网关后才被允许访问外国内容。这些网关是公共的,因此不会转发我的端口。

我不能将 DNS 地址与 cloudflare 或类似的东西结合使用,因为我需要在同一个地址/IP 上使用多个端口。

我的情况如下:

  • 运行本地游戏服务器,每个服务器通常有 2-3 个端口。
  • 路由器配置为将这些端口转发到外部。
  • 无法从泰国境外访问任何内容,因为任何流量都会通过阻止端口的网关(我再次假设)

我的问题:

  1. 在我当前的设置中:使用 NordVPN Meshnet 隧道,我可以将本地服务器连接到托管在荷兰 (EU) 的 VPS。这意味着所有流量都通过隧道传输到荷兰 VPS。换句话说,我的 EU VPS 的 LAN 是我在泰国的 LAN,我可以在命令行中完美地访问我的设备。遗憾的是,我似乎无法将端口转发到外部网络。(见下文)

  2. 有人知道其他选择吗?我不介意花一点钱(即每月不到 15 美元)购买 vps 或服务或其他东西,但本质上我希望我的欧盟朋友能够加入我本地托管的服务器,或者换句话说,访问我的 WAN IP 上的转发端口。

我的研究:尝试了 cloudflare 零访问隧道(每个地址只有一个端口)后,我尝试通过 VPN(由于安全风险,端口转发通常会被禁用),最后选择了 NordVPN 的 Meshnet 服务。

我的欧盟 ubuntu VPS 在通过隧道连接到泰国本地 LAN 后有两个不同的接口:

  • ens3:EU 虚拟机管理程序以太网
  • nordlynx:NordVPN 隧道连接到我的泰国 LAN

我可以完美地访问我的游戏服务器 IP 192.168.1.49,但我似乎很难根据需要进行端口转发。在 VPS 提供商方面,防火墙已完全关闭(仅用于测试)。

我正在尝试端口转发,因此发生以下情况:

  • 用户访问 EU-VPS-IP:5032
  • 端口通过 nordlynx 接口转发至 192.168.1.49:80
  • 用户在 192.168.1.49 的 80 端口上获得内容

此时,如果我curl 192.168.1.49:80在我的 EU-VPS 终端上,我会得到想要的结果,但是当我访问我的 EU-VPS 的公共 IP 端口 5032 时,我会收到 ERR_CONNECTION_TIMED_OUT“无法访问此站点”。

以下是我尝试使用的 IPTables 规则(无济于事):

sudo iptables -t nat -A PREROUTING -i nordlynx -p tcp --dport 5032 -j DNAT --to-destination 192.168.1.49:80

然后我找到了指南这里,告诉我添加 POSTROUTING 规则,因此:

sudo iptables -t nat -A POSTROUTING -o nordlynx -p tcp --dport 80 -d 192.168.1.49 -j SNAT --to-source 100.99.138.177

在上面的例子中:

  • 192.168.1.49 是我的游戏服务器的 LAN 地址
  • 100.99.138.177 是 VPS 隧道内的 EU-VPS 的 IP 地址
  • 由于我的防火墙此时处于关闭状态以进行测试,因此我不会在这里发布我的 EU-VPS 的公共 IPv4 地址以避免出现任何问题。

我做错什么了吗?如果我可以将传入请求端口转发到我的局域网设备,我觉得我很快就能一劳永逸地解决这个问题了。

更新

@gedo 提供的答案已完成所有需要的工作,端口现在已转发,SSH 隧道绕过政府网关/防火墙(至少在泰国)并直接连接到我的 VPS。因此,转发到该 IP 的所有端口都可以在欧盟顺利访问。

到目前为止,我还不能确认它是否适用于游戏服务器,因为我仍在研究这部分,端口似乎已转发,但没有找到以前使用相同配置和简单路由器端口转发即可检测到的服务器。一旦我有更多信息,将进一步更新。

答案1

对于问题的第一部分(更新 - 请参阅下文,了解应该可以使用的 iptables 解决方案),您可以尝试我在评论中提出的建议,在 PREROUTING iptables 命令中更改为-i nordlynx-i ens3但不确定这是否有帮助,因为您写道此时您遇到了超时(如果您确实打开了所有防火墙,我预计连接会被拒绝)。

但我在这里主要写一个对你问题第二部分的回答,并建议一个简单的替代方案。你只需要有 ssh 访问任何虚拟机的权限(你可以在全球许多地方以每月约 5 美元的价格从 DigitalOcean、Vultr、OVH、AWS 等提供商处获得便宜的虚拟机),然后你需要执行以下操作:

  • 确保您要使用的端口在虚拟服务器中是打开的(根据提供商的不同,这是不同的,大多数只是 iptables,但例如 aws 有自己的防火墙,您可以在 aws 控制台中配置)。
  • 在虚拟服务器中编辑/etc/ssh/sshd_config并添加行GatewayPorts clientspecified并重新启动 sshd (sudo systemctl restart sshd.service或者,在较新的 Ubuntu 版本中sudo systemctl restart ssh.service
  • 从本地机器运行以下命令:
ssh -fN -R 0.0.0.0:5032:localhost:80 <virtual server>

(请注意,这-fN使得该命令在后台运行,因此如果一切正常,该命令将立即返回,但 ssh 隧道将在后台运行,您可以使用进行检查ps axu | grep ssh

  • 现在,任何连接到您的虚拟服务器公共 IP、端口 5032 的人都应被转发到您的本地主机端口 80。

更新

我刚刚在新的 digital ocean droplet 中亲自尝试了此操作(默认情况下没有防火墙,因此设置起来非常容易),并注意到失败是sudo systemctl restart sshd.service因为在较新的 ubuntu 版本中它被称为 ssh.service。在我将其更改为之后,sudo systemctl restart ssh.service一切正常,隧道也正确创建了。既然您提到它对您不起作用,您能否检查此重启命令是否对您失败,如果没有,您能否添加更多调试信息(对于初学者来说,类似于您在 VPS 中所做的 tcpdump)。

更新2

看来你至少让 ssh 隧道方法在端口 80 上工作了,所以我看不出其他端口无法工作的原因,但是为了完整起见,这里解释了为什么你的 iptables 方法没有按预期工作以及如何让该方法也工作:

假设有人从1.2.3.4尝试连接到您的服务器。您希望他们首先转到您的 VPS IP ,因此数据包从(公共接口)100.99.138.177进入。您想在此处将目标地址更改为您的内部 VPN 地址。但是,如果您只是这样做,您的家庭服务器将获取数据包并尝试直接回复,这将不起作用。这就是 SNAT 部分的用武之地(我错误地认为我的评论中不需要它)。您希望源地址也转换为1.2.3.4 -> 100.99.138.177ens3192.168.1.491.2.3.4 -> 192.168.1.491.2.3.4nordlynx 界面中 VPS 的本地地址!我们将其称为(您可以在 VPS 中192.168.1.1找出正确的名称)。因此,在前/后路由之后,您希望您的数据包看起来像这样: 。在返回途中,将根据 VPS 中的连接跟踪自动完成逆向转换。现在总结一下,这是您的命令应该如何实现这一点:ip addr show nordlynx192.168.1.1 -> 192.168.1.49

sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 5032 -j DNAT --to-destination 192.168.1.49:80
sudo iptables -t nat -A POSTROUTING -o nordlynx -p tcp --dport 80 -d 192.168.1.49 -j SNAT --to-source 192.168.1.1

确保将192.168.1.1其替换为您的 VPN 的 VPS 端的 IP 地址。

相关内容