我有 3 台服务器,我们分别称之为 A、B 和 C
服务器 C 位于防火墙后面,只有服务器 B 可以连接到它。服务器 B 和 C 在我的控制之下。
现在我想让服务器 A 通过服务器 B 连接到服务器 C:A -> B -> C
问题是我无法更改服务器 A 上的命令,它可能只是一个简单的 ssh 用户@B。
我正在尝试使用authorized_keys中的命令选项转发传入连接:
command="ssh user@C" ssh-rsa KEY
每当 A 与 B 建立连接时,我都能看到与 C 建立了连接,但 A 似乎没有意识到这一点并且超时。
我尝试在 ssh 命令中添加选项 -t、-t -t、-T 或 -N,但无济于事。有没有办法转发 ssh 连接,让服务器 A 认为它正在与服务器 B 通信。
当A与B建立连接时需要触发B和C之间的连接,当A关闭连接时也需要关闭B和C之间的连接。
所有身份验证均使用密钥完成。
[编辑]
澄清一下:我无法控制服务器 A 上的命令,但现在,A 确实连接到 B,然后 B 打开与 C 的连接。这里的问题是 A 无法识别该新连接。我认为它没有收到提示或其他信息,因此 A 不知道存在连接。
如果我手动使用此设置
ssh user@B
它有效并且我直接在 C 登录。
答案1
您正在寻找的是 SSH 隧道。
ssh -f user@B -L 2000:C:22
这将连接到服务器 B,直接进入后台-f
,然后使用 在本地主机上打开端口 2000。L
发送到本地主机上此端口的所有内容都将转发到 C 上的端口 22。因此,输入此命令后,您可以执行
ssh localhost -p 2000
它将连接你到 C。
更新
看来我误解你了,抱歉。如果你无法更改 A 上的命令,你仍然可以通过更改~/.bashrc
用户的 来指定登录时应发生的情况。
答案2
在服务器 B 中用户的主目录中,您需要向文件添加最后一行~/.login
(如果不存在则创建它)以运行第二个ssh userc@hostC
。
请不要使用~/.bashrc
:前者在登录后使用,而后者用于每次 bash 执行,即使是以 开头的脚本中的执行#!/bin/bash
。