我有一台 HP 迷你电脑,用作家庭服务器,它有一些应用程序在 Docker 容器中运行。现在我想与我的朋友和我所在的社区分享其中一些,但显然我的 ISP 使用 CGNAT,我不指望从他们那里得到任何帮助。
还有其他可行的替代方案吗?有人建议我设置反向代理,但我不知道该如何工作。我找到的资源对此进行了深入研究,似乎涵盖的内容远远超出了我的用例,对我来说有点难以应付(一般来说,网络就是这样),任何帮助都非常感谢。
我熟悉Docker并且可以使用Linux。
PS:如果需要的话,我愿意为 VPS 付费,而且我有一个域名。
答案1
如果您使用的是 IPv4 的 CGNAT,请检查您是否有 IPv6。这可由支持 v6 的客户端直接使用,并且“反向代理”网络服务器(在您的 VPS 或商业 CDN 上)可以接受 IPv4 请求并通过 IPv6 将其转发到您的服务器。
(请记住,尽管 IPv6 为您提供了大量没有 NAT 的外部地址,但它们可能仍然位于防火墙在路由器或 ISP 上。
如果你只有 IPv4,那么全部其余选项只是设置传出连接到您的 VPS(或某些服务),通过该服务可以传输传入的请求:
一种选择是设置 VPN(IP 隧道),例如 WireGuard 或 OpenVPN从主服务器到您的 VPS。
只要 CGNAT 将隧道连接视为“活动”,VPS 就可以到达家中的端点(使用隧道接口的内部地址),并且可能通过它到达其他家庭设备。
一旦完成,VPS 就可以运行 HTTP(S) 反向代理,通过隧道将请求中继到主服务器,或者一些类似的 TCP 级中继,或者使用 DNAT(通过 iptables)来中继任何类型的协议(例如游戏服务器的 UDP)。
例如,如果 VPN 隧道获得 IP 地址 192.168.5.0/24,则 VPS 上的 Apache 或 Nginx 可能配置为
ProxyPass http://192.168.5.2
将 HTTP 请求转发到您的家庭服务器,这与您可能已经在 Docker 中使用的概念相同。您还可以将其与第二个 VPN 设置一起使用,以便从任何地方的手机进行连接,从而通过 VPS 访问您的家庭系统。
(尽管如此,Tailscale 或 ZeroTier 等“网状”VPN 可能比手工建立的隧道更方便。)
另一个选项是长期 SSH 连接,同样从家庭服务器到 VPS,使用
-R
反向隧道将额外的 TCP 连接从服务器端传送到 SSH 客户端。(这仅有的使用 TCP,而非 UDP。例如,如果你这样做:
$ ssh -R 8080:172.16.5.7:80 myvps
...VPS 现在监听 localhost:8080,它可以用作 ProxyPass 中的 URL。
反向隧道可以直接公开(通过在服务器上启用“GatewayPorts”选项)或由在 VPS 上运行的反向代理使用。对于 HTTP(S),建议使用后者。
与设计为永久连接的 VPN 软件相比,这不太适合用于因任何原因丢失连接的“永久”隧道(好吧,一些VPN 软件至少),但如果您使用“autossh”或 systemd 之类的程序来确保在需要时重新启动连接,它仍然可以完成工作。
如果您运行他们的“代理”软件(也提供一些支持),则有一些商业服务会提供自己的中继服务器
ssh -R
,例如 Ngrok 等。通常这些服务并不完全免费,以弥补其带宽成本,但对于基本网站来说已经足够了。
这些方法不需要域名(但肯定比让你的朋友记住 IP 地址要好)。商业代理服务通常会给你一个随机的子域名。