SSH ProxyCommand示例:通过一台主机到达另一台服务器
在Linux或者类似Unix的系统上,如何使用ssh并通过一台服务器跳转到另一台服务器?是否可以通过中介连接到另一个主机,以便客户端可以像使用ssh直接连接一样进行操作?您能给我SSH ProxyCommand和ProxyJump示例吗?您可以使用ProxyCommand跳转主机。 有时候,您只能通过ssh来访问远程服务器,方法是首先登录到中间服务器(或者防火墙/跳转主机)。
因此,您首先登录到中间服务器,然后通过SSH到另一台服务器。
您需要进行两次身份验证,并且该链可能很长,并且不仅限于两个主机。
我们的SSH ProxyCommand示例设置
+-------+ +----------+ +-----------+
| Laptop| | Jumphost | | FooServer |
+-------+ +----------+ +-----------+
OR
+-------+ +----------+ +-----------+
| Laptop| | Firewall | | FooServer |
+-------+ +----------+ +-----------+
192.168.1.5 121.1.2.3 10.10.29.68
我只能先通过登录名为Jumphost的中间服务器来通过ssh访问名为FooServer的远程服务器。
首先,登录Jumphost:
$ ssh Hyman@Jumphost
接下来,我必须按如下方式通过中介系统进行SSH:
$ ssh Hyman@FooServer
通过一两个网关
我可以通过首先建立到名为hello.vpn.theitroad.local的跳转主机的ssh连接,然后从那里建立到最终目的地的TCP转发来连接到名为www.theitroad.com的目标主机:
ssh -J Jumphost FooServer ssh -J Jumphost Hyman@FooServer ssh -J hello.vpn.theitroad.local www.theitroad.com ssh -J hello.vpn.theitroad.local:22 [email protected]
-J选项不可用时使用的命令
在旧版本的openssh中,'-J'不可用。
因此,请使用以下语法:
$ ssh -o ProxyCommand="ssh -W %h:%p Jumphost" FooServer $ ssh -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected] $ ssh -o ProxyCommand="ssh -W %h:%p [email protected]" root@wp-admin-server
最老的客户端不支持-W选项
在这种情况下,ssh -tt命令。
除了执行两个ssh命令,我还可以执行以下多合一命令。
这对于通过名为Jumphost的防火墙作为跳转主机连接到FooServer很有用:
$ ssh -tt Jumphost ssh -tt FooServer $ ssh -tt Hyman@Jumphost ssh -tt Hyman@FooServer $ ssh -tt Hyman@Jumphost ssh -tt Hyman@FooServer command1 arg1 arg2 $ ssh -tt Hyman@Jumphost ssh -tt Hyman@FooServer htop $ ssh -tt Hyman@Jumphost ssh -tt Hyman@FooServer screen -dR
其中:
- 传递给ssh命令的
-t选项强制伪伪分配。这可用于在远程计算机上执行任意基于屏幕的程序。即使ssh没有本地tty,多个-tt选项也会强制tty分配。
如何使用stdio转发通过网关
语法很简单,如上所述。
由于ProxyCommand语法,您不再需要更长的时间安装nc:
ssh -o ProxyCommand="ssh -W %h:%p jumphost.theitroad.com" server1.theitroad.local
假设两个Unix或者Linux服务器上的用户帐户名称不同。
在这里,tom是第二台计算机上的帐户,这是最终目标。
用户jerry是中介或者跳转主机上的帐户:
ssh -l tom \
-o 'ProxyCommand ssh -l jerry %h nc server2.theitroad.com 22' \
-o 'HostKeyAlias server2.theitroad.com' \
server1.theitroad.local
我的~/.ssh/config文件的更新版本:
Host webserver
Hostname www42.theitroad.local
ProxyCommand ssh jumphost.theitroad.com -W %h:%p
Host mysftpserver
HostName sftpserver.theitroad.local
HostKeyAlias sftpserver.theitroad.local
ProxyCommand ssh jumphost.theitroad.com -W %h:%p
现在,我所要做的就是执行以下ssh命令或者sftp命令:
ssh webserver
如何使用ProxyJump通过一个或者多个网关/防火墙
OpenSSH 7.3或者更高版本包含~/.ssh/config文件的简单语法:
Host forum
HostName www.theitroad.com
ProxyJump [email protected]:22
User Hyman
可以使用逗号分隔的列表设置多个跳转主机,然后将按照列出的顺序访问服务器:
Host www-admin-box
HostName www.theitroad.local
ProxyJump [email protected]:22,[email protected]:42
User Hyman
如何使用stdio转发递归链接网关?
请尝试在您的~/.ssh/config文件中从OpenSSH版本7.3或者更高版本开始提供以下ProxyJump语法:
Host theitroadserver1
Hostname hello.vpn.theitroad.local
User Hyman
IdentityFile /home/Hyman/.ssh/theitroadserver1_e25519
Port 22
Host theitroadserver2
Hostname 192.168.1.25
User Hyman
IdentityFile /home/Hyman/.ssh/theitroadserver2_e25519
Port 22
ProxyCommand ssh -W %h:%p theitroadserver1
Host theitroadserver3
Hostname 10.8.0.5
User fred
IdentityFile /home/Hyman/.ssh/theitroadserver3_e25519
Port 22
ProxyCommand ssh -W %h:%p theitroadserver2
接下来,我执行以下内容:
ssh theitroadserver3
用netcatProxyCommand(旧方法)
语法如下,并且适用于所有客户端
$ ssh -o ProxyCommand='ssh firewall nc remote_server1 22' remote_server1 $ ssh -o ProxyCommand='ssh Hyman@Jumphost nc FooServer 22' Hyman@FooServer ########################################## ## -t option is needed to run commands ### ########################################## $ ssh -t -o ProxyCommand='ssh Hyman@Jumphost nc FooServer 22' Hyman@FooServer htop
需要netcat(nc)命令来设置和建立Jumphost(或者防火墙)与FooServer之间的TCP管道。
现在,我的笔记本电脑(本地系统)已连接到Jumphost,现在它已连接FooServer。
在此示例中,实用程序netcat(nc)用于直接读取和写入网络连接。
它可以用于将连接传递到第二服务器,例如FooServer。
更新~/.ssh/config文件(使用netcat [nc]的旧方法)
使用文本编辑器(例如vi)编辑$HOME/.ssh/config文件,执行:
$ vi ~/.ssh/config
追加以下配置:
Host fooserver HostName FooServer User Hyman ProxyCommand ssh Hyman@Jumphost nc %h %p
保存并关闭文件。
其中:
Host fooserver:设置您选择的昵称。- HostName FooServer:设置真实的远程服务器/主机名。
User Hyman:设置远程服务器/主机的真实用户名。- ProxyCommand ssh Hyman @ Jumphost nc%h%p:指定用于连接服务器的命令。在此示例中,我使用nc命令。任何出现的%h都将由连接的主机名代替,%p则由端口代替,%r则由远程用户名代替。
要测试,请执行:
$ ssh fooserver
要查看详细信息,请将-v选项传递给ssh命令。
这是另一个片段:
Host server1 HostName v.server1 User root Port 22 ProxyCommand ssh [email protected] nc %h %p %r
现在,运行:
$ ssh -v server1
sftp语法
语法如下:
sftp -o 'ProxyCommand=ssh %h nc firewall.theitroad.com 22' \
-o 'HostKeyAlias=firewall.theitroad.com' \
[email protected]

