هذا هو إعادة تنفيذ Go لـ mmproxy، والذي تم إنشاؤه لتحسين استقرار وقت تشغيل 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's إذا كان مدير الحزم الخاص بك لا يحمل إصدارًا جديدًا كافيًا من 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
، فسوف تبحث حزمة kernel عن واجهة لإرسال رد إلى عنوان المصدر المخادع - بدلاً من مجرد استخدام الواجهة التي استقبلت الحزمة الأصلية منها. من المرجح ألا تكون الواجهة التي تم العثور عليها هي واجهة الاسترجاع، مما سيتجنب القواعد المحددة أعلاه. إن أبسط طريقة لإصلاح ذلك هي ربط مستمعي الخادم النهائي بـ 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
تم تشغيل الاختبار على الطراز XPS 9570 من Dell المزود بوحدة المعالجة المركزية Intel Core i9-8950HK بسرعة 2.90 جيجا هرتز (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
⇅ ميغابت في الثانية | ↓ ميغابت في الثانية | ↑ ميغابت في الثانية | ↓ حزمة / ثانية | ↑ بكت / ثانية | |
---|---|---|---|---|---|
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 |