如何访问我无法管理的受限NAT网关后面的机器?

我有一台Linux机器,希望能够远程访问它进行SSH、FTP、HTTP等操作。我在No-IP.com上注册了动态DNS,但这并不足够,因为我在大学校园网络中,位于NAT后面,并且没有权限访问路由器来设置端口转发。我不知道校园路由器是否支持UPnP或NAT-PMP,但我对此表示怀疑。 无论如何,我想知道是否有办法通过使用VPN来解决这个问题。我知道,如果我在两台机器上都安装了VPN软件,那么VPN将允许我从我的笔记本电脑访问我的Linux机器。但我希望能够从任何计算机访问我的Linux机器,而无需安装软件。或者至少可以通过这种方式访问HTTP部分。虽然我知道许多VPN服务提供文件传输等Web界面,但我更希望能够使用常规的FTP和SSH客户端软件访问我的Linux机器。 总之,使用VPN能实现这个吗?还是有办法将VPN与动态DNS链式连接起来?我查看了Hamachi VPN的网站,但它用非技术性的术语描述了所有功能,所以我无法弄清楚这些问题,我希望在创建账户之前能够了解清楚。

你知道你们大学的防火墙是否允许将任何流量转发到学生/终端用户的计算机吗?通常,在公共环境中,终端用户工作站只能作为通信的发起者,而不是终点,即服务器角色。通常情况下,大学或公司不会允许(除非有充分理由并经过负责人批准)外部用户访问内部终端用户的工作站。如果你们的情况不同,那就太好了,但如果是这样的话,你别指望了。抱歉。 - MelBurslan
你可以使用Tor网络:https://www.torproject.org/index.html.en,它允许你在NAT后面托管服务,需要一个客户端。 - week
3个回答

听起来,你们学校的防火墙不允许从校外发起连接到你的机器。所以为了连接到你的机器,你需要从内部发起连接。 因此,你需要在宿舍机器D和校外的某台外部机器E之间建立一些连接。然后,当你想要从客户端C连接到宿舍机器时,连接到E并设置E以便中继连接。 对于D→E的连接,你可以使用VPN。这需要在D和E上具有root级别的访问权限。VPN提供了D和E之间的IP连接,因此从C上你将能够访问E愿意在C和D之间路由的任何网络服务。 一个更轻量级的解决方案是在D和E之间建立SSH连接,这只需要两边都有一个shell账户(当然,E必须允许SSH)。从D上运行以下命令:
ssh -R 2242:localhost:22 E sleep 999999999
创建从 E 到 D 的端口转发:任何使用 E 上的 2242 端口建立的连接都会中继到 D 上的 22 端口。22 端口是 SSH 端口,所以当你运行 ssh -p 2242 E 时,这将使你连接到 D,在那里你可以登录。为了自动化此过程,你可以在 ~/.ssh/config 中定义一个别名,像下面这样(PuTTY 有类似的设置,请参考其手册):
Host dorm
UserName bob
HostName E
Port 2242
你可以通过这种方式路由多个端口。例如,要将 E 上的端口 8042 转发到 D 上的端口 80:
ssh -R 2242:localhost:22 -R 8042:localhost:80 E sleep 999999999
每次在D盘上启动网络连接时,您都需要重新运行该命令。

如果您有一台不在NAT后面的机器(即可以从互联网自由访问),您可以从校园机器上使用ssh登录该机器,并通过该ssh会话将任意远程端口转发到适当的本地(在校园机器上)端口 - OpenSSH的选项是-R。然后,您将连接到非NAT的机器上的转发端口,校园计算机上的ssh会将数据通过校园NAT进行隧道传输。有点笨拙,但它能正常工作。

一个VPN可以解决这个问题,是的。 具体来说,你需要一个允许端口转发的VPN。我只有使用Mullvad的经验,他们可以做到这一点,但我相信许多其他VPN也提供此功能。 对于大多数服务来说,你可能不能期望转发任意端口(例如ssh的22号端口),所以你需要使用一些“随机”的高端口。但是配置ssh/ftp来实现这一点应该非常简单。