Host public-server-reverse
HostName 100.100.100.100
IdentityFile ~/.ssh/pass-less/id_rsa
User user-of-the-public-server
Port 22
RemoteForward \*:2222 localhost:22
100.100.100.100是公共服务器的IP地址或域名
最后我们应该killall autossh再次建立连接。
通过公共服务器从客户端机器连接到私人服务器
一旦执行了上述步骤,我们就可以通过命令实现我们的目标:
ssh user-of-the-private-server@public-server -p 2222 # provide an additional authentication data (for the Private Server) if it is needed… forward some ports, etc.
如果我们可以访问具有公共 IP 地址的服务器,那么我们可以将其用作网关。我们可以通过反向 SSH 端口转发连接来实现这一点。假设我们有三个实例:
公共服务器:这里我们有一个可操作的 SSH 服务器和公共 IP 地址(和/或域名)。我们可以使用不受密码保护的公钥-私钥对连接到该服务器(设置参考)。
私人服务器:这里我们有一个可操作的 SSH 服务器。它位于防火墙(NAT、ISP 等)后面,没有公共 IP 地址,但我们能够建立从它到公共服务器的 SSH 连接,所以这里我们还有 SSH 客户端。
客户端机器:这里我们(需要)只有 SSH 客户端。我们能够建立到公共服务器的 SSH 连接。我们想建立从这个实例到私有服务器的 SSH 连接。
校长级
在主体层面,我们至少可以应用两种情况。
场景 1.我们不想在公共服务器的防火墙中打开额外的端口:
场景 2.我们倾向于在公共服务器的防火墙中打开一个额外的端口:
场景 1 的主要优点是我们不需要考虑我们的私人服务器有多安全。方案 2 的主要优点是我们省略了一步,但在这种情况下,我们应该考虑私有服务器的安全性,因为它可以通过转发端口公开访问。此外,这些场景可以应用于不同的端口和服务,不仅仅是 SSH,例如 HTTP。
如何在 Ubuntu 中应用场景 1
通过从私有服务器到公共服务器的端口转发建立 SSH 连接
我们可以通过以下命令做到这一点:
-p 22
提供公共服务器的 SSH 端口(非强制)。-i ~/.ssh/pass-less/id_rsa
提供认证密钥文件。-R 2222:127.0.0.1:22
意味着2222
(远程)公共服务器上的端口将被转发到(本地)私有服务器的 SSH 端口,在这种情况下,是22
.-fTN
我们可以通过添加选项(OpenSSH 客户端的 -参考)将此连接推送到后台。我们还可以使用该工具autossh
来确保连接将在很长一段时间内保持活动状态(参考):~/.ssh/config
我们可以通过在我们的文件中实现以下行来简化上述命令:在这种情况下,上述命令将变为:
我们可以通过下一个 Cron 作业轻松地在系统重新启动时自动执行此任务(或者我们可以创建应该是更好的方法的服务):
建立此连接后,我们可以通过反向隧道从公共服务器连接到私有服务器,使用以下命令:
使用从客户端机器到公共服务器的端口转发建立 SSH 连接
我们可以通过以下命令做到这一点:
-L 1111:127.0.0.1:2222
表示1111
(本地)客户端计算机上的端口将被转发到(远程)公共服务器的端口2222
(即转发到私有服务器的 SSH 端口)。注意我们可以使用-L 2222:127.0.0.1:2222
.-fTN
如上所述,这些选项会将连接推送到后台。我们也可以使用指令
autossh
或.~/.ssh/config
RemoteForward
LocalForward
通过自身从客户端机器连接到私人服务器
完成上述两个步骤后,我们可以通过以下命令从 Client Machine 连接到 Public Server:
如何在 Ubuntu 中应用场景 2
通过从私有服务器到公共服务器的端口转发建立 SSH 连接
此步骤与场景 1 中的第一个步骤相同,但需要做一些额外的事情。
打开公共服务器防火墙上的转发端口
2222
- 这超出了此答案的范围。修改
/etc/ssh/sshd_config
公共服务器并添加下一个指令,这将允许打开我们的 SSH 隧道到公共(不要忘记重新启动服务器:)sudo systemctl restart sshd.service
:让我们的 SSH 隧道向公众开放。此步骤在问题中得到了很好的描述:(如何使 ssh 隧道向公众开放?)。根据那里的答案,我们可以将
-g
选项添加到在私有服务器和公共服务器之间建立连接的命令中:或者,或者,我们可以
~/.ssh/config
用这种方式修改文件:最后我们应该
killall autossh
再次建立连接。通过公共服务器从客户端机器连接到私人服务器
一旦执行了上述步骤,我们就可以通过命令实现我们的目标:
更新
如果公共服务器和私人服务器在同一个局域网中,您可以使用选项ProxyCommand或ProxyJump。选项ProxyJump在 OpenSSH 7.4+ 中可用,使用此选项您可以轻松地通过多个网关。这里有几个例子:
或者,如果您更喜欢使用
~/.ssh/config
条目:请注意,两个 SSH 密钥都存储在客户端计算机上。
100.100.100.100 是公共服务器的 IP 地址或域名。172.16.1.0/24 是公共服务器可以访问私有服务器的局域网。而 172.16.1.100 是 Private Server 的 LAN IP 地址。
然后,为了连接到私人服务器,只需使用: