检查SSH反向隧道终结点是否转发到已经在侦听的端口

问题描述 投票:0回答:1

我已经在host1上启动反向SSH隧道:

host1@host1:~ $ while true; do echo "$(date) - Tunnel created" && ssh host2@host2 -NT -R3389:localhost:3389; done

我可以使用以下命令检查是否打开了从host2反向隧道的端口:

host2@host2:~$ nc -zv host1 3389
nc: connect to host1 port 3389 (tcp) failed: Connection refused

但是如果我发出以下命令,则它(可能)检查本地主机上端口的状态。实际上是打开的:

host2@host2:~$ nc -zv localhost 3389
Connection to localhost 3389 port [tcp/*] succeeded!

但是我想检查SSH隧道其他站点上端口的状态。因此,上一条命令应返回该端口已关闭,直到发出以下命令为止:

host1@host1:~/.ssh $ while true; do nc -lp 3389; done

由于TCP的性质,这是否有可能?

ssh tcp netcat ssh-tunnel
1个回答
0
投票

不能使用TCP代理方法来模拟缺少服务的情况(“连接被拒绝”)在代理条目(主机2)处,因为:

  1. 它(代理服务)无法确定目标(主机1)上的服务是否为停止或不停止,直到尝试连接。
  2. 代理在比这种模拟要求更高的层上工作

您的客户端已经建立了到代理的连接,因此代理终止连接的唯一可能方法是进行连接重置(而实际目标的行为是“连接被拒绝”或“超时”)。

因此使用TCP代理方法无法模拟服务缺失。

现实世界中的代理行为(您所拥有的)] >>

Client        Proxy                       target
 ----HND-F1-SYN-->|                           |
 <---HND-F2-------|                           |
 ----HND-F3------>|                           |
                  |---second hop connectopn-->|

理想代理的行为(您想要的)

] >>
Client        Proxy                       target
 ----HND-F1-SYN-->|                           |
                  |---second hop connectopn-->|
 <---HND-F2-------|                           |
 ----HND-F3------>|                           |

嗯,当然您可以通过使用防火墙对传入的SYN帧进行特殊处理的同时保留两个侦听套接字(原始+通用),当然是[[您可以制定解决方案来模拟缺少目标服务的解决方案

  • iptables将SYN帧重新路由到原始套接字侦听器服务
  • 原始套接字侦听器svc建立与目标服务的第二跳连接
  • [[连接失败]原始侦听器以精心制作的RST帧响应模拟的CONNREFUSED-即不提供服务。
  • [连接成功时]原始侦听器重新注入要传递给代理服务侦听器的SYN帧,并将已经建立的第二跳连接与客户端连接相关联(仍处于握手阶段)
  • 如您所见,实现这种解决方案可能很容易,但是它并不流行,因为它需要使用混杂的套接字,并且需要CPU额外的负载。好吧,这就是为什么不可能的原因。

    这是您想要的方式:

  • 您可以构建虚拟网桥(使用openvswitch)
  • 并使用iptables路由所有帧的目标主机。
  • 通过这种方式,host1和host2之间的连接将是安全的,并且您的客户端将在TCP级别上看到绝对相同的握手,因此,它将确定服务是否正在运行(成功连接)(否)(connrefused或超时)。

© www.soinside.com 2019 - 2024. All rights reserved.