#proxy #udp #networking #mmproxy #proxyprotocol

app udppp

支持代理协议和mmproxy的高性能UDP代理

1 个不稳定版本

0.4.0 2022年2月28日
0.3.1 2022年2月21日
0.3.0 2022年2月20日
0.2.0 2022年2月18日
0.1.0 2022年2月18日

#102 in #udp

MIT 许可证

38KB
332

udppp 构建状态 ChatOnDiscord Crate

支持代理协议和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。这个项目弥补了这个不足。

image

运行代理(代理服务器)

假设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