SSH隧道使我感到非常困惑。我想知道是否可以在Linux上执行此操作。

我有3台计算机。 B并从B-> C,但不是从A->C。

是否有一种方法可以设置从A到B的SSH隧道,所以当我运行其他SSH命令时,它们就可以从我的本地机器A?我基本上是在尝试从工作场所到家庭克隆git存储库(并且我无法在计算机B上安装git)。

此外,一旦设置好。如何取消设置它?

评论

我相信某个地方有一个重复的问题,但是今天我的搜索能力很弱。

那将是我的:superuser.com/questions/96489/ssh-tunnel-via-multiple-hops

SSH隧道可能通过多个跃点重复

如果您在计算机A上运行Linux,请使用名为sshuttle的工具,该工具可让您通过A-> B隧道(假定C从B可见)有选择地转发C的所有流量。

#1 楼

将其放置在hostA上的.ssh/config文件中(有关详细信息,请参见man 5 ssh_config): >
# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p


您可能想添加诸如-oCiphers=arcfour-oClearAllForwardings=yes之类的选项来加快处理速度,因为将ssh封装在ssh内在计算上更加昂贵,并且额外的工作量和包装器在需要时不需要那么安全


如果您使用的OpenSSH早于5.3,则-W选项不可用。在这种情况下,您可以使用netcat(nc)实现以上功能:

hostA:~$ ssh hostC


评论


这太棒了!谢谢。这解决了过去两天一直困扰我的问题:hostC坐在防火墙后面,并拥有我想从hostA访问的数据,hostA是可以在世界任何地方使用的便携式计算机。 hostB也位于与hostC相同的防火墙后面,但是它具有向世界开放的SSH端口。因此,我可以从hostC-> hostB SSH。我在hostC和hostB之间设置了反向SSH隧道,因此我也可以从hostB-> hostC SSH(通过localhost转发)。用你的把戏,我可以从hostA-> hostC去!它可以在OSX上与SCP和Fugu无缝协作!谢谢!

– AndyL
2010年3月7日,下午4:45

应该使用-W选项而不是nc选项。

–vy32
2015年5月3日23:21

哪个SSH应该支持-W,仅支持hostA上的一个(源),也支持hostB上的一个(中间机)?

– gioele
2015年5月5日18:09

有关信息,如果您有多个主机,需要通过同一hostB进行访问,则可以在ProxyCommand上方声明多个Host hostC行,从而可以非常轻松地通过中间服务器访问多个主机。

–fduff
17年5月19日在8:29

#2 楼

编辑:这是错误的方法。请参阅以太坊的答案。此答案会起作用,但可能不太安全,而且绝对不那么令人敬畏。

听起来您想要一个类似以下的解决方案: >这将为您提供machineb的外壳。别管它了;现在,每当您与localhost建立ssh连接时,实际上就可以通过machinec连接到machineb。完成隧道操作后,只需关闭运行上述命令的终端即可。

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

评论


+1感谢韦斯利。这是真正的ssh隧道答案。这是关于它的文章:securityfocus.com/infocus/1816

–拉里K
2010-2-11在4:18

总的来说,这是很邪恶的……但是我不得不使用古老版本的OpenSSH或其他ssh客户端来做到这一点。您可以选择一些高端口,例如8022:这样,它不会干扰localhost上的任何ssh服务,并且不需要以root用户身份运行。只需在您的ssh命令中添加-p 8022。而使用git则很容易死:使用URI ssh:// localhost:8022 / path / to / repo.git。

–短暂
2010-2-11在4:43

#3 楼

对于交互式外壳,可以使用以下简单命令:

ssh -J <user>@<hostB> <user>@<hostC>


-J选项用于跳转。

#4 楼

听起来您想要在A上使用shell别名,从而导致ssh在C上发生


我假设在A上,您可以键入ssh me @ b“ ssh me @ c hostname”并获取返回“ C”
创建别名sshc,它将sshc foo扩展为ssh me @ b“ ssh me @ c foo”
有关创建别名的确切语法,请查阅superuser.com


评论


如果要使用交互式外壳,则可能必须在外部ssh的选项中添加-t,因为ssh在得到命令后会假定-T。

–短暂
2010-2-11在4:12

#5 楼

如果您的雇主提供了VPN,我建议您改用它。

这样,您无需专门配置任何应用程序(甚至是ssh),并且可以看到防火墙后面的任何计算机。此外,您的所有流量都将由VPN软件加密,这将为无意或故意未加密的流量增加安全性。

评论


有时是VPN,这就是我们需要这些技巧的原因...

–路易
2012年12月6日下午4:18

#6 楼

YASS另一个简单的解决方案

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost



第一个命令打开到HostB的ssh连接,并告诉HostB将连接从localhost:2222转发到HostC:22。 br /> -f参数告诉SSH一旦建立连接即进入后台
第二个命令只需打开与localhost的客户端连接即可:2222

不需要选项HostKeyAlias,但可以帮助防止连接到错误的主机
注意:在第二个ssh命令使用转发的端口之前,需要使用命令sleep 10来维持连接。然后,当第二条SSH离开转发端口时,第一条SSH将关闭。

您现在可以运行后续的ssh会话:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost


变体:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost


可以通过运行以下ssh会话来打开:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost


使用-M和-S的主要优点参数是从HostA到HostC仅打开一个连接,后续会话将不会再次进行身份验证并运行得更快。

#7 楼

特殊情况下,混合nix平台:

hostA(linux)-> HostB(solaris)-> HostC(linux)

如果在hostC上需要X应用程序,则中间跳在Solaris盒上...在这种情况下,我在ProxyCommand上找到了所需的netcat(nc),如下所示:

hostA:〜$ vi .ssh / config:

Host hostC
    ProxyCommand ssh hostB nc %h %p       # where nc is netcat


然后自动隧道工作:

hostA:〜$ ssh hostC

#8 楼

另外,由于OpenSSH 7.3引入了ProxyJump伪指令:

Host final
  ProxyJump intermediate


例如:跳过中间机器。