我有3台计算机。 B并从B-> C,但不是从A->C。
是否有一种方法可以设置从A到B的SSH隧道,所以当我运行其他SSH命令时,它们就可以从我的本地机器A?我基本上是在尝试从工作场所到家庭克隆git存储库(并且我无法在计算机B上安装git)。
此外,一旦设置好。如何取消设置它?
#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
例如:跳过中间机器。
评论
我相信某个地方有一个重复的问题,但是今天我的搜索能力很弱。那将是我的:superuser.com/questions/96489/ssh-tunnel-via-multiple-hops
SSH隧道可能通过多个跃点重复
如果您在计算机A上运行Linux,请使用名为sshuttle的工具,该工具可让您通过A-> B隧道(假定C从B可见)有选择地转发C的所有流量。