通过隧道使用id_rsa设置ssh配置文件


17

我一直在努力建立有效的配置以打开与第二台计算机的连接,并通过另一台计算机,并使用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文件用于连接到机器“最终”(该用户要求输入密码)。

我尝试混合一些字段LocalForward和/或RemoteForward字段,并将id_rsa文件放在第一台和第二台计算机中,但是无论如何我似乎都无法成功。

PS:我试图从中获得帮助的线程:

http://www.linuxquestions.org/questions/linux-general-1/proxycommand-on-ssh-config-file-4175433750/

Answers:


21

方法1(在内部使用ssh-key)

如果要保留身份验证流程

local -- authenticate --> inter -- authenticate (ask password) --> final

.ssh / config proxyhost无法完成此操作。

您需要的是bash shell别名(我希望您正在使用bash)。

在中~/.bashrc,添加以下行

alias ssh-final='ssh -t inter ssh user2@final.com'

在命令提示符下,只需键入以下

ssh-final

final~/.ssh/config未使用in节。

连接详细信息(1)

ssh -t inter ssh user2@final.com 可以如下查看

local# ssh inter
inter# ssh user2@final.com

local只是与“交谈” interlocal和之间没有直接或间接的SSH连接finallocal只是显示的输出ssh user2@final.com

方法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。

进出隧道端点“ AS IS”的流量。让我们称之为“原始”流量。

代理命令

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会话中运行的,因此其所有标准输出都作为“原始”流量传递回ssh客户端。ssh客户端可以将流量传递到nc stdin,它将最终到达final.com端口22。

通过上面的“隧道”,本地ssh客户端将final.com直接与ssh会话启动。

以下命令

ssh -t inter ssh user2@final.com

ProxyCommand之所以无法使用,是因为它不是来自ssh守护程序的“原始”流量。它是ssh客户端的标准输出。客户与客户的对话意味着没有生意。

使用不同的SSH密钥进行身份验证(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问题。

检查nc

ProxcyCommand在执行ncinter。检查上是否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

由于您可以先切换到inter,请检查上的按键设置final。从您的本地机器

local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys

您应该看到id_rsa_2.pub那里的内容。


抱歉,我应该指出这一点;我实际上可以使用连接ssh -t,但是我想要做的是完全模拟我ssh -t仅通过使用.ssh/config
鲁本斯

配置文件,即使您发布的配置文件也应该起作用。尝试完成该checking步骤。必须缺少某些东西/错误。

1
使用ssh -t,您的ssh to final从发起inter,这与local# ssh interthen 几乎相同inter# ssh final。身份验证介于inter和之间final。使用proxy / nc,您的ssh到final是从本地计算机通过隧道启动到的final。身份验证介于local和之间final
萧晨

@Rubens根据您的评论,我认为您误会了您仍在使用interssh-key进行身份验证final。尝试复制id_rsa_2local〜/ .ssh / id_rsa_2(请勿覆盖本地id_rsa),您的问题可能就消失了。
约翰兆

2
请注意,ssh2已nc内置。因此ProxyCommand ssh gateway nc %h %p,您可以编写ProxyCommand ssh inter -W %h:%p
user123444555621 2014年

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.

这里有一个很好的指南来解释它的工作原理

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.