我想ip=1.0.0.3
从我的桌面 (A; ip=1.0.0.1
) 通过另一台服务器 (B; ) 连接到服务器 (C; 1.0.0.2
)。我必须进行端口转发才能从我的桌面在服务器 C 上远程运行 ipython 笔记本,并且无法直接访问。这应该很简单:
ssh -NfL localhost:2023:1.0.0.3:2021 [email protected]
请注意,我已经在 上运行了jupyter notebook
使用端口。但这不起作用。令人惊讶的是,如果我分两步进行操作,一切都很顺利:2021
1.0.0.3
- 在 A:
ssh -L localhost:2023:localhost:2022 [email protected]
- 然后在 B 上:
ssh -L localhost:2022:localhost:2021 1.0.0.3
有人能帮我用一个命令完成所有操作吗?我完全糊涂了,因为上面提到的单个代码曾经在另一个网络系统(不是这些服务器)上运行。
答案1
也许服务器 B 的管理员已PermitOpen localhost:*
在其/etc/ssh/sshd_config
文件中进行了设置?这将限制传入端口转发的远程端ssh -L
仅到本地主机。
请注意,当您使用时,只有转发连接(从 A 到 B)的第一跳通过 SSH 加密:从 B 到 C 的端口 2021 的连接将是纯 TCP,不受 SSH 加密的保护。ssh -NfL localhost:2023:1.0.0.3:2021 [email protected]
使用两步法,转发连接的两个跳转都将在加密的 SSH 隧道内。如果有避免未加密连接的策略要求,服务器 B 的管理员可以添加上述sshd_config
设置以强制合规。
如果您的版本ssh
足够新,可以支持ProxyJump
配置选项,您可能能够使用单个命令设置等效的两步连接(就端口转发而言):
ssh -J [email protected] -NfL localhost:2023:localhost:2021 [email protected]
这可能很难理解,但它的工作原理是这样的:
ssh ... [email protected] # this defines what we want to think as the "main" SSH
# connection: the remote end of the port forwarding
# tunnel(s) will be at 1.0.0.3 (C)
-J [email protected] # ... but use [email protected] as an intermediate
# step for everything, including...
-NfL localhost:2023:localhost:2021
# ... the port forwarding tunnel from
# the local (A) localhost:2023 to the
# ultimate remote's (C) localhost:2021
与两步法相比,ssh -J
/还有一个额外的优势:您不必向主机 B 提供任何 SSH 私钥来自动执行 B -> C 步骤,因为所有身份验证凭据都将直接由主机 A 提供。ProxyJump