以前,我只需在路由器设置中将家用工作站 PC 设置为 DMZ PC,即可将其直接暴露在互联网上,并且我可以访问在其上运行的任何服务:SSH、Web 服务器、远程桌面等。我配置了 DynDNS,还拥有一个域,子域 DNS 条目指向路由器的外部 IP,因此我可以使用固定名称(无论是home.mydomain.com
还是 )从世界任何地方远程访问它的任何端口myuser.dyndns.com
。生活很美好。
现在我搬家了,我的新 ISP 将我置于 CGNAT 后面,即我的路由器的“外部”地址在 100.64.0.0/10 范围内,因此无法再从外部访问它(并且 DynDNS 也已失效,但那无关紧要)。不幸的是,ISP 不提供 IPv6,在我所在的地区无法切换 ISP。
话虽如此,我的公司最近为我的团队订购了一个 VPS 计划,运行的是 Ubuntu 18.04,我可以完全控制它。我可以通过 SSH 连接到它,安装任何软件,并根据自己的喜好进行配置。目前,它仅在非标准端口上运行 SSH,在自定义端口上运行小型 API 服务,所有其他端口(包括 80)均可用。我已经将其设置home.mydomain.com
为CNAME
指向它的 DNS 条目。
那么,利用这一新资产的最佳策略是什么,最终让我的家用工作站电脑像以前一样暴露在互联网上?
在谷歌搜索 CGNAT 规避时,我阅读了大量有关 SSH 反向隧道/代理、SOCKS、VPN 服务器的信息,但我仍然不确定在这种情况下实现目标的最佳工具和设置是什么。
我的要求:
仅限开源、免费软件:当然,我可以完全控制 VPS,但我想将额外的软件指纹保持在最低限度。我可以
apt install
从官方存储库(也许是 GitHub 存储库)安装任何东西。在我的工作站上(也运行 Ubuntu),我可以安装更多晦涩难懂的东西。自托管解决方案:任何通常需要外部服务(付费或免费)的东西,例如 Serveo、LocalTunnel、OpenVPN 等,我都想在 VPS 上安装其服务器版本。我不想让我的流量路由到我必须信任的另一家公司。
无需安装客户端(最好):我希望从任何地方访问我的工作站,无论是我的笔记本电脑、朋友的电脑、大学、工作,使用常规浏览器、SSH 客户端、远程桌面(RDP 或 VNC)客户端等通常已经安装或通常可用的软件。
无需打孔(最好):应该就像我的工作站一样是
home.mydomain.com
,直接暴露在互联网上。如果我必须“重新映射”端口,使用诸如远程端口 = 本地端口 + 10000 之类的规则(这样 Web 服务器就可以在端口 10080 上访问),那就没问题了,但除此之外,我希望它尽可能接近 DMZ。
我最接近的方法是ssh [-R xx:localhost:yy]... home.mydomain.com
使用工作站,使用一系列预定义的端口,并GatewayPorts yes
在 VPS 上进行设置/etc/ssh/sshd_config
。这很好,但我觉得可能有更好的解决方案。这将是惊人的如果解决方案基于用于访问 VPS 的域。例如,仅转发通过 访问的(所有)请求home.mydomain.com
,如果通过 访问则正常处理vps.mycompany.com
答案1
我认为 SSH 隧道并不适合此目的。当然,它可以工作,但您必须运行与要转发的端口数量相同的隧道。
VPN 可能是实现此目的的最佳选择。您在 VPS 上配置 VPN 服务器,将家庭服务器作为 VPN 客户端连接,当您不在家时,您可以将笔记本电脑或远程计算机作为客户端连接到此 VPN,这样您就可以访问家庭服务器,就像您在同一个本地网络中一样,您甚至不必为它们分配“公共 IP”。
如果您想将公共 IP 分配给您的一台家庭服务器,则必须在 VPS 上配置第二个公共 IP(以便它可从其主 IP 访问),然后使用 VPS 的防火墙 (iptables) 设置 1:1 NAT。并且此家庭服务器将配置为使用 VPN 作为网关,因此传出的数据包将通过 VPS 的辅助 IP,而不是您的家庭 ISP 的 IP。
如果您拥有多台家庭服务器,并且能够为 VPS 分配 2 个以上的 IP,则可以进行 1:1 NAT。否则,如果您希望将单个 IP 用于不同的家庭服务器,则必须使用端口转发。
答案2
这可能对您没有帮助,但我认为强调 PCP(端口控制协议)适合此用例是件好事。您的 ISP 必须支持此功能(我不知道 ISP 对 PCP 的支持有多普遍,作为一个悲观主义者,我猜不会很普遍......)
PCP 基本上是 UPnP 家族中最新的协议之一,属于 NAT-PMP 类型协议。PCP 具有 MAP 和 PEER 功能,可让您的客户端在 ISP 级别(在其 CGNAT 处)请求端口转发。如果有人知道有 ISP 这样做(或者更好的是,在现实世界中实际使用过它),我很乐意听听。
https://www.rfc-editor.org/rfc/rfc6887
答案3
向您的 ISP 请求静态 IPv6 前缀。为您的所有互联网访问获取 IPv6。
当您仅具有传统 IPv4 访问权限时,配置 IPv6 隧道代理、VPN 或其他过渡方法。
答案4
遇到了这个问题,虽然迟到了,但我认为这会对某些人有所帮助。
实现此目的的一个简单方法是反向隧道,如下所示:
在客户端(没有公网 IP 的机器):ssh -R 7680:localhost:7677 root@remotemachine (不要退出此提示)
7680 将在远程机器上打开 7677 已在本地/客户端机器上打开
在远程机器上: ssh localhost -p 7680
然后您就连接到客户端了。
问题是当您退出客户端上的 ssh 会话时,连接将中断。
因此使用可以在后台运行的 autossh:
autossh -M 20000 -f -N -R 7680:localhost:7677 -C root@remotemachine
现在你可以退出 shell,并且连接不会断开