我正在尝试一个需要在两个方向上路由流量的多跳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上的脚本解析结果。
答案 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