这是 mmproxy 的 Go 重新实现,旨在提高 mmproxy 的运行时稳定性,同时在连接和数据包吞吐量方面提供潜在的更高性能。
go-mmproxy
是一个独立的应用程序,它解开 HAProxy 的 PROXY 协议(也被 NGINX 等其他项目采用),以便与终端服务器的网络连接来自客户端(而不是代理服务器)的 IP 地址和端口号。由于它们共享基本机制,Cloudflare 关于 mmproxy 的博文可以作为有关go-mmproxy
幕后工作原理的精彩文章。
go install github.com/path-network/go-mmproxy@latest
您至少需要go 1.21
来构建go-mmproxy
二进制文件。如果您的包管理器没有携带足够新的 golang 版本,请参阅 Go 的入门指南。
必须运行go-mmproxy
:
CAP_NET_ADMIN
功能,能够设置IP_TRANSPARENT
套接字选项。 将源自环回的所有流量路由回环回:
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
ip -6 rule add from ::1/128 iif lo table 123
ip -6 route add local ::/0 dev lo table 123
如果为go-mmproxy
提供--mark
选项,则路由到环回接口的所有数据包都将设置标记。这可用于使用 iptables 设置更高级的路由规则,例如当您需要将来自环回的流量路由到计算机外部时。
因为 UDP 是无连接的,所以如果套接字绑定到0.0.0.0
内核堆栈将搜索接口,以便向欺骗的源地址发送答复 - 而不是仅使用从中接收原始数据包的接口。找到的接口很可能不是环回接口,这将避免上面指定的规则。解决此问题的最简单方法是将终端服务器的侦听器绑定到127.0.0.1
(或::1
)。通常也建议这样做,以避免接收非代理连接。
Usage of ./go-mmproxy:
-4 string
Address to which IPv4 traffic will be forwarded to (default "127.0.0.1:443")
-6 string
Address to which IPv6 traffic will be forwarded to (default "[::1]:443")
-allowed-subnets string
Path to a file that contains allowed subnets of the proxy servers
-close-after int
Number of seconds after which UDP socket will be cleaned up (default 60)
-l string
Address the proxy listens on (default "0.0.0.0:8443")
-listeners int
Number of listener sockets that will be opened for the listen address (Linux 3.9+) (default 1)
-mark int
The mark that will be set on outbound packets
-p string
Protocol that will be proxied: tcp, udp (default "tcp")
-v int
0 - no logging of individual connections
1 - log errors occurring in individual connections
2 - log all state changes of individual connections
调用示例:
sudo ./go-mmproxy -l 0.0.0.0:25577 -4 127.0.0.1:25578 -6 [::1]:25578 --allowed-subnets ./path-prefixes.txt
该基准测试在配备 Intel Core i9-8950HK CPU @ 2.90GHz(12 个逻辑核心)的 Dell XPS 9570 上运行。代理发送流量的上游服务被 bpf-echo 服务器模拟。流量由 tcpkali v1.1.1 生成。
以下命令用于所有情况下的负载生成(50 个连接,10 秒运行时间,为每个连接发送 PROXYv1 标头,使用PINGrn
作为 TCP 消息):
tcpkali -c 50 -T 10s -e1 'PROXY TCP4 127.0.0.1 127.0.0.1 {connection.uid} 25578rn' -m 'PINGrn' 127.0.0.1:1122
⇅ Mbps | ↓ Mbps | ↑ Mbps | ↓ 包/秒 | ↑ 包/秒 | |
---|---|---|---|---|---|
Cloudflare/mmproxy | 1524.454 | 756.385 | 768.069 | 70365.9 | 65921.9 |
go-mmproxy GOMAXPROCS=1 | 7418.312 | 2858.794 | 4559.518 | 262062.7 | 391334.6 |
go-mmproxy | 45483.233 | 16142.348 | 29340.885 | 1477889.6 | 2518271.5 |
没有代理 | 52640.116 | 22561.129 | 30078.987 | 2065805.4 | 2581621.3 |