从 A 到 B 到 C 的 SSH,使用 B 上的私钥

wra*_*ler 85 linux firewall ssh bash proxy

我正在寻找一种简单的方法从我的本地机器 A SSH 通过代理 B 到目标主机 C。与 C 上的公钥一起使用的私钥在 B 上,但我不能把那个钥匙放在我的本地机器上。有小费吗?

另外,我希望能够使用 ~/.ssh/config 执行此操作。

谢谢!

Sno*_*all 104

示意图:

    ssh       ssh
A ------> B ------> C
    ^          ^
 using A's   using B's
 ssh key     ssh key
Run Code Online (Sandbox Code Playgroud)

先决条件:

  • A 正在运行 ssh-agent;
  • A可以访问B
  • B可以访问C
  • A的 ssh 公钥存在于 B:~/.ssh/authorized_keys
  • B的 ssh 公钥存在于 C:~/.ssh/authorized_keys

~/.ssh/configA,加

Host C
    ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Run Code Online (Sandbox Code Playgroud)

如果您在 B 上的 ssh 私钥位于非标准位置,请将其路径添加到ssh-add.

您现在应该能够访问C来自A

A$ ssh C
C$
Run Code Online (Sandbox Code Playgroud)

  • 如果 C 的私钥仅存在于 B 上,@DrewVS `ProxyJump B` 似乎不起作用。还有什么方法可以做到这一点吗? (6认同)
  • 从 openssh v.7.3 开始,你可以只使用 `ProxyJump B`。来源:[wikibooks](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Passing_Through_One_or_More_Gateways_Using_ProxyJump) (4认同)
  • 可以这样定义: Host user1@c ProxyCommand ssh -o 'ForwardAgent yes' user2@B 'ssh-add && nc %h %p' (2认同)
  • 如果机器 B 没有 `nc`,解决方案将如何改变? (2认同)

Sac*_*kar 35

检查以下是否有效。

ssh -t B ssh C
Run Code Online (Sandbox Code Playgroud)

如果要使用存储在 B 上的密钥,请使用以下命令。

ssh -t B ssh -i /path/to/identity_on_B C
Run Code Online (Sandbox Code Playgroud)

在这里,我们指定ssh -i /path/to/identity_on_B C要在 B 上执行的命令 ie ,而不是在登录 shell 上执行。

  • FML,这可以在命令行中运行,但在使用 ProxyCommand 在 .ssh/config 文件中设置时则不行。我被困住了。这里的整个想法是将我所有的 id_rsa 密钥放在一个中央位置,并使用 .ssh/config 通过这个中央框创建 ssh 的快捷方式 (3认同)

wra*_*ler 12

我现在已经解决了这个问题。这是解决方案,这是相当简单的。我应该早点看到它:

~/.ssh/配置:

Host B
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/rsa_key
  ControlMaster auto
  ControlPath ~/.ssh/socket/master-%l-%r@%h:%p

Host C.*
  User customer_username
  Port customer_port
  IdentityFile remote/path/to/ssh/key
  ForwardAgent yes
  ProxyCommand ssh accessable.server nc %h %p

Host C.server-1
  HostName 2.3.4.5
Run Code Online (Sandbox Code Playgroud)

'B' 是您要跳过的代理服务器。它应该像您通常配置对服务器的访问一样进行配置。

'C' 是目标主机。它需要配置为在连接过程中使用'B'。“C”中的身份文件是“B”上 ssh-key 的路径。ProxyCommand 使用 Netcat 打开从“B”到“C”的连接。需要在“B”上安装 Netcat 或 nc。

NOTE1:要做到这一点,您需要将 B 的身份文件(通常是 ~/.ssh/rd_isa)复制到 A。我通常将其名称更改为 rd_isa_B。

注2:此解决方案也适用于 scp。

希望这对其他人有帮助。

  • 我说得太快了。此解决方案似乎不起作用。密钥已加载到 ssh-agent 中,所以我认为它可以正常工作。在上面,C 的密钥仍然需要在 A 上,而不是在 B 上。 (5认同)

Dan*_*ker 7

雪球的回答很有帮助。不过,我对该命令做了一些修改,并想解释它是如何工作的。鉴于这种情况:

    ssh        ssh
A -------> B -------> C
     ^          ^
  using A's  using B's
  ssh key    ssh key
Run Code Online (Sandbox Code Playgroud)

修改文件并添加要跳转的~/.ssh/config主机,就像通常配置主机一样​​:B

Host B
 User myusername
 HostName b.mycompany.com
Run Code Online (Sandbox Code Playgroud)

C然后添加您想要结束的主机:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Run Code Online (Sandbox Code Playgroud)

请注意ProxyCommand, 其中:

  • ssh -T -q指示它不应分配伪 TTY ( -T) 并保持安静 ( -q) ;
  • 一旦到达跳转主机B,我们将密钥添加到Athrough的 SSH 密钥中ssh-add
  • 这只有效,因为我们使用 转发 SSH 代理-o 'ForwardAgent yes'
  • ssh-add -t 1表示我希望仅在向最终主机 C 进行身份验证所需的 1 秒内添加密钥;
  • 最后,nc %h %p启动netcat与最终主机%h端口的连接%p(两者都将由 SSH 根据文件中的信息填写~/.ssh/config)。

如果您需要指定要使用的自定义键B,可以通过修改以下ssh-add部分来实现:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'
Run Code Online (Sandbox Code Playgroud)