如何通过 SSH 进入只能从跳转主机寻址和访问的服务器?

如何通过 SSH 进入只能从跳转主机寻址和访问的服务器?

我可以通过 从我的本地机器 A 通过 SSH 连接到跳转主机服务器ssh BB。

服务器 C 仅可寻址(具有 C.internal 地址)并且可通过 B 访问ssh C

如何从我的本地机器直接通过 SSH 进入 C?

SSH 命令和配置文件是什么样的?

A 上的 ssh 配置:

Host B
    User userB
    HostName B.example.com
    IdentityFile ~/.ssh/keyB

B上的ssh配置:

Host C
  HostName C.internal
  User userC
  IdentityFile ~/.ssh/keyC

~/.ssh/keyC不从主机 B 复制到本地机器 A可以做到这一点吗?

答案1

有多种选项,但没有一个是“单一命令”:

您可以向 B 运行一个 SSH 命令,而该命令只会向 C 运行第二个 SSH 命令;您需要添加选项-t才能使其适用于交互式 SSH:

  • ssh -t hostB "ssh hostC"
  • ssh -t hostB "ssh -t hostC htop"
  • ssh hostB ssh hostC ls -la /etc

如果你想通过 SSH 从 A 直接连接到 C,你需要一些额外的设备来转发 ssh-agent 连接来自B到本地系统(即与通常所做的相反ssh -A)。

  1. 通过 SSH 连接到主机 B,然后在手动指定的路径启动 ssh-agent。使用 SSH“流转发”功能允许本地客户端访问远程代理进程:

    HostA$ ssh -t -L /tmp/agent:/tmp/agent HostB \
        "ssh-agent -a /tmp/agent sh -c 'ssh-add ~/.ssh/keyC && sleep infinity'"
    

    (ssh/config 选项是LocalForward。)

  2. 只要上述连接正在运行,您就可以使用常规 ProxyJump 配置从 HostA 连接到 HostC,使用仅存在于 HostB 上的键:

    HostA$ export SSH_AUTH_SOCK=/tmp/agent
    HostA$ ssh -J HostB HostC
    

    (ssh/config 选项是IdentityAgentProxyJump。)


另一个选择是从 B 复制keyC到 A 并存储在安全硬件上例如 TPM 芯片或智能卡(带 PIV 模式的 Yubikey 也算)。这样就可以在机器 A 上本地使用密钥,而不会被盗。

(对于 Linux 上的 TPM2.0,您可以选择tpm2-pkcs11ssh-tpm-agent;Windows 上的 TPM2.0 可以通过 PuTTY-CAC 使用。对于带有 PIV 的 Yubikeys,Windows 和 Linux 都有 PKCS#11 模块。我使用的是来自 Ebay 的 eToken 5110。还有一种方法可以将 FIDO2 密钥与 SSH 一起使用,但这需要生成新密钥。)

答案2

/etc/ssh/ssh_config你需要一个像全局或用户的ssh_config 文件~/.ssh/config

Host B
  HostName 10.0.0.1
  User username_on_B
  IdentityFile ~/.ssh/id_rsa_for_B
  ForwardAgent yes

# final destination
Host C
  HostName C.internal
  User your_username_on_C
  ProxyJump B
  IdentityFile ~/.ssh/id_rsa_for_C

现在,从A,您可以ssh C

相关内容