這是 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 |