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]