我一直在努力建立一个有效的配置来打开与第二台机器的连接,通过另一台机器,并使用 id_rsa(要求我输入密码)连接到第三台机器。
我在另一个论坛上问过这个问题,但没有收到任何有用的答案。
这个问题,更准确的描述如下:
Local machine: user1@localhost
Intermediary machine: user1@inter
Remote target: user2@final
我能够使用伪tty完成整个连接:
ssh -t inter ssh user2@final
(这将询问我在机器“inter”中的 id_rsa 文件的密码)
但是,为了加快速度,我想设置我的 .ssh/config 文件,以便我可以简单地使用以下命令连接到机器“final”:
ssh final
到目前为止我得到的 - 不起作用 - 是在我的 .ssh/config 文件中:
Host inter
User user1
HostName inter.com
IdentityFile ~/.ssh/id_rsa
Host final
User user2
HostName final.com
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh inter nc %h %p
id_rsa 文件用于连接中间机器(这不需要我输入密码),id_rsa_2 文件用于连接机器“final”(这台机器要求输入密码)。
我尝试混合一些LocalForward
和/或RemoteForward
字段,并将 id_rsa 文件放入第一台和第二台机器中,但似乎无法在没有任何配置的情况下成功。
PS:我尝试从以下帖子寻求帮助:
http://www.linuxquestions.org/questions/linux-general-1/proxycommand-on-ssh-config-file-4175433750/
答案1
方法 1(在 inter 上使用 ssh-key)
如果你想保留身份验证流程
local -- authenticate --> inter -- authenticate (ask password) --> final
这无法通过 .ssh/config proxyhost 完成。
您需要的是 bash shell 别名(我希望您正在使用 bash)。
在~/.bashrc
,添加以下行
alias ssh-final='ssh -t inter ssh [email protected]'
在命令提示符下,只需输入以下内容
ssh-final
final
部分~/.ssh/config
未使用。
连接详细信息(1)
ssh -t inter ssh [email protected]
可以查看如下
local# ssh inter
inter# ssh [email protected]
local
只是在与 进行“对话” 。和inter
之间没有直接或间接的 ssh 连接。只是显示 的输出。local
final
local
ssh [email protected]
方法 2(在本地使用 ssh-key)
使用相同的 ssh-key 进行身份验证
Host inter
User user1
HostName inter.example.com
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
复制当地的 ~/.ssh/id_ras.pub
到
/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`
连接详细信息(2)
ssh 隧道
在我们详细讨论之前ProxyCommand
,让我们先看下面的例子
步骤 1,在终端窗口 1
local# ssh inter -L 2000:final.com:22
第 2 步,在终端窗口 2 上
local# ssh localhost -p 2000
在终端 1 中,在本地端口 2000 和 final.com 端口 22 之间建立了一个隧道。发送到本地端口 2000 的任何内容都将被转发到 final.com 端口 22,反之亦然。
在终端2中,ssh连接到本地端口2000,但实际上是与final.com端口22进行通信,即sshd。
通过隧道,步骤2中的本地ssh客户端直接与final.com sshd连接。
本地端口 2000 的“输出”是“原始” ssh 守护进程流量。
此类隧道的常见用途是访问内部 Web 服务器或电子邮件服务器。以下是 Web 服务器的示例
local# ssh inter -L 2000:final.com:80
在浏览器中使用以下 URL
http://localhost:2000
隧道的两个端点分别是本地端口2000,以及final.com端口80。
流量以“原样”方式进出隧道端点。我们称之为“原始”流量。
代理命令
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
更进一步ProxyCommand
。它跳过创建本地端口并连接到它的步骤。
ssh 客户端将执行后面给出的任何命令ProxyCommand
,并将该命令的输出视为“原始”流量。它保留本地端点,然后与其启动 ssh 连接。
为什么一个有效,另一个无效?
以下命令
ssh inter nc final.com 22
基本上意味着(1)连接到inter
,然后(2)打开inter
,运行命令nc final.com 22
。
nc - arbitrary TCP and UDP connections and listens
因此nc final.com 22
将连接到 final.com 端口 22,将所有传入流量打印到 stdout,并将所有 stdin 发送到另一端。这是 nc stdin/out 和 final.com 端口 22 之间的“隧道”。
由于是nc
在 ssh 会话中运行的,因此其所有 stdout 都会作为“原始”流量传回 ssh 客户端。ssh 客户端可以将流量传递到 nc stdin,最终到达 final.com 端口 22。
通过上述“隧道”,本地 ssh 客户端将final.com
直接启动 ssh 会话。
以下命令
ssh -t inter ssh [email protected]
无法使用,ProxyCommand
因为它的输出不是来自 ssh 守护进程的“原始”流量。它是ssh 客户端。客户跟客户谈话意味着没有生意。
使用不同的 ssh-key 进行身份验证(OP 原始配置)
Host inter
User user1
HostName inter.com
IdentityFile ~/.ssh/id_rsa
Host final
User user2
HostName final.com
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh inter nc %h %p
复制当地的 ~/.ssh/id_ras.pub
到
/home/user1/.ssh/authorized_keys in `inter`
复制当地的 ~/.ssh/id_ras_2.pub
到
/home/user2/.ssh/authorized_keys in `final`
以上两种方式均可实现以下用途
local# ssh final
额外检查
使用详细
local# ssh -v final
这应该有助于识别 ssh 问题。
检查数控
ProxcyCommand
正在执行nc
。inter
检查 是否nc
确实在 上可用inter
。
local# ssh inter
inter# nc final.com 22
检查 rsa 密钥是否设置正确
inter
如果要对和使用不同的密钥final
,则本地计算机中应存在以下文件
local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub
由于您已经可以 ssh 到inter
,请检查 上的密钥设置final
。从您的本地机器
local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys
您应该会看到id_rsa_2.pub
那里的内容。
答案2
我没有看到任何实际列出的错误或 ssh -v 语句来帮助查看它挂断的位置。
嘿,伙计,你几乎说对了——最好、最安全的方法是两个都本地计算机上的密钥。然后,您可以使用 ssh-agent 转发进行连接,而不是在中间步骤留下密钥。您还可以享受每次登录时只需输入一次密钥密码的优势。
如果您拥有像 ubuntu 这样的现代/用户友好的操作系统(在本地机器上),则无需任何 *按摩* 即可正常工作。我故意省略了身份文件,您不需要它。
你的配置文件看起来会像这样:
Host inter
User user1
ForwardAgent yes
HostName inter.com
Host final
ForwardAgent yes
User user2
HostName final.com
ProxyCommand ssh inter nc %h %p
如果没有,请执行以下步骤以确保 ssh-agent 正在运行:
'ssh-add -l' (lower case L) will list your private keys if any are loaded, or will be blank, or will say can’t connect to ssh-agent, if so, start ssh-agent.
'eval `ssh-agent`' (those are backticks) starts ssh agent
'ssh-add' will add your key… you can add a path argument if you have a key in a non-default area. At this point you will enter your passphrase.
有一个很好的指南解释了这是如何工作的,这里。