1 个不稳定版本
0.4.0 | 2022年2月28日 |
---|---|
0.3.1 |
|
0.3.0 |
|
0.2.0 |
|
0.1.0 |
|
#102 in #udp
38KB
332 行
udppp
支持代理协议和mmproxy的高性能UDP代理。
特性
- 异步
- 支持代理协议V2
- SOCKET在L7代理(mmproxy)中保留客户端IP地址
- 单个可执行文件
构建 & 运行
$>cargo build--发布
安装
$>cargo install udppp
用法
Usage: udppp -m MODE [-b BIND_ADDR] -l LOCAL_PORT -h REMOTE_ADDR -r REMOTE_PORT -p
Options:
-m, --mode MODE 1 : reverse proxy mode , 2 : mmproxy mode
-l, --local-port LOCAL_PORT
The local port to which udppp should bind to
-r, --remote-port REMOTE_PORT
The remote port to which UDP packets should be
forwarded
-h, --host REMOTE_ADDR
The remote address to which packets will be forwarded
-b, --bind BIND_ADDR
The address on which to listen for incoming requests
-p, --proxyprotocol
enable proxy-protocol
-s, --slient disable print log
mmproxy
这个想法来自一篇创新论文,感谢作者。
mmproxy - 创新的Linux路由,以在L7代理中保留客户端IP地址
然而,cloudflare尚未官方实现支持udp的mmproxy。这个项目弥补了这个不足。
运行代理(代理服务器)
假设udp反向代理服务的端口是8000,上游服务器是192.168.0.2:8001
./udppp -m 1 -b 0.0.0.0 -l 8000 -h 192.168.0.2 -r 8001 -p
路由设置(上游服务器)
将所有来自环回的流量路由回环回
ip rule add from 127.0.0.1/8 iif lo table 123
ip route add local 0.0.0.0/0 dev lo table 123
通常,来自应用程序的响应数据包会被路由到互联网——通过默认网关。我们通过完全滥用AnyIP技巧并将0.0.0.0/0分配给“本地”来实现这一点——这意味着整个互联网都将被视为属于我们的机器。
运行mmproxy(上游服务器)
假设应用程序服务器的端口是127.0.0.1:8001
./udppp -m 2 -b 0.0.0.0 -l 8001 -h 127.0.0.1 -r 8002 -p
基准测试
负载测试工具:https://github.com/b23r0/udppp/tree/main/test/udpbench
发送一个4字节的udp数据包,并获取相同返回数据包一次,循环1000次。在nginx的实际测试中,当单个测试超过1000次时,客户端将不会收到返回数据包。
测试环境
环境 | 值 |
---|---|
操作系统 | Ubuntu20.04 |
处理器 | Intel Xeon(Cascade Lake) Platinum 8269 |
处理器核心 | 4 |
内存 | 8G |
网络 | LAN (0.2 Gbps) |
测试次数 | 1k |
测试结果
项目 | 语言 | 基础 | 耗时 |
---|---|---|---|
udppp | Rust | Tokio | 56 ms |
nginx | C | 多线程 | 54 毫秒 |
go-proxy | Go语言 | goroutine | 65 毫秒 |
Take Time
取了10次的平均值。
(测试日期:2022年2月28日)
依赖项
~6–13MB
~142K SLoC