我想通过单个 SSH 堡垒服务器(即 )访问多个不同的 SSH 服务器(即dest1
)。我想避免每次要连接到不同的 SSH 服务器时都登录堡垒服务器。我该怎么做?dest2
bastion
我尝试将我的公钥添加到堡垒服务器。但是,堡垒服务器禁用了公钥登录,并要求密码登录。(密码是密码和 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。
建立隧道:
ssh user@bastion -f -N -L 40001:dest1:22 -L 40002:dest2:22
连接到目标1:
ssh localhost -p 40001
方案 1
你可以朝另一个方向走,使用仅有的动态隧道选项-D 55555
。但是,您不能简单地将其与 一起使用ssh -p
;您需要可以充当 SOCKS 客户端的其他软件。一个例子是 socat,您可以将其用作 sshProxyCommand
助手:
建立隧道:
ssh user@bastion -f -N -D 55555
连接到目标1:
ssh dest1 -o ProxyCommand="socat stdio socks4a:localhost:[%h]:%p,socksport=55555"
方案 2
您可以使用ControlPath
和ControlMaster
选项来告诉初始远程控制客户端充当其他客户端的代理:
建立连接:
ssh user@bastion -S ~/.ssh/S.bastion -f -N -M
打开交互式 shell:
ssh bastion -S ~/.ssh/S.bastion
连接到其他服务器:
ssh bastion -S ~/.ssh/S.bastion -t "ssh dest1"
添加隧道:
ssh bastion -S ~/.ssh/S.bastion -O forward -L 12345:dest1:22
移除隧道:
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