通过单跳 SSH 服务器访问多个 SSH 服务器

通过单跳 SSH 服务器访问多个 SSH 服务器

我想通过单个 SSH 堡垒服务器(即 )访问多个不同的 SSH 服务器(即dest1)。我想避免每次要连接到不同的 SSH 服务器时都登录堡垒服务器。我该怎么做?dest2bastion

我尝试将我的公钥添加到堡垒服务器。但是,堡垒服务器禁用了公钥登录,并要求密码登录。(密码是密码和 Yubikey 输出的组合。)

我尝试设置动态端口,然后通过动态端口进行本地端口转发。

我使用以下命令设置了一个动态端口。系统提示时,我输入了密码。

ssh -f -N -o KeepAlive=yes -D 127.0.0.1:55555 -l user bastion

然后我使用以下命令来设置本地端口转发。

ssh -vvv -f -N -L 127.0.0.1:44444:dest1:22 -p 55555 localhost

该命令不起作用。我收到以下输出和错误消息。

OpenSSH_8.0p1, OpenSSL 1.1.1b  26 Feb 2019
debug2: ssh_connect_direct
debug1: Connecting to 127.0.0.1 [127.0.0.1] port 55555.
debug1: Connection established.
kex_exchange_identification: Connection closed by remote host

如果可行,那么我可以简单地执行以下操作来访问 dest1:

ssh -p 44444 me@localhost

稍后,我会为dest2设置另一个本地端口转发,并以类似的方式访问dest2。

编辑:注意:我正在使用 Cygwin。

答案1

原始示例

您的尝试没有成功,因为这不是-D应该如何使用。它不会创建您可以直接通过 SSH 访问的直接侦听器。相反,它会创建一个袜子监听器,它只与可以使用 SOCKS4/5 代理来告诉“服务器”他们首先想要哪个主机的应用程序兼容——这就是“动态”部分的来源。

如果使用第一个命令,你的第二个命令就会起作用-L 55555:localhost:22,但老实说,这两个命令完全多余的– 它不会为您节省任何身份验证检查或任何东西。事实上,您最终会向堡垒进行比必要更多的身份验证。

直接使用即可ssh -L 44444:dest1:22 bastion。(如果您有多个隧道,则可以在此命令上指定多个 -L。)然后您将能够使用它ssh -p 44444 me@localhost来访问dest1。

  1. 建立隧道:ssh user@bastion -f -N -L 40001:dest1:22 -L 40002:dest2:22

  2. 连接到目标1:ssh localhost -p 40001

方案 1

你可以朝另一个方向走,使用仅有的动态隧道选项-D 55555。但是,您不能简单地将其与 一起使用ssh -p;您需要可以充当 SOCKS 客户端的其他软件。一个例子是 socat,您可以将其用作 sshProxyCommand助手:

  1. 建立隧道:ssh user@bastion -f -N -D 55555

  2. 连接到目标1:ssh dest1 -o ProxyCommand="socat stdio socks4a:localhost:[%h]:%p,socksport=55555"

方案 2

您可以使用ControlPathControlMaster选项来告诉初始远程控制客户端充当其他客户端的代理:

  1. 建立连接:ssh user@bastion -S ~/.ssh/S.bastion -f -N -M

  2. 打开交互式 shell:ssh bastion -S ~/.ssh/S.bastion

  3. 连接到其他服务器:ssh bastion -S ~/.ssh/S.bastion -t "ssh dest1"

  4. 添加隧道:ssh bastion -S ~/.ssh/S.bastion -O forward -L 12345:dest1:22

  5. 移除隧道:ssh bastion -S ~/.ssh/S.bastion -O cancel -L 12345:dest1:22

(SSHv2 不假设将在连接上创建什么类型的通道。就像一个 SSHv2 连接可以承载任意数量的 TCP 隧道或 ssh 代理请求一样,它也可以承载任意数量的交互式和非交互式 shell 会话 - 不一定是 0 或 1。)

~/.ssh/config 文件选项如下所示:

Host bastion
    # Automatically keep a background connection (-M) after any use
    ControlMaster auto
    # Keep idle background connections for at least this long
    ControlPersist 1h

Host *
    # Default value for -S
    ControlPath ~/.ssh/S.%r@%h:%p

相关内容