方法 1(在 inter 上使用 ssh-key)

方法 1(在 inter 上使用 ssh-key)

我一直在努力建立一个有效的配置来打开与第二台机器的连接,通过另一台机器,并使用 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 连接。只是显示 的输出。localfinallocalssh [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正在执行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

由于您已经可以 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.

有一个很好的指南解释了这是如何工作的,这里。

相关内容