SSH ProxyCommand 示例:通过一个主机到达另一个服务器
您可以使用 ProxyCommand 跳转主机。有时,您只能通过 ssh 访问远程服务器,方法是先登录中间服务器(或防火墙/跳转主机)。因此,您首先登录中间服务器,然后 ssh 到另一台服务器。您需要进行两次身份验证,并且该链可能很长,并不仅限于两台主机。此页面为新的 Linux 和 Unix 开发人员或系统管理员提供 SSH ProxyCommand示例。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | 终端/ssh |
先决条件 | ssh 命令 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 4 分钟 |
我们的 SSH ProxyCommand 示例设置
通过使用 ProxyJump 和其他选项的代理或堡垒,SSH 设置到远程主机如下:
+-------+ +----------+ +-----------+ | Laptop| | Jumphost | | FooServer | +-------+ +----------+ +-----------+ OR +-------+ +----------+ +-----------+ | Laptop| | Firewall | | FooServer | +-------+ +----------+ +-----------+ 192.168.1.5 121.1.2.3 10.10.29.68
我只能通过 ssh 访问名为“FooServer”的远程服务器,方法是先登录名为“Jumphost”的中间服务器。首先,登录 Jumphost:
$ ssh vivek@Jumphost
接下来,我必须通过中间系统进行 ssh 操作,如下所示:
$ ssh vivek@FooServer
穿过一两个关口
我可以连接到名为 www.example.com 的目标主机,首先与名为 hello.vpn.example.com 的跳转主机建立 ssh 连接,然后从那里建立到最终目的地的 TCP 转发:
$ ssh -J Jumphost FooServer
$ ssh -J Jumphost vivek@FooServer
$ ssh -J hello.vpn.example.com www.example.com
$ ssh -J hello.vpn.example.com:22 vivek@www.example.com
-J选项不可用时使用的命令
在旧版本的 openssh 中-J不可用。因此请使用以下语法:
$ ssh -o ProxyCommand="ssh -W %h:%p Jumphost" FooServer
$ ssh -o ProxyCommand="ssh -W %h:%p vivek@hello.vpn.example.com" vivek@www.example.com
$ ssh -o ProxyCommand="ssh -W %h:%p vivek@hello.vpn.example.com" root@wp-admin-server
最老的客户端不支持该-W选项
在这种情况下,ssh -tt命令。我不用输入两个 ssh 命令,而是输入以下一体化命令。这对于通过名为“Jumphost”的防火墙作为跳转主机连接到 FooServer 非常有用:
其中,
$ ssh -tt Jumphost ssh -tt FooServer
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer command1 arg1 arg2
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer htop
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer screen -dR
- 传递给 ssh 命令的选项-t强制分配伪 tty。这可用于在远程计算机上执行任意基于屏幕的程序。多个-tt选项强制分配 tty,即使 ssh 没有本地 tty。
如何使用 stdio 转发通过网关
语法很简单,如上所述。由于语法,您不再需要安装 ncProxyCommand:
$ ssh -o ProxyCommand="ssh -W %h:%p jumphost.example.com" server1.example.com
假设两个 Unix 或 Linux 服务器上的用户帐户名称不同。这里,“tom”是第二台机器上的帐户,它是最终目标。用户“jerry”是中间或跳转主机上的帐户:
$ ssh -l tom \
-o 'ProxyCommand ssh -l jerry %h nc server2.example.com 22' \
-o 'HostKeyAlias server2.example.com' \
server1.example.com
我的 ~/.ssh/config 文件的更新版本:
Host webserver Hostname www42.example.com ProxyCommand ssh jumphost.example.com -W %h:%p Host mysftpserver HostName sftpserver.example.com HostKeyAlias sftpserver.example.com ProxyCommand ssh jumphost.example.com -W %h:%p
现在我要做的就是输入以下 ssh 命令或 sftp 命令:
$ ssh webserver
如何使用 ProxyJump 穿过一个或多个网关/防火墙
OpenSSH 7.3 或更高版本包含 ~/.ssh/config 文件的简单语法:
Host forum
HostName www.example.com
ProxyJump vivek@jumhost.example.com:22
User vivek
可以使用逗号分隔的列表设置多个跳转主机,并且将按照列出的顺序访问服务器:
Host www-admin-box HostName www.example.com ProxyJump tom@jumphost1.example.com:22,jerry@jumphost2.example.com:42 User vivek
如何使用 stdio 转发递归链接网关?
ProxyJump尝试在 ~/.ssh/config 文件中使用从 OpenSSH 7.3 或更高版本开始可用的以下语法:
Host exampleserver1 Hostname hello.vpn.example.com User vivek IdentityFile /home/vivek/.ssh/exampleserver1_e25519 Port 22 Host exampleserver2 Hostname 192.168.2.25 User vivek IdentityFile /home/vivek/.ssh/exampleserver2_e25519 Port 22 ProxyCommand ssh -W %h:%p exampleserver1 Host exampleserver3 Hostname 10.8.0.5 User fred IdentityFile /home/vivek/.ssh/exampleserver3_e25519 Port 22 ProxyCommand ssh -W %h:%p exampleserver2
接下来我输入以下内容:
$ ssh exampleserver3
使用 netcat 向 ProxyCommand 打招呼(旧方法)
语法如下,适用于所有客户端。
需要 netcat (nc) 命令来设置和建立 Jumphost(或防火墙)和 FooServer 之间的 TCP 管道。现在,我的笔记本电脑(本地系统)已连接到 Jumphost,现在已连接到 FooServer。在此示例中,实用程序 netcat (nc) 用于直接读取和写入网络连接。它可用于将连接传递到第二台服务器,例如 FooServer。
$ ssh -o ProxyCommand='ssh firewall nc remote_server1 22' remote_server1
$ ssh -o ProxyCommand='ssh vivek@Jumphost nc FooServer 22' vivek@FooServer
##########################################
## -t option is needed to run commands ###
##########################################
$ ssh -t -o ProxyCommand='ssh vivek@Jumphost nc FooServer 22' vivek@FooServer htop
更新 ~/.ssh/config 文件(使用 netcat [nc] 的旧方法)
使用文本编辑器(例如 vi)编辑 $HOME/.ssh/config 文件,输入:
$ vi ~/.ssh/config
附加以下配置:
Host fooserver HostName FooServer User vivek ProxyCommand ssh vivek@Jumphost nc %h %p
保存并关闭文件。其中,
- Host fooserver:设置您选择的昵称。
- HostName FooServer:设置真实的远程服务器/主机名。
- User vivek:设置远程服务器/主机的真实用户名。
- ProxyCommand ssh vivek@Jumphost nc %h %p:指定用于连接服务器的命令。在此示例中,我使用 nc 命令。任何出现的 都将被要连接的主机名、端口和远程用户名%h替换。%p%r
要测试,请输入:
$ ssh fooserver
要查看详细信息,请将-v选项传递给 ssh 命令。以下是另一个代码片段:
Host server1
HostName v.server1
User root
Port 22
ProxyCommand ssh root@v.backup2 nc %h %p %r
现在,运行:
$ ssh -v server1
示例输出:
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011 debug1: Reading configuration data /Users/veryv/.ssh/config debug1: /Users/veryv/.ssh/config line 1: Applying options for server1 debug1: Reading configuration data /etc/ssh_config debug1: /etc/ssh_config line 20: Applying options for * debug1: /etc/ssh_config line 102: Applying options for * debug1: Executing proxy command: exec ssh root@v.backup2 nc v.server1 22 root debug1: permanently_drop_suid: 501 debug1: identity file /Users/veryv/.ssh/id_rsa type 1 debug1: identity file /Users/veryv/.ssh/id_rsa-cert type -1 debug1: identity file /Users/veryv/.ssh/id_dsa type -1 debug1: identity file /Users/veryv/.ssh/id_dsa-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.2 debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH* debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug1: Server host key: RSA d2:07:84:79:21:a7:84:84:14:ef:f1:7a:84:a5:a1:7s debug1: Host 'v.server1' is known and matches the RSA host key. debug1: Found key in /Users/veryv/.ssh/known_hosts:37 debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: Roaming not allowed by server debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey,password,keyboard-interactive debug1: Next authentication method: publickey debug1: Offering RSA public key: /Users/veryv/.ssh/id_rsa debug1: Server accepts key: pkalg ssh-rsa blen 279 debug1: Authentication succeeded (publickey). Authenticated to v.server1 (via proxy). debug1: channel 0: new [client-session] debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug1: Sending environment. Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-52-generic x86_64) * Documentation: https://help.ubuntu.com/ Last login: Sun May 17 15:41:26 2015 from 10.70.203.66
sftp 语法
语法如下:
sftp -o 'ProxyCommand=ssh %h nc firewall.example.net.in 22' \ -o 'HostKeyAlias=firewall.example.net.in' \ vivek@server1.example.net.in
结论
您通过示例了解了 SSH ProxyCommand 和 ProxyJump 命令。下面是简要总结:
请参阅此处的 openssh文档了解更多信息,或使用 man 命令或 help 命令阅读它们:
$ man sshd
$ man sshd_config
$ man ssh_config
$ man ssh
- 20 个 OpenSSH 服务器最佳安全实践
- 如何在 Linux / Unix 系统上设置 SSH 密钥
- Linux / Unix 用户的 OpenSSH 配置文件示例
- 审计 Linux/Unix 上的 SSH 服务器和客户端配置
- 如何在 FreeBSD 上安装和升级 OpenSSH 服务器
- Ubuntu Linux 安装 OpenSSH 服务器
- 在 Alpine Linux 上安装 OpenSSH 服务器(包括 Docker)
- Debian Linux 安装 OpenSSH SSHD 服务器
- 配置 OpenSSH 以监听 IPv6 地址
- OpenSSH 服务器连接在几分钟不活动后断开
- 在 OpenSSH 身份验证之前显示横幅/消息
- 强制 OpenSSH(sshd)仅监听选定的多个 IP 地址
- OpenSSH 使用 ssh-keygen 命令更改密码
- 重复使用 SSH 连接以通过多路复用加速远程登录过程
- 重新启动 SSHD 服务器之前检查语法错误
- 更改 Linux 或 Unix 服务器上的 ssh 端口
- OpenSSH 拒绝或限制用户和组的访问
- Linux OpenSSH 服务器拒绝 root 用户访问/登录
- 在 Linux 上禁用 ssh 密码登录以提高安全性
- SSH ProxyCommand 示例:通过一台主机到达服务器
- OpenSSH 多路复用器可加速 OpenSSH 连接
- 在远程 Linux / UNIX 服务器中安装 / 附加 SSH 密钥 Authorized_keys
- 使用 ssh-copy-id 与监听不同端口的 OpenSSH 服务器配合使用