Dies ist eine Go-Neuimplementierung von mmproxy, die entwickelt wurde, um die Laufzeitstabilität von mmproxy zu verbessern und gleichzeitig möglicherweise eine höhere Leistung in Bezug auf Verbindung und Paketdurchsatz zu bieten.
go-mmproxy
ist eine eigenständige Anwendung, die das PROXY-Protokoll von HAProxy (auch von anderen Projekten wie NGINX übernommen) entpackt, sodass die Netzwerkverbindung zum Endserver über die IP-Adresse und Portnummer des Clients und nicht über die des Proxyservers erfolgt. Da sie grundlegende Mechanismen gemeinsam haben, dient der Blogpost von Cloudflare zu mmproxy als großartiger Bericht darüber, wie go-mmproxy
unter der Haube funktioniert.
go install github.com/path-network/go-mmproxy@latest
Sie benötigen mindestens go 1.21
um die go-mmproxy
Binärdatei zu erstellen. Lesen Sie Go's Erste Schritte, wenn Ihr Paketmanager nicht über eine ausreichend neue Version von Golang verfügt.
go-mmproxy
muss ausgeführt werden:
CAP_NET_ADMIN
-Fähigkeit, um IP_TRANSPARENT
Socket-Option festlegen zu können. Leiten Sie den gesamten vom Loopback ausgehenden Datenverkehr zurück zum Loopback:
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
Wenn go-mmproxy
die Option --mark
zugewiesen wird, wird für alle an die Loopback-Schnittstelle weitergeleiteten Pakete die Markierung gesetzt. Dies kann zum Einrichten erweiterter Routing-Regeln mit iptables verwendet werden, beispielsweise wenn der Datenverkehr vom Loopback außerhalb des Computers weitergeleitet werden soll.
Da UDP verbindungslos ist, sucht der Kernel-Stack nach einer Schnittstelle, um eine Antwort an die gefälschte Quelladresse zu senden, wenn ein Socket an 0.0.0.0
gebunden ist – anstatt nur die Schnittstelle zu verwenden, von der er das ursprüngliche Paket empfangen hat. Die gefundene Schnittstelle wird höchstwahrscheinlich nicht die Loopback-Schnittstelle sein, wodurch die oben angegebenen Regeln umgangen werden. Der einfachste Weg, dies zu beheben, besteht darin, die Listener des Endservers an 127.0.0.1
(oder ::1
) zu binden. Dies wird grundsätzlich auch empfohlen, um den Empfang von Nicht-Proxy-Verbindungen zu vermeiden.
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
Beispielaufruf:
sudo ./go-mmproxy -l 0.0.0.0:25577 -4 127.0.0.1:25578 -6 [::1]:25578 --allowed-subnets ./path-prefixes.txt
Der Benchmark wurde auf einem Dell XPS 9570 mit Intel Core i9-8950HK CPU bei 2,90 GHz (12 logische Kerne) durchgeführt. Der Upstream-Dienst, an den der Proxy Datenverkehr sendete, wurde vom BPF-Echo-Server verspottet. Der Datenverkehr wurde von tcpkali v1.1.1 generiert.
Zur Lastgenerierung wurde in allen Fällen folgender Befehl verwendet (50 Verbindungen, 10s Laufzeit, PROXYv1-Header für jede Verbindung senden, PINGrn
als TCP-Nachricht verwenden):
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
⇅ Mbit/s | ↓ Mbit/s | ↑ Mbit/s | ↓ Pck./s | ↑ pkt/s | |
---|---|---|---|---|---|
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 |
kein Proxy | 52640.116 | 22561.129 | 30078.987 | 2065805.4 | 2581621.3 |