公司动态
udp-over-tcp 实战教程:3 步让 UDP「借道」TCP,专治 UDP 被防火墙拦截
udp-over-tcp 实战教程3 步让 UDP「借道」TCP专治 UDP 被防火墙拦截【免费下载链接】udp-over-tcpProxy UDP traffic over a TCP stream项目地址: https://gitcode.com/gh_mirrors/ud/udp-over-tcp公司防火墙只放行 TCP你的 UDP 端口被拦得一个不剩。遇到 UDP 被防火墙拦截怎么解决一个思路是用 udp-over-tcp 把数据报包进 TCP 流里走隧道它由 tcp2udp 和 udp2tcp 两个组件组成跟着往下做几分钟就能通。一条命令先把 tcp2udp 跑起来别急着读原理先把命令跑起来。在服务器上执行RUST_LOGdebug tcp2udp \ --tcp-listen 10.0.0.0:5001 \ --udp-forward 127.0.0.1:51820 它监听 TCP 的 5001 端口收到什么数据都往 127.0.0.1:51820 以 UDP 形式发出去。这里的 IP 和端口照 README 的示例写的实际换成你自己的内网服务地址即可。它怎么知道每个包在哪里结束TCP 是连续字节流没有包的边界UDP 消息却一个个独立。隧道要做的就是在两者之间互相拆装。做法很朴素每个数据报前面固定加 2 字节包头是一个 16 位无符号整数按大端字节序高位字节在前记录这段数据的长度。打个比方像快递箱上贴的件数标签——收的人先读标签就知道取多少个字节正好是一整箱不会把两箱混在一起。反向也同理所以 udp 转 tcp、tcp 转 udp 共用这一套格式。服务端与客户端怎么配 服务器端一条命令就能收工配置全在参数里--tcp-listen对外监听的 TCP 地址端口就是客户端要连的目标--udp-forward收到数据后转发的内网 UDP 服务地址tcp2udp 会持续接受新连接每个连接都新建一个本地 UDP socket 与之配对所以一台服务器可以同时服务很多客户端。客户端在本地机器上运行注意方向反过来是 udp2tcpudp2tcp --udp-listen 127.0.0.1:5000 --tcp-forward 10.0.0.1:5001它绑定本地 5000 端口收 UDP把数据通过 TCP 送到服务器。此后你的程序把发送目标改成 127.0.0.1:5000 就行其他代码不用动。作为库接入 Rust 项目不想单独跑进程的话把 udp2tcp 当 crate 引入更灵活。核心就这几行let udp_listen_addr 127.0.0.1:0.parse()?; let tcp_forward_addr 1.2.3.4:9000.parse()?; let udp2tcp udp_over_tcp::Udp2Tcp::new( udp_listen_addr, tcp_forward_addr, udp_over_tcp::TcpOptions::default(), ) .await?; let local_udp_addr udp2tcp.local_udp_addr()?; udp2tcp.run().await?;UDP 地址填端口 0 表示让系统随机分配真实绑定地址用local_udp_addr()读出来再交给你的 UDP 业务模块。动手前先看这三条边界一个 Udp2Tcp 实例只服务单一源地址。UDP socket 会绑定到第一个收到的数据报的对端地址多个来源就要起多个实例。日志级别由 RUST_LOG 控制编译时开启 env_logger feature 才会生效不想把用户 IP 写进日志可加 REDACT_LOGS1。不适合的场景对吞吐和延迟极度敏感的传输或 TCP 也被拦的网络。隧道给每个包加了 2 字节头还多一层 TCP 往返它是救急通道不是性能优化手段。今天就可以试 一句话总结给每个包加 2 字节长度头UDP 就能藏在 TCP 里走出去用 TCP 隧道转发 UDP 的套路就此打通。如果你的 UDP 服务也被防火墙拦着不妨今天就按上面的两条命令搭一条隧道试试。【免费下载链接】udp-over-tcpProxy UDP traffic over a TCP stream项目地址: https://gitcode.com/gh_mirrors/ud/udp-over-tcp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考