นี่คือการนำ mmproxy ไปใช้ Go อีกครั้ง ซึ่งสร้างขึ้นเพื่อปรับปรุงเสถียรภาพรันไทม์ของ mmproxy ในขณะเดียวกันก็ให้ประสิทธิภาพที่ดีขึ้นในแง่ของการเชื่อมต่อและปริมาณงานของแพ็กเก็ต
go-mmproxy
เป็นแอปพลิเคชันแบบสแตนด์อโลนที่แกะโปรโตคอล PROXY ของ HAProxy (รวมถึงโครงการอื่น ๆ เช่น NGINX) เพื่อให้การเชื่อมต่อเครือข่ายไปยังเซิร์ฟเวอร์ปลายทางมาจากไคลเอ็นต์ - แทนที่จะเป็นของพร็อกซีเซิร์ฟเวอร์ - ที่อยู่ IP และหมายเลขพอร์ต เนื่องจากมีกลไกพื้นฐานร่วมกัน โพสต์บล็อกของ Cloudflare บน mmproxy จึงทำหน้าที่เป็นบทความที่ดีเยี่ยมเกี่ยวกับวิธีการทำงานของ go-mmproxy
ภายใต้ประทุน
go install github.com/path-network/go-mmproxy@latest
คุณจะต้องใช้อย่างน้อย go 1.21
เพื่อสร้างไบนารี go-mmproxy
ดูการเริ่มต้นใช้งานของ Go หากผู้จัดการแพ็คเกจของคุณไม่มี golang เวอร์ชันใหม่เพียงพอ
จะต้องรัน 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
หากกำหนดตัวเลือก --mark
ให้กับ go-mmproxy
แพ็กเก็ตทั้งหมดที่ถูกกำหนดเส้นทางไปยังอินเทอร์เฟซแบบย้อนกลับจะมีการตั้งค่าเครื่องหมายไว้ ซึ่งสามารถใช้เพื่อตั้งค่ากฎการกำหนดเส้นทางขั้นสูงเพิ่มเติมด้วย iptables ได้ เช่น เมื่อคุณต้องการกำหนดเส้นทางการรับส่งข้อมูลจากลูปแบ็คออกไปนอกเครื่อง
เนื่องจาก UDP ไม่มีการเชื่อมต่อ หากซ็อกเก็ตเชื่อมโยงกับ 0.0.0.0
เคอร์เนลสแต็กจะค้นหาอินเทอร์เฟซเพื่อส่งการตอบกลับไปยังที่อยู่ต้นทางที่ถูกปลอมแปลง - แทนที่จะใช้เพียงอินเทอร์เฟซที่ได้รับแพ็กเก็ตดั้งเดิม อินเทอร์เฟซที่พบมักจะ ไม่ใช่ อินเทอร์เฟซแบบย้อนกลับ ซึ่งจะหลีกเลี่ยงกฎที่ระบุไว้ข้างต้น วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือการผูก Listener ของเซิร์ฟเวอร์ปลายทางเข้ากับ 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
การวัดประสิทธิภาพดำเนินการบน Dell XPS 9570 พร้อมด้วย Intel Core i9-8950HK CPU @ 2.90GHz (12 ลอจิคัลคอร์) บริการอัปสตรีมที่พร็อกซีส่งการรับส่งข้อมูลถูกจำลองโดยเซิร์ฟเวอร์ 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 | ↑ เมกะบิตต่อวินาที | ↓ แพ็ก/วินาที | ↑ 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 |
ไป-mmproxy | 45483.233 | 16142.348 | 29340.885 | 1477889.6 | 2518271.5 |
ไม่มีพรอกซี | 52640.116 | 22561.129 | 30078.987 | 2065805.4 | 2581621.3 |