首页 > 解决方案 > 如何在没有 NAT 的情况下连接路由器或防火墙后面的客户端 tcp 端口

问题描述

客户端可以通过代理连接服务器,但我还需要将客户端 TCP/UDP 端口从服务器连接到客户端:
[vm ---> 代理 ---> 路由器或防火墙 ---> 客户端:3000]

我不想通过 NAT 规则打开客户端到 Internet 的端口。我正在寻找一种方法来做到这一点。可能吗?

编辑:我想我必须添加更多关于我的目标的信息。

网络图

我在 Linux 客户端(图表)上有一个应用程序,它有 2 个工作:
1- 在客户端和 VM 之间创建 websocket 以进行通信
2- USB/IP:我使用 Usb/ip 协议重定向本地 USB 设备。这就是为什么我需要这个解决方案。

让我告诉你 USB/IP 是如何工作的:

架构
USB/IP 协议遵循服务器/客户端架构。服务器导出 USB 设备,客户端导入它们。导出的 USB 设备的设备驱动程序在客户端计算机上运行。

首先,客户端打开一个到服务器的 TCP/IP 连接并发送一个 OP_REQ_IMPORT 数据包。(I) 服务器回复 OP_REP_IMPORT。如果导入成功,TCP/IP 连接将保持打开状态,并将用于在客户端和服务器之间传输 URB 流量。客户端可以发送两种类型的数据包:USBIP_CMD_SUBMIT 提交 URB,USBIP_CMD_UNLINK 取消链接先前提交的 URB。服务器的答案可能分别是 USBIP_RET_SUBMIT 和 USBIP_RET_UNLINK。

virtual host controller                                 usb host
     "client"                                           "server"
 (imports USB devices)                             (exports USB devices)
         |                                                 |
         |                  OP_REQ_IMPORT                  |
         | ----------------------------------------------> |
         |                                                 |
         |                  OP_REP_IMPORT                  |
         | <---------------------------------------------- |
         |                                                 |
         |                                                 |
         |            USBIP_CMD_SUBMIT(seqnum = n)         |
         | ----------------------------------------------> |
         |                                                 |
         |            USBIP_RET_SUBMIT(seqnum = n)         |
         | <---------------------------------------------- |
         |                        .                        |
         |                        :                        |
         |                                                 |
         |            USBIP_CMD_SUBMIT(seqnum = m)         |
         | ----------------------------------------------> |
         |                                                 |
         |            USBIP_CMD_SUBMIT(seqnum = m+1)       |
         | ----------------------------------------------> |
         |                                                 |
         |            USBIP_CMD_SUBMIT(seqnum = m+2)       |
         | ----------------------------------------------> |
         |                                                 |
         |            USBIP_RET_SUBMIT(seqnum = m)         |
         | <---------------------------------------------- |
         |                                                 |
         |            USBIP_CMD_SUBMIT(seqnum = m+3)       |
         | ----------------------------------------------> |
         |                                                 |
         |            USBIP_RET_SUBMIT(seqnum = m+1)       |
         | <---------------------------------------------- |
         |                                                 |
         |            USBIP_CMD_SUBMIT(seqnum = m+4)       |
         | ----------------------------------------------> |
         |                                                 |
         |            USBIP_RET_SUBMIT(seqnum = m+2)       |
         | <---------------------------------------------- |
         |                        .                        |
         |                        :                        |

标签: websockettcpproxyudp

解决方案


您正在寻找的是NAT traversal。但通常客户端必须做一些事情来帮助建立这种连接。

技术部分:

可以使用以下 NAT 穿越技术:

在这些技术中,我最常看到 STUN 服务器的使用,尤其是在网络/在线技术中。例如,请参阅在 WebRTC中使用 STUN 服务器(和其他技术)进行点对点连接。

ngrok是另一种常用于通过 Internet 建立隧道连接以穿越 NAT 的工具。通常用于开发目的。可能不适合,具体取决于您拥有的流量的性质/数量。


推荐阅读