使用 ProxyJump 通过代理或堡垒通过 SSH 连接到远程主机
堡垒主机的概念对计算来说并不新鲜。堡垒主机通常是面向公众的强化系统,可作为防火墙或其他受限制位置后面的系统的入口点,它们在云计算兴起时尤其受欢迎。
该ssh
命令提供了一种简单的方法,可以使用单个命令利用堡垒主机连接到远程主机。无需先通过 SSH 连接到堡垒主机,然后ssh
在堡垒上使用连接到远程主机,而是ssh
可以使用 自行创建初始连接和第二个连接ProxyJump
。
ProxyJump
ProxyJump
或 标志-J
是在ssh
版本 7.3 中引入的。要使用它,请在标志后指定要连接的堡垒主机-J
,以及远程主机:
$ ssh -J <bastion-host> <remote-host>
如果主机之间的用户名和端口不同,您还可以设置特定的用户名和端口:
$ ssh -J user@<bastion:port> <user@remote:port>
手册ssh
(man) 页 ( man ssh
) 指出,可以指定多个以逗号分隔的主机名来跳转一系列主机:
$ ssh -J <bastion1>,<bastion2> <remote>
如果堡垒和最终远程主机之间存在多个隔离级别,则此功能非常有用。例如,公共堡垒主机可以访问“Web 层”主机组,而其中可能包含受进一步保护的“数据库层”组。
硬编码代理主机~/.ssh/config
该-J
标志提供了灵活性,可以根据需要轻松指定代理和远程主机,但如果定期使用特定堡垒主机连接到特定远程主机,则ProxyJump
可以设置配置~/.ssh/config
以自动建立与堡垒在前往远程主机途中的连接:
### The Bastion Host
Host bastion-host-nickname
HostName bastion-hostname
### The Remote Host
Host remote-host-nickname
HostName remote-hostname
ProxyJump bastion-host-nickname
使用上面的示例配置,当ssh
建立连接时如下:
$ ssh remote-host-nickname
该命令首先创建与堡垒主机(在远程主机的设置中通过昵称引用的主机)ssh
的连接,然后才连接到远程主机。bastion-hostname
ProxyJump
替代方案:转发 stdin 和 stdout
ProxyJump
是使用ssh
已存在很长时间的功能的简化方法: ProxyCommand
.ProxyCommand
通过代理或堡垒主机转发来自远程机器的标准输入 (stdin) 和标准输出 (stdout) 来工作。
本身ProxyCommand
是一个用于连接远程服务器的特定命令——就前面的例子而言,这将是ssh
首次连接堡垒时使用的手动命令:
$ ssh -o ProxyCommand="ssh -W %h:%p bastion-host" remote-host
%h:%p
上述标志的参数指定-W
将标准输入和输出转发到远程主机(%h
)和远程主机的端口(%p
)。
ProxyCommand
在~/.ssh/config
与 一样ProxyJump
,可以在文件中为始终使用此配置的主机ProxyCommand
设置:~/.ssh/config
Host remote-host
ProxyCommand ssh bastion-host -W %h:%p
通过 中的此设置~/.ssh/config
,与远程主机的任何ssh
连接都是通过 的安全连接转发 stdin 和 stdout 来实现的bastion-host
。
该ssh
命令是一个功能强大的工具。虽然它可能主要以最简单的形式使用,但ssh user@hostname
实际上有几十种用途,使用标志和配置来建立从一个主机到另一个主机的连接。有时请查看 的ssh
手册页 ( man ssh
) 以了解这个看似简单的程序提供的所有不同选项。