3个不稳定版本
0.2.2 | 2023年1月12日 |
---|---|
0.1.1 | 2022年12月29日 |
0.1.0 | 2022年12月29日 |
#7 in #enabled
30KB
636 行
mmproxy-rs
MMProxy的Rust实现!🚀
原因
许多以前的实现仅支持TCP或UDP的PROXY协议,而此版本同时支持TCP和UDP。
选择mmproxy-rs的另一个原因可能是如果您想避免垃圾回收暂停的干扰,这正是最初触发从令人惊叹的go-mmproxy重写的。
特性
- TCP - 接受来自Nginx、HAProxy启用了PROXY协议的请求
- UDP - 接受来自udppp、Cloudflare Spectrum启用了PROXY协议的请求
- 无垃圾回收暂停
要求
如果您尚未安装,请使用rustup安装Rust。
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ cargo --version
安装
从git
cargo install --git https://github.com/saiko-tech/mmproxy-rs
cargo install mmproxy
用法
Usage: mmproxy [-h] [options]
Options:
-h, --help Prints the help string.
-4, --ipv4 <addr> Address to which IPv4 traffic will be forwarded to.
(default: "127.0.0.1:443")
-6, --ipv6 <addr> Address to which IPv6 traffic will be forwarded to.
(default: "[::1]:443")
-a, --allowed-subnets <path>
Path to a file that contains allowed subnets of the
proxy servers.
-c, --close-after <n> Number of seconds after which UDP socket will be
cleaned up. (default: 60)
-l, --listen-addr <string>
Address the proxy listens on. (default:
"0.0.0.0:8443")
--listeners <n> Number of listener sockets that will be opened for the
listen address. (Linux 3.9+) (default: 1)
-p, --protocol <p> Protocol that will be proxied: tcp, udp. (default:
tcp)
-m, --mark <n> The mark that will be set on outbound packets.
(default: 0)
示例
您需要root权限或在mmproxy二进制文件上设置CAP_NET_ADMIN
能力,使用setcap(8)。
address=X.X.X.X # get this via "ip addr" command - don't use 0.0.0.0!
bind_port=8080
upstream_port=8081
sudo ip rule add from 127.0.0.1/8 iif lo table 123
sudo ip route add local 0.0.0.0/0 dev lo table 123
sudo mmproxy -m 123 -l $address:$bind_port -4 127.0.0.1:$upstream_port -p udp
基准测试
测试在一个Linux 6.0.12-arch1-1
箱子上进行,使用AMD Ryzen 5 5600H @ 3.3GHz(12个逻辑核心)。
TCP模式
设置
bpf-echo服务器模拟了代理发送流量的上游服务。流量是通过tcpkali生成的。
以下命令用于生成负载
tcpkali -c 50 -T 10s -e1 'PROXY TCP4 127.0.0.1 127.0.0.1 \{connection.uid} 25578\r\n' -m 'PING\r\n' 127.0.0.1:1122
指定了50个并发连接,运行时间为10秒,为每个连接发送一个PROXYv1头部,并使用TCP传输消息 PING\r\n
。
结果
↓ Mbps | ↑ Mbps | ↓ 数据包/秒 | ↑ 数据包/秒 | |
---|---|---|---|---|
无代理 | 34662.036 | 53945.378 | 3173626.3 | 4630027.6 |
go-mmproxy | 27527.743 | 44128.818 | 2520408.4 | 3787491.3 |
mmproxy-rs | 27228.169 | 50173.384 | 2492924.1 | 4306284.7 |
UDP模式
设置
iperf client -> udppp -> mmproxy-rs/go-mmproxy -> iperf server
$ udppp -m 1 -l 25578 -r 25577 -h "127.0.0.1" -b "127.0.0.1" -p // udppp
# mmproxy -l "127.0.0.1:25577" -4 "127.0.0.1:1122" -p udp -c 1 // mmproxy-rs
# mmproxy -l "127.0.0.1:25577" -4 "127.0.0.1:1122" -p udp -close-after 1 // go-mmproxy
$ iperf -sup 1122 // iperf server
$ iperf -c 127.0.0.1 -p 25578 -Rub 10G // iperf client
结果
传输 | 带宽 | |
---|---|---|
无代理 | 6.31 GBytes | 5.42 Gbits/秒 |
go-mmproxy | 3.13 GBytes | 2.69 Gbits/秒 |
mmproxy-rs | 3.70 GBytes | 3.18 Gbits/秒 |
iperf测试以反向模式运行,服务器向客户端发送数据。结果表明,与go-mmproxy相比,mmproxy-rs的上行到下行吞吐量更高。
致谢和参考文献
依赖项
~7–19MB
~215K SLoC