【问题标题】:check if SSH reverse tunnel endpoint is forwarding to port that is already listening检查 SSH 反向隧道端点是否正在转发到已经在监听的端口
【发布时间】:2023-03-15 03:06:01
【问题描述】:

我已经在 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

但是如果我发出以下命令,那么它(可能)会检查 localhost 上端口的状态。实际上是打开的:

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】:

    不能在代理入口(host2)点使用 TCP 代理方法来模拟服务缺失(“连接被拒绝”),因为:

    1. it(proxy service) 无法知道 target(host1) 上的服务是否为 在尝试连接之前停止或不停止。
    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 帧进行特殊处理来制定解决方案来模拟目标服务的缺失,即: p>

    • iptables 将 SYN 帧重新路由到原始套接字侦听器服务
    • 原始套接字侦听器 svc 建立到目标服务的第二跳连接
    • [在连接失败时] 原始侦听器使用精心制作的 RST 帧响应模拟 CONNREFUSED - 即没有服务。
    • [连接成功] 原始侦听器重新注入 SYN 帧以传递给代理服务侦听器,并将已建立的第二跳连接与客户端连接关联(仍处于握手阶段)

    如您所见,实现这样的解决方案可能很容易,但它不会流行,因为它需要使用混杂的套接字并且需要额外的 CPU 负载。 嗯,这就是为什么不可能的解释。

    您可以按照自己的方式进行操作:

    • 您可以构建虚拟网桥(使用 openvswitch)
    • 并使用 iptables 路由所有帧目标主机。

    这样,host1 和 host2 之间的连接将是安全的,并且您的客户端将在 TCP 级别看到完全相同的握手,因此它可以确定服务是否正在运行(成功连接)或未运行(connrefused 或 timedout)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多