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

Rub*_*ens 19 linux ssh rsa ssh-tunnel

我一直在努力设置一个有效的配置来打开与第二台机器的连接,通过另一台机器,并使用 id_rsa(它要求我输入密码)连接到第三台机器。

我在另一个论坛上问过这个问题,但我没有收到可以认为非常有帮助的答案。

这个问题,更好地描述,如下:

Local machine: user1@localhost
Intermediary machine: user1@inter
Remote target: user2@final
Run Code Online (Sandbox Code Playgroud)

我可以使用伪 tty 完成整个连接:

ssh -t inter ssh user2@final
Run Code Online (Sandbox Code Playgroud)

(这将询问我在机器“inter”中的 id_rsa 文件的密码)

但是,为了加快速度,我想设置我的 .ssh/config 文件,以便我可以使用以下命令简单地连接到机器“final”:

ssh final
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所拥有的 - 不起作用 - 在我的 .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
Run Code Online (Sandbox Code Playgroud)

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/

Joh*_*Siu 22

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

如果要保留身份验证流程

local -- authenticate --> inter -- authenticate (ask password) --> final
Run Code Online (Sandbox Code Playgroud)

这不能用 .ssh/config 代理主机完成。

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

~/.bashrc,添加以下行

alias ssh-final='ssh -t inter ssh user2@final.com'
Run Code Online (Sandbox Code Playgroud)

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

ssh-final
Run Code Online (Sandbox Code Playgroud)

final~/.ssh/config不使用in 部分。

连接详情(1)

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

local# ssh inter
inter# ssh user2@final.com
Run Code Online (Sandbox Code Playgroud)

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

方法 2(在本地使用 ssh-key)

使用相同的 ssh 密钥进行身份验证

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
Run Code Online (Sandbox Code Playgroud)

复制到本地 ~/.ssh/id_ras.pub

/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`
Run Code Online (Sandbox Code Playgroud)

连接详情(2)

ssh隧道

在我们详细介绍 之前ProxyCommand,让我们看一下下面的例子

步骤 1,在终端窗口 1

local# ssh inter -L 2000:final.com:22
Run Code Online (Sandbox Code Playgroud)

第 2 步,在终端窗口 2 上

local# ssh localhost -p 2000
Run Code Online (Sandbox Code Playgroud)

在终端 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
Run Code Online (Sandbox Code Playgroud)

在浏览器中使用以下 URL

http://localhost:2000
Run Code Online (Sandbox Code Playgroud)

隧道的两个端点是本地端口 2000 和 final.com 端口 80。

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

代理命令

Host final
    User user2
    Hostname <final.com / final IP Address>
    Port 22
    ForwardAgent yes
    ProxyCommand ssh inter nc %h %p
Run Code Online (Sandbox Code Playgroud)

ProxyCommand把它一步。它跳过创建本地端口并连接到它的步骤。

ssh 客户端将执行后面给出的任何命令ProxyCommand,并将该命令的输出视为“原始”流量。它持有本地端点,然后开始与它的 ssh 连接。

为什么一个工作另一个不工作?

以下命令

ssh inter nc final.com 22
Run Code Online (Sandbox Code Playgroud)

基本上意味着(1)连接到inter,然后(2)在inter,运行命令nc final.com 22

nc - arbitrary TCP and UDP connections and listens
Run Code Online (Sandbox Code Playgroud)

Sonc 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
Run Code Online (Sandbox Code Playgroud)

不起作用,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
Run Code Online (Sandbox Code Playgroud)

复制到本地 ~/.ssh/id_ras.pub

/home/user1/.ssh/authorized_keys in `inter`
Run Code Online (Sandbox Code Playgroud)

复制到本地 ~/.ssh/id_ras_2.pub

/home/user2/.ssh/authorized_keys in `final`
Run Code Online (Sandbox Code Playgroud)

以上都将启用以下用法

local# ssh final
Run Code Online (Sandbox Code Playgroud)

额外检查

使用详细

local# ssh -v final
Run Code Online (Sandbox Code Playgroud)

这应该有助于识别 ssh 问题。

检查数控

ProxcyCommand在执行ncinter。检查是否nc在 上实际可用inter

local# ssh inter
inter# nc final.com 22
Run Code Online (Sandbox Code Playgroud)

检查 rsa 密钥设置是否正确

如果要为interand使用不同的键,则final本地计算机中应存在以下文件

local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub
Run Code Online (Sandbox Code Playgroud)

由于您inter已经可以通过 ssh 连接,请检查 上的密钥设置final。从您的本地机器

local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,ssh2 内置了 `nc`。因此,您应该编写 `ProxyCommand ssh inter -W %h:%p`,而不是 `ProxyCommand ssh gateway nc %h %p`。 (2认同)