我希望连接到远程 Ubuntu 主机。远程主机位于 NAT 后面的不同网络中,因此无法使用系统特定的公共 IP 地址直接访问。
user@hostIP
即使主机已保存密钥,简单尝试使用连接也会导致超时。
如何从我的 MacOS 系统通过 SSH 进入该远程主机?
答案1
VPN(虚拟专用网络)是一种访问方法,当您需要访问整个远程网络中的资源(多个主机、打印机、服务器……)时使用。实际上,您的本地系统将成为远程网络的一部分,并在远程网络 IP 范围内拥有单独的 VPN 隧道 IP 地址。设置它需要远程网络中的 VPN 服务器和本地主机上的 VPN 客户端。
设置 VPN 可能会导致本地资源的访问问题,因为 VPN 会更改本地主机的路由表;默认网关会更改为远程网络的网关。例如,在 VPN 运行时,您可能无法使用本地打印机。为了解决这个问题,可以在 VPN 客户端设置中将本地网络(或本地资源的各个 IP)列入白名单。或者,可以配置本地主机的路由,以便只有远程网络可以通过 VPN 隧道访问,而所有其他网络都可以通过本地网关路由器访问。
SSH(安全 Shell)可能是您需要访问远程网络中的单个主机时最常用的访问方法。可以通过该远程主机访问其余网络资源。SSH 隧道对本地主机的 IP 路由没有影响,因此可以在不妨碍访问本地网络资源的情况下完成。
要通过 SSH 访问 NAT 后面的远程主机:
- 远程主机需要静态 IP 地址。这可以直接在主机上配置,也可以通过为该主机分配 DHCP 保留来完成。
- 必须配置路由器,将入口流量转发到其公共 IP 地址,并使用用于 SSH 访问的端口(默认为 22)转发到远程主机的 IP 地址(端口转发)
- 远程主机必须有一个正在运行的 SSH 服务器
如果远程路由器直接支持 VPN 访问,则可以使用它来创建 VPN。在这种情况下,在本地主机中安装和配置 VPN 客户端就足够了。如果没有,则必须在远程网络内的主机中设置 VPN 服务器,并且必须以类似的方式配置路由器以将 VPN 流量转发到该服务器。
如果只需要访问单个主机,设置 SSH 更加直接,因为它不需要安装和配置新的客户端,也不会影响本地主机的路由表。
答案2
远程机器是网络的一部分,该网络不会为每个设备分配唯一的 IP,因此连接到机器的所有设备都获得相同的 IP。
网络做为每个设备分配一个唯一的 IP – 仅限于该网络内部。如果没有唯一的地址,设备将无法运行。
外界看到的“同一个IP”,是通过NAT实现的,即翻译唯一内部地址到共享外部地址。通常,该外部地址属于 NAT 路由器/网关本身,任何与现有连接不对应的传入数据包都只能由 NAT 网关接收 - 它们不会在所有主机之间隐式共享。(它们还受网关的防火墙规则约束,这就是为什么您会收到超时而不是常规的“连接被拒绝”的原因。)
为了从外部连接到特定主机,NAT 路由器需要一个特定的转换规则 - “端口转发”规则,它将所有到网关 TCP 端口之一的连接转换为主机的内部地址。
如果您可以控制路由器的配置,通常只需不到一分钟即可设置端口转发。(如果是住宅网络,甚至可以通过运行 UPnP IGD 客户端(如upnpc
从主机运行)来创建端口转发规则。)
答案3
要使 SSH 绕过 NAT,您需要以另一种方式建立连接,然后以您想要的方式建立连接!
即,您从 NAT 后面的计算机通过 SSH 连接到不在 NAT 后面的计算机。
然后从不在 NAT 后面的计算机,您可以使用任何协议 SSH 或其他协议连接到该计算机,以便您可以在现有的 SSH 连接内进行 SSH 连接。
这是一条反向隧道。
现在假设两台计算机都位于 NAT 之后。
您要连接的计算机和您要连接到的计算机。Comp A 和 C。因此您设置了 CompB。
那么,您就设置了 CompC 到 CompB 的反向隧道。
然后将 A 连接到 B,它会重定向到 CompC。
CompB 可以是“VPS”/某些托管服务向您提供的计算机或虚拟计算机。那里没有 NAT 问题。
有人可能想知道 A 和 B 之间是否加密。在你的情况下,这是因为你正在发送 SSH。我猜想 B 和 C 之间应该是双重加密!