如何使用 netfilter 将 UDP 转换为 TCP?

如何使用 netfilter 将 UDP 转换为 TCP?

我有一个出色的 ISP 阻止所有 UDP 流量(除了到其自己的 DNS 服务器的 DNS)。

但是,我想将 UDP 用于我的 VPN 解决方案。我对两个 VPN 端点都有 root 权限,并且它们都使用 Linux。

我的想法是简单地覆盖传出 UDP 数据包中的数据包类型字段,使其看起来像 TCP,并在服务器端执行相反的操作。

因此,我出色的 ISP 的路由器/防火墙将看到错误的 TCP 数据包,而我的 VPN 进程将能够通过 UDP 进行通信。

我强烈怀疑 ISP 的防火墙不够智能,无法检测到某些问题。

当然,这将是一个肮脏的伎俩,但并不比简单地禁止第二个最常用的 IP 协议并将其作为普通互联网连接出售更肮脏。

据我所知,有一些 iptables 规则可以做到这一点,但是哪一个呢?

答案1

这很可能行不通。防火墙肯定会跟踪正确 TCP 连接所需的 TCP 设置数据包(SYN、SYN-ACK、ACK),而如果您只是使用修改后的 UDP 数据包,这些数据包就会丢失。

您可以做的是:编写一个小型应用程序,该应用程序在一侧获取 UDP,通过 TCP 连接到另一侧,另一个应用程序接受传入的 TCP 连接并将 TCP 流量转发到 UDP。

答案2

我怀疑iptables仅此一项就足够了,因为 TCP 和 UDP 是根本不同的协议。

在这种情况下(ISP 阻止)您可能会忘记设置 IPsec VPN全部UDP 端口)。

通过 ICMP 对所有流量进行隧道传输。 (我所知道的最好的老式解决方案。许多组织仍然没有过滤掉任何类型的 ICMP)请参阅https://github.com/DhavalKapil/icmptunnel

“icmptunnel”的工作原理是将您的 IP 流量封装在 ICMP 回显数据包中,并将它们发送到您自己的代理服务器。代理服务器解封装数据包并转发 IP 流量。发往客户端的传入 IP 数据包再次封装在 ICMP 回复数据包中并发回客户端。 IP 流量在 ICMP 数据包的“数据”字段中发送。

RFC 792 是 IETF 管理 ICMP 数据包的规则,允许任何类型 0(回显回复)或 8(回显消息)ICMP 数据包具有任意数据长度。

所以基本上客户端机器只使用ICMP协议与代理服务器进行通信。在客户端计算机上运行的应用程序不会注意到这一事实,并且可以无缝运行。

另外,正如 AB 指出的,您有一个 UDP 到原始隧道软件,位于https://github.com/wangyu-/udp2raw-tunnel

或者,设置 OpenVPN 解决方案。如果您设法与外部通话,请通过端口 53/UDP 运行 OpenVPN,或者如果缺少该端口,请通过 TCP 运行它。请注意,通过 TCP 建立 VPN 会比 UDP 慢,但它确实有效。

至于更改 IP 字段的实际问题:您想查看 iptables 中的 mangle 表,但是:

  1. 我怀疑你的 ISP 也阻止了它
  2. 我知道 mangle 支持修改一些 IP 字段,但不确定你需要的是哪一个。看https://serverfault.com/questions/467756/what-is-the-mangle-table-in-iptables

更多替代方案,您可以尝试 GRE 隧道(协议 47),请参阅https://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.tunnel.gre.html(这比尝试开发应用程序更容易)。一些组织阻止了这一点。基本上它是通过协议 47 封装 IP/ICMP/UDP。

或者,如果其他方法都不起作用,您可以通过 SSH 上的 IP 隧道进行隧道传输(请注意,您是通过 SSH 进行隧道传输,而不是 TCP 端口隧道传输)。请参阅使用 Tun 通过 ssh 建立 Ip 隧道http://www.marcfargas.com/posts/ip-tunnel-over-ssh-with-tun/顺便说一句,没有任何智能/自适应/深度检查流量整形器/防火墙技术能够检测并阻止该线程上的所有方法,也无法阻止通过 SSH 的 TUN。

附言。很难相信 ISP 会阻止 UDP,而且还会阻止 NTP 和 DNS UDP 端口。

相关内容