通过中间机转发 SSH 流量

通过中间机转发 SSH 流量

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/confighostA 上的文件中(参见人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连接到。完成隧道连接后,只需关闭运行上述命令的终端即可。machinecmachineb

请注意,您需要超级用户权限才能运行该命令。

答案4

听起来你想要一个在 A 上的 shell 别名,从而导致在 C 上发生 ssh

  1. 我假设在 A 上,您可以输入 ssh me@b “ssh me@c hostname”并返回“C”
  2. 创建一个别名 sshc,将 sshc foo 扩展为 ssh me@b "ssh me@c foo"
  3. 有关创建别名的确切语法,请参阅 superuser.com

相关内容