SSH ProxyCommand示例:通过一台主机到达另一台服务器

时间:2020-01-09 10:42:24  来源:igfitidea点击:

在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]