![通过中间机转发 SSH 流量](https://linux22.com/image/1230520/%E9%80%9A%E8%BF%87%E4%B8%AD%E9%97%B4%E6%9C%BA%E8%BD%AC%E5%8F%91%20SSH%20%E6%B5%81%E9%87%8F.png)
SSH 隧道对我来说非常令人困惑。我想知道我是否可以在 Linux 中做到这一点。
我有 3 台机器..
A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.
因此我可以通过 SSH 从 A -> B 和从 B -> C 进行 SSH,但不能从 A -> C 进行 SSH。
有没有办法设置从 A 到 B 的 SSH 隧道,这样当我运行其他 SSH 命令时,它们就只能从我的本地计算机 A 运行?我基本上是想将 git repo 从工作地点克隆到家里(而且我无法在机器 B 上安装 git)。
另外,一旦设置完毕..我该如何取消设置它呢?
答案1
将其放入.ssh/config
hostA 上的文件中(参见人5 ssh_config详情请见):
# .ssh/config on hostA:
Host hostC
ProxyCommand ssh hostB -W %h:%p
现在以下命令将自动通过 hostB 进行隧道传输
hostA:~$ ssh hostC
您可能希望添加诸如-oCiphers=arcfour
和之类的选项-oClearAllForwardings=yes
来加快速度,因为ssh
在内部包装ssh
在计算上更昂贵,并且需要额外的努力,并且包装器在隧道传输已加密的流量时不需要那么安全。
如果您使用的是 OpenSSH 5.3 之前的版本,则此-W
选项不可用。在这种情况下,您可以使用 netcat ( nc
) 实现上述操作:
ProxyCommand ssh hostB nc %h %p # or netcat or whatever you have on hostB
答案2
对于交互式 shell,你可以使用这个简单的命令:
ssh -J <user>@<hostB> <user>@<hostC>
-J 选项用于跳。
答案3
编辑:这是错误的方法。请参阅ephemient 的回答相反。这个答案是可行的,但可能不太安全,而且肯定不太好。
听起来您想要的是如下解决方案:
ssh -L localhost:22:machinec:22 machineb
这将为你提供一个 shell machineb
。不要管它,最小化终端窗口。
现在,每当您与 建立 ssh 连接时,您实际上将通过localhost
连接到。完成隧道连接后,只需关闭运行上述命令的终端即可。machinec
machineb
请注意,您需要超级用户权限才能运行该命令。
答案4
听起来你想要一个在 A 上的 shell 别名,从而导致在 C 上发生 ssh
- 我假设在 A 上,您可以输入 ssh me@b “ssh me@c hostname”并返回“C”
- 创建一个别名 sshc,将 sshc foo 扩展为 ssh me@b "ssh me@c foo"
- 有关创建别名的确切语法,请参阅 superuser.com