Ini adalah implementasi ulang mmproxy di Go, dibuat untuk meningkatkan stabilitas waktu proses mmproxy sekaligus memberikan potensi kinerja yang lebih besar dalam hal koneksi dan throughput paket.
go-mmproxy
adalah aplikasi mandiri yang membuka protokol PROXY HAProxy (juga diadopsi oleh proyek lain seperti NGINX) sehingga koneksi jaringan ke server akhir berasal dari alamat IP dan nomor port klien - bukan server proxy -. Karena keduanya memiliki mekanisme dasar yang sama, postingan blog Cloudflare di mmproxy berfungsi sebagai artikel bagus tentang cara kerja go-mmproxy
.
go install github.com/path-network/go-mmproxy@latest
Anda memerlukan setidaknya go 1.21
untuk membuat biner go-mmproxy
. Lihat Memulai Go jika manajer paket Anda tidak memiliki versi golang yang cukup baru.
go-mmproxy
harus dijalankan:
CAP_NET_ADMIN
untuk dapat mengatur pilihan soket IP_TRANSPARENT
. Rutekan semua lalu lintas yang berasal dari loopback kembali ke 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
Jika opsi --mark
diberikan ke go-mmproxy
, semua paket yang dirutekan ke antarmuka loopback akan memiliki tanda yang ditetapkan. Ini dapat digunakan untuk menyiapkan aturan perutean lebih lanjut dengan iptables, misalnya ketika Anda memerlukan lalu lintas dari loopback untuk dirutekan ke luar mesin.
Karena UDP tidak memiliki koneksi, jika soket terikat ke 0.0.0.0
, tumpukan kernel akan mencari antarmuka untuk mengirim balasan ke alamat sumber palsu - alih-alih hanya menggunakan antarmuka tempat paket asli diterima. Antarmuka yang ditemukan kemungkinan besar bukan antarmuka loopback, yang akan menghindari aturan yang ditentukan di atas. Cara termudah untuk memperbaikinya adalah dengan mengikat pendengar server akhir ke 127.0.0.1
(atau ::1
). Hal ini juga umumnya disarankan untuk menghindari penerimaan koneksi non-proxy.
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
Contoh pemanggilan:
sudo ./go-mmproxy -l 0.0.0.0:25577 -4 127.0.0.1:25578 -6 [::1]:25578 --allowed-subnets ./path-prefixes.txt
Benchmark dijalankan pada Dell XPS 9570 dengan CPU Intel Core i9-8950HK @ 2.90GHz (12 inti logis). Layanan upstream yang menjadi tujuan pengiriman lalu lintas proxy ditiru oleh server bpf-echo. Lalu lintas dihasilkan oleh tcpkali v1.1.1 .
Perintah berikut digunakan untuk pembuatan beban dalam semua kasus (50 koneksi, runtime 10 detik, kirim header PROXYv1 untuk setiap koneksi, gunakan PINGrn
sebagai pesan 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 | ↓ pkt/dtk | ^ pkt/dtk | |
---|---|---|---|---|---|
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 |
tidak ada proksi | 52640.116 | 22561.129 | 30078.987 | 2065805.4 | 2581621.3 |