SSH - Jump Server Configuration

本文介绍两种在 openssh 下方便地配置跳板机的方式。

ProxyCommand Option

通过 ~/.ssh/config 中配置 ProxyCommand 选项来实现跳板效果。

Configuration File

1
ProxyCommand command

Description

ssh 客户端在连接服务器之前会先使用 command 作为 exec 的参数启动一个进程,接下来把本该发往 ssh 服务器的流量发往该进程的标准输入,并将该进程的标准输出视作 ssh 服务器回复的流量。简单的来说就是通过新启动的进程来连接服务器。

选项的 command 参数支持使用标记符号(TOKEN),支持的符号如下:

TOKENDescription
%h远程服务器地址或域名
%p远程服务器端口号
%r远程服务器用户名
%%字符 ‘%’

例如,设置 ProxyCommand nc %h %p 后, ssh user@1.2.3.4 -p 22334 会在连接远程服务器之前启动进程 nc 1.2.3.4 22334 ,再将 ssh 流量通过该进程的标准输入输出发送给远程服务器。在这个例子中 nc 并没有起到什么效果。但是通过设置不同的命令,可以通过该选项来实现跳板机机制。

Jump via ProxyCommand

假定跳板机的 ip 地址 1.2.3.4,端口为 12322,实际要连接的远程服务器为 10.0.0.1:23322。我们可以设置 ProxyCommand ssh -W %h:%p -p12322 user@1.2.3.4-W 参数的说明可以见上一篇文章。为方便使用,我们可以在 ~/.ssh/config 中添加跳板机配置:

1
2
3
4
Host jumpserver
Hostname 1.2.3.4
Port 12322
User user

再添加跳板机后面的实际目标服务器:

1
2
3
4
5
Host target
Hostname 10.0.0.1
Port 23322
User user
ProxyCommand ssh -W %h:%p jumpserver

注意 target 配置中的 ProxyCommand 字段使用了前面定义的 jumpserver 来简化配置。接下来可以直接在命令行中执行 ssh target 来一键通过跳板机连接远程服务器。

若想用临时配置,不想修改 ~/.ssh/config 文件,可以执行以下命令来连接远程服务器:

1
ssh -o'ProxyCommand ssh -W %h:%p -p12322 user@1.2.3.4' -p23322 user@10.0.0.1

ProxyJump Option

上述方式实现跳板机仍然有些复杂,在较新版本的 openssh(>=7.3) 中可以使用 -J 命令行参数或者 ProxyJump 配置来实现跳板机机制。

CLI Options

1
ssh -J jump-host[[,jump-host]*]

可以使用逗号来分割多个跳板机,ssh 会顺次通过跳板机来访问远程目标。

Configuration File

1
ProxyJump jump-host[[,jump-host]*]

同样可以使用逗号来分割多个跳板机。

Jump via ProxyJump

通过该选项可以方便地配置跳板机,假设跳板机和目标的信息和前述例子中的一样。
~/.ssh/config 中添加跳板机配置:

1
2
3
4
Host jumpserver
Hostname 1.2.3.4
Port 12322
User user

再添加目标服务器配置:

1
2
3
4
5
Host target
Hostname 10.0.0.1
Port 23322
User user
ProxyJump jumpserver

现在即可在命令行中执行 ssh target 连接目标服务器。

若想临时通过跳板机 jumpserver 连接某台新服务器 user@10.0.0.2:23333 ,可以通过在命令行中执行 ssh -J jumpserver -p23333 user@10.0.0.2 来连接。