我可以通过 从我的本地机器 A 通过 SSH 连接到跳转主机服务器ssh B
B。
服务器 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
)。
通过 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
。)只要上述连接正在运行,您就可以使用常规 ProxyJump 配置从 HostA 连接到 HostC,使用仅存在于 HostB 上的键:
HostA$ export SSH_AUTH_SOCK=/tmp/agent HostA$ ssh -J HostB HostC
(ssh/config 选项是
IdentityAgent
和ProxyJump
。)
另一个选择是从 B 复制keyC
到 A 并存储在安全硬件上例如 TPM 芯片或智能卡(带 PIV 模式的 Yubikey 也算)。这样就可以在机器 A 上本地使用密钥,而不会被盗。
(对于 Linux 上的 TPM2.0,您可以选择tpm2-pkcs11
或ssh-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
。