让仅支持 UDP 的 VPN 通过 TCP 工作

让仅支持 UDP 的 VPN 通过 TCP 工作

对于我的一个项目,我正在寻找一种通过 TCP(最好在端口 443 或 80 上)运行仅支持 UDP 的 VPN 的可能性。我在进行一些研究时发现了以下情况:

  • 使用 socat 可以实现这一点,但是,这并不可靠,因为 UDP 连接可以继续推送流量,而 TCP 缓冲区将过载。
  • 我怀疑使用安全套接字漏斗 (SSF)[1] 可能会实现这一点,但我不确定这是否 100% 可靠,以及它是否通过 TCP 推送流量,或者他们是否找到了某种通过 UDP 使用 TLS 的方法(对我来说似乎是这样的)。

至于为什么我希望仅支持 UDP 的 VPN 能够通过 TCP 工作:各种企业防火墙或全国性防火墙都会阻止(随机)UDP 端口上的 UDP 流量。当然,存在大多数开放的指定 UDP 端口(例如 53 DNS),但从这些端口上的常规流量中识别 VPN 确实很容易。我知道流量模仿,但这意味着 VPN 的开销太大了。该项目使用的协议是 WireGuard,而不是内置 TCP 回退的 OpenVPN。

据我所知,目前还没有好的(可靠的)技术将 UDP 流量包装在 TCP 中。这是真的吗?如果是,还有其他技术可以实现我的目标吗?

[1]https://securesocketfunneling.github.io/ssf/#home

答案1

我无法直接回答您,但您可以在以下来源中找到很好的信息。

西庇太(自 2005 年起开源)

Zebedee 是一款简单的程序,用于在两个系统之间建立加密、压缩的“隧道”,以进行 TCP/IP 或 UDP 数据传输。这样可以保护 telnet、ftp 和 X 等流量免遭监听,并且可以通过压缩在低带宽网络上获得性能提升。

可能还有一些信息找到这里

UDP隧道

它可作为 Linux 软件包使用(Debian 链接)。

它的来源 在 GitHub 上,其中描述为:

该项目通过 UDP 隧道传输 TCP 数据。可执行文件可以充当服务器或客户端。服务器充当客户端的代理,监听指定的 UDP 端口并创建与客户端指定的 TCP 服务器的连接。客户端监听 TCP 端口,充当某些 TCP 客户端连接的服务器。客户端接收该端口上的任何 TCP 数据并将数据发送到 udpserver,udpserver 将其发送到它与所需 TCP 服务器建立的 TCP 连接。

需要注意的是,通过基于 TCP 的 VPN 隧道的 UDP 数据包仅保证其整个旅程的 TCP 部分能够交付。在基于 TCP 的 VPN 隧道之外的整个路径部分中,可能会发生数据包丢失。

答案2

也许有点晚了,但是udp2raw-隧道是一款用于通过 TCP 隧道传输 UDP 的出色软件。它可能socat无法正常工作,因为(可能)在 TCP 隧道中连接 UDP 数据包后,它无法在接收端正确拆分这些数据包。毕竟 TCP 是一种流。

用作udp2raw-tunnelUDP-over-TCP 隧道不需要 root 权限。在客户端计算机上,运行:

udp2raw -c -l 0.0.0.0:3333 -r $server_ip:80

并让您的 VPN 客户端连接到本地主机上的 UDP 端口 3333。

在服务器机器上监听端口 80/443 可能需要 root 权限:

sudo udp2raw -s -l 0.0.0.0:80 -r 127.0.0.1:$vpn_server_udp_port

VPN客户端/服务器机器不一定与udp2raw客户端/服务器是同一台机器,只要设置正确的IP就可以了。

编辑:哎呀,我刚发现它是“假”TCP,这意味着它使用原始 IP 数据报,但让外界认为它是 TCP 连接。因此,如果您尝试通过 SSH 隧道传输其“TCP”连接,您将不会成功。但无论如何,它在您的场景中效果很好。

相关内容