ssh remoteforward over multiple hops

时间:2014-08-29 17:45:17

标签: ssh tunnel netcat

我正在尝试一个需要在两个方向上路由流量的多跳SSH隧道。我的网络配置是:

我的个人外壳在机器上 machineA可以SSH到机器B
machineB可以SSH到机器C
machineC通过以太网本地连接到机器D

在machineD上运行一项服务,其中machineC将UDP数据包发送到machineD的portX,而machineD通过UDP将其回复发送到machineC的portY。

我已成功完成以下任务:
(来自机器A)
ssh machineB
(从结果壳)
ssh machineC
(从结果壳)
回声"我的命令" | nc -u machineD portX #Send命令到machineD的服务
nc -ul portY#在machineC&#39的端口上读取结果

我想通过隧道完成所有这些操作,这样我就可以直接在机器A上运行自定义脚本来制定服务命令并解析结果。我在.ssh配置文件中尝试了以下内容:

    host machineB
        hostname x.x.x.x
        user username_machineB
        localforward 1234 machineC:22

    host machineC
        hostname localhost
        user username_machineC
        port 1234
        localforward 1235 machineD:portX
        remoteforward 1236 localhost:portY

我想我可以做以下事情:
(来自机器A)
ssh machineB
(再次来自machineA)
ssh machineC
(再次来自machineA)
回声"我的命令" | nc -u localhost 1235
nc -ul 1236

但是......它似乎没有用。我在1236上看不到任何预期的回复。我不确定如何调试这个。我也不完全确定那些" localforward"的格式。和"远程前进" machineC的配置中的行。我不知道谁将被解释为" localhost"在评估这些线时。我怀疑在machineC上可能会禁用远程转发,但我想确保首先正确配置其他所有内容。我做错了吗?

或者,是否有其他方法可以实现我的最终目标,而无需更改machineB,C或D上的任何配置?我想要做的是使用machineA以编程方式构造用于machineD的复杂命令,并使用machineA上的脚本解析结果。

1 个答案:

答案 0 :(得分:0)

当你这样做时,你必须倒退。

所以基本上马赫可以和马克思的portX交谈。

所以你真的想在machA上运行它:

  ssh machC

这是您的最终目标,因为该机器从machD发送和接收

现在你无法直接进入machC,这是你的ProxyCommand条目的来源。

host machC
    ProxyCommand ssh machB nc %h %p

所以你说machA可以ssh到machB没问题。现在,如果你这样做:

  

ssh -v machC

你会看到它跳过那些东西。 但实际上你需要一个从machC到machD端口的端口转发和监听器,所以你可以改变machC设置:

host machC
     ProxyCommand ssh machB nc %h %p
     # first part is port on your current shell, second part is relative to machC
     LocalForward 1234 machD:portX
     RemoteForward 1235 localhost:portY

所以使用上面的例子:

host machineB
    hostname x.x.x.x
    user username_machineB

host machineC
    ProxyCommand ssh machineB nc %h %p
    hostname localhost
    user username_machineC
    localforward 1235 machineD:portX
    remoteforward 1236 localhost:portY

然后你可以使用命令:

  

ssh machineC

使用-v查看跳数和隧道,如果不关心获取shell,则使用-N。 现在您可以与localhost的端口1235通信以发送到machineD portX并从1236读取以侦听machineC portY