websocket - 如何在没有 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) |
| <---------------------------------------------- |
| . |
| : |
解决方案
您正在寻找的是NAT traversal。但通常客户端必须做一些事情来帮助建立这种连接。
从技术部分:
可以使用以下 NAT 穿越技术:
- Socket Secure (SOCKS) 是一种创建于 1990 年代初期的技术,它使用代理服务器在网络或系统之间中继流量。
- Traversal Using Relays around NAT (TURN) 是专为 NAT 遍历而设计的中继协议。
- NAT 打孔是一种通用技术,它利用 NAT 如何处理某些协议(例如,UDP、TCP 或 ICMP)来允许先前被阻止的数据包通过 NAT。
- UDP打孔
- TCP打孔
- ICMP 打孔
- 用于 NAT 的会话遍历实用程序(STUN) 是用于 NAT 打孔的一组标准化方法和网络协议。它是为 UDP 设计的,但也扩展到 TCP。
- 交互式连接建立(ICE) 是一个完整的协议,用于使用 STUN 和/或 TURN 进行 NAT 遍历,同时选择可用的最佳网络路由。它填补了 STUN 规范未提及的一些缺失部分和不足。
- 家庭或小型办公室环境中的许多小型 NAT 网关都支持UPnP 互联网网关设备协议(IGDP)。它允许网络上的设备请求路由器打开一个端口。
- NAT-PMP是 Apple 推出的替代 IGDP 的协议。
- PCP是 NAT-PMP 的继承者。
- 应用程序级网关(ALG) 是防火墙或 NAT 的一个组件,允许配置 NAT 遍历过滤器。许多人声称,这种技术产生的问题多于解决的问题。
在这些技术中,我最常看到 STUN 服务器的使用,尤其是在网络/在线技术中。例如,请参阅在 WebRTC中使用 STUN 服务器(和其他技术)进行点对点连接。
ngrok是另一种常用于通过 Internet 建立隧道连接以穿越 NAT 的工具。通常用于开发目的。可能不适合,具体取决于您拥有的流量的性质/数量。