إصدار وكيل MTProto غير الرسمي في Python ، ميزات البروتوكول

الصورة

نشر مطورو Telegram مؤخرًا شفرة مصدر خادم وكيل يعمل على بروتوكول MTProto. تم نشر المقالات حول ميزات تجميعها وإعادة تغليف حاوية عامل الميناء معها على المحور . يفاجأ الخادم الوكيل الرسمي ، المكتوب بالحرف C ، بمقدار الرمز - حوالي 23 ألف سطر. في الوقت نفسه ، وأحيانًا قبل ذلك بقليل ، ظهرت عدة عمليات تنفيذ بديلة ، ولكن لم يدعم أي منها إمكانية الإعلان عن قناتهم.

في هذه المقالة ، أود أولاً أن أتحدث عن الميزات غير المعروفة للبروتوكول لتوصيل خادم وكيل بخوادم خارجية ، وثانيًا ، أن أتحدث عن تطويره الخاص - تطبيق خادم وكيل في Python ، والذي وصل للتو إلى الإصدار وهو متاح للجميع تحت رخصة MIT مجانية.

ميزات تفاعل الخادم الوكيل مع الخوادم الخارجية


  1. لا يتفاعل الخادم الوكيل الرسمي مع خوادم البرقية مباشرة ، ولكنه يستخدم طبقة وكيل واحدة أخرى على الأقل لهذا الغرض. سوف نطلق عليهم الوكيل الوسيط ، وقائمتهم متاحة على core.telegram.org/getProxyConfig و core.telegram.org/getProxyConfigV6 . اتصال IPv6 غير مدعوم من قبل الخادم الوكيل الرسمي.
  2. لتشفير البيانات بين الخادم الوكيل والخادم الوسيط الأوسط ، يتم استخدام مفتاح يتم الحصول عليه من عناوين IP لكلتا العُقدة. لذلك ، يجب أن يعرف خادم الوكيل للاتصال بالوسيط الأوسط عنوان IP الخارجي ، وإلا ستكون مفاتيح التشفير على أحد الجانبين والأخرى مختلفة. بالإضافة إلى ذلك ، تشارك أرقام المنافذ لكل من العقد والسر المشترك ، المتوفرة على core.telegram.org/getProxySecret ، في تكوين المفتاح. يوصي مطورو Telegram بتحديث هذا السر مرة واحدة في اليوم.
  3. عند توصيل خادم وكيل بخادم وكيل متوسط ​​، ينقل أولهم وقته. إذا اختلف الوقت بأكثر من بضع دقائق ، يغلق الجانب الثاني الاتصال.
  4. عند إرسال رسالة من العميل إلى الوكيل الأوسط ، يتم تغليف الرسالة في استدعاء RPC لبروتوكول MTProto. في كل استدعاء RPC من هذا القبيل ، يضيف الوكيل العديد من الوسيطات: ip ومنفذ كلا العقدتين ، ومعرف اتصال عشوائي ، بالإضافة إلى علامة الخادم الوكيل المستخدمة لعرض قناة الإعلان في التطبيق. تشغل هذه الوسائط الإضافية حوالي 96 بايت. بسبب هذه الميزة ، لن يكون من الممكن عرض القنوات الإعلانية عند العمل مباشرة ، وليس من خلال الوكيل المتوسط.
  5. "تعتقد" خوادم Telegram أن المعلومات حول عميل IP المستلمة من الخادم الوكيل. يمكن رؤية هذه العناوين في معلومات الجلسة (يتم رسم المستطيل):
    الصورة

  6. يرسل اتصال TCP واحد بين الخادم الوكيل والوكيل الأوسط رسائل من مستخدمين مختلفين. في الطلبات والردود هناك حجة "معرف اتصال عشوائي" ، وهو أمر ضروري حتى تصل البيانات إلى العميل المناسب.
  7. لا يمكن للخادم الوكيل فك تشفير بيانات العميل ، ولكن يمكنه تمييز الرسائل العادية من الملفات المرسلة. كما أنه يعرف حجم كل رسالة.

فوف ، آمل ألا أتعب من التفاصيل الفنية. الآن يجب أن يكون واضحًا لماذا لا يوجد دعم إعلاني في العديد من البروكسيات البديلة - يرسلون الرسائل مباشرة إلى خوادم البرقية ، متجاوزين الوكيل الوسيط. اتضح أسهل بكثير. يصف الجزء الثاني من المقالة أول تطبيق غير رسمي لخادم وكيل يعمل من خلال الوكيل المتوسط. في الوقت الحالي ، في المجال العام ، يمكنك العثور على ثلاثة تطبيقات من هذا القبيل: رسمي ، على Erlang وهذا.

تنفيذ وكيل Python


في البداية ، تمت كتابة خادم وكيل لفهم ميزات البروتوكول وكان تطوير مشروع آخر - وكيل جوارب غير متزامن ، مكتوب بدوره ، "لمس" غير متزامن / ينتظر في Python.

بدأ المشروع تدريجياً في جذب المستخدمين الذين غمرهم الأسئلة وتقارير الأخطاء وطلبات الميزات. بعد التحسينات ، دخل المشروع مرحلة اختبار بيتا واستقرارها ، والتي استمرت حوالي أسبوع وشمل خمسة خوادم من تكوينات مختلفة.

قبل أن أتحدث عن الميزات التي لا يمتلكها الخادم الوكيل الرسمي بعد ، ولكن الوكيل البديل لديه (والصمت حول الوظائف التي لا يمتلكها الوكيل الرسمي ، البديل) ، سأتحدث عن الشيء الذي يفكر فيه كثير من الناس لأول مرة عندما يذكرون كلمة Python .

الأداء


لاختبار الأداء ، تم استخدام آلة افتراضية في سحابة من الحد الأدنى من التكوين: 1 وحدة المعالجة المركزية ، 1024 ميغابايت من ذاكرة الوصول العشوائي.

في الاختبارات الاصطناعية ، كان الخادم الوكيل قادرًا على إرسال حوالي 240 ميغابت / ثانية أو 3000 رسالة / ثانية. عند استخدام تطبيق بديل لحلقة الحدث في C ، والتي تسمى uvloop ، وأيضًا عند استخدام مترجم PyPy ، تختلف بيانات الأداء (جميع القياسات في الثانية):
الصورة

عند الاختبار على المستخدمين الحقيقيين ، اتضح أن مثل هذا الخادم كان كافيًا لخدمة 4000 مستخدم أو 8000 عند استخدام PyPy بشكل مريح. وكانت المفاجأة الكبيرة أنه بغض النظر عن كيفية الإعلان عن خادم الاختبار في القنوات الناطقة باللغة الروسية ، لا يزال 89٪ من المستخدمين من إيران (ربما في البلدان الأخرى سيختلف عدد المستخدمين الذين يتم تقديمهم في وقت واحد). يبدو هذا:

الصورة

سألت العديد من المسؤولين عن خوادم أخرى - موقفهم هو نفسه. ربما يرجع ذلك إلى حقيقة أن برقية في روسيا تعمل بشكل جيد بدون خوادم بروكسي. في إيران ، تم حظر خوادم الاختبار للجمهور بعد عدة ساعات من إنشائها.

الصورة

تحميل الخادم مع 2000 مستخدم. إن لحظة حجب الخادم للمواطنين الإيرانيين واضحة للعيان.

لذلك ، لا يعتبر أداء وحدة المعالجة المركزية اختناق على عقدة الاختبار. مع وجود 10000 عميل ، من المرجح أن تنفد الذاكرة.

لم يتم تنفيذ الاستخدام المتزامن للعديد من نوى وحدة المعالجة المركزية (hello، GIL).

الميزات التي لا يمتلكها الخادم الوكيل الرسمي بعد


العمل على بروتوكول IPv6.
يمكن أن يستخدم خادم وكيل بدون تكوين إضافي IPv6 للاتصالات الصادرة. لا يتم حظر اتصالات IPv6 في روسيا (في الوقت الحالي).

وضع التشغيل دون الوكيل الأوسط
إذا لم تكن هناك حاجة إلى إعلانات القناة ، فسيقوم الوكيل تلقائيًا بالاتصال مباشرة بخوادم البرقية ، متجاوزًا الوكيل الأوسط. إنه أسرع وأكثر موثوقية.

أيضًا ، يتم تنفيذ " الوضع السريع " الاختياري ، عندما يتم تشفير الرسائل من خادم Telegram إلى الوكيل ومن الوكيل إلى العميل بنفس المفتاح. وبالتالي ، لا يحتاج الوكيل إلى إعادة تشفير الرسائل - فهو يرسلها كما هي. هذا لا ينبغي أن يؤثر على السلامة. في أي حال ، لا يملك مسؤول الوكيل حق الوصول إلى رسائل المستخدم.

التحديث التلقائي لقائمة الوكيل الأوسط والسرية مرة واحدة يوميًا.
يوصي خادم الوكيل الرسمي لتحديث قائمة الوكيل الأوسط بإعادة تشغيل حاوية عامل الميناء مرة واحدة في اليوم ، والتي تعيد تعيين جميع الاتصالات. قد لا يتم إنشاء اتصالات جديدة إذا تم حظر الخادم ، على سبيل المثال ، في البلد. يقوم إصدار Python بزيارة الموقع بشكل دوري وتحديث القائمة.

متعدد المنصات
يتم دعم أي منصات تشغيل Python. اتضح لتشغيله حتى على iPad ، ومع ذلك ، تم حظر الاتصالات الخارجية الواردة من قبل الجهاز. يتم دعم Windows بشكل منفصل ، وكان من المفاجئ بالنسبة لي عدد الأشخاص الذين أطلقوا الوكلاء تحت نظام التشغيل هذا. على الرغم من أنه في نظام التشغيل Windows ، يمكنك تشغيل العميل الرسمي إذا كنت تستخدم تقنيات المحاكاة الافتراضية أو عامل الميناء.

القدرة على الجري بسهولة بدون عامل ميناء.
إذا (فجأة) هناك من لا يحب عامل الميناء ، يمكن إطلاق وكيل بدونه. تحتاج إلى تحديد معلمتين على الأقل في ملف التكوين: المنفذ والسرية ، يمكنك أيضًا تعيين علامة الإعلان الاختيارية ، ثم تشغيل الأمر: python3 mtprotoproxy.py. ومع ذلك ، في هذه الحالة ، سيكون عليك التفكير في التشغيل التلقائي في نظام التشغيل ، على سبيل المثال ، كتابة ملف الوحدة لـ systemd. ستحتاج أيضًا إلى تثبيت pycrypto أو pycryptodome ، لأنه لن يعمل ، ولكن ببطء شديد.

في حالة عامل الميناء ، يمكن إعادة بناء الحاوية باستخدام الأمر - إنشاء عامل إرساء - بناء.

الميزات المجدولة للإصدار التالي


تحديد سرعة تنزيل الملفات الكبيرة.
عند تنزيل الملفات الكبيرة ، يمكنك ، على مستوى TCP ، "سؤال" الوكيل الوسيط أو خادم Telegram لإرسال البيانات بشكل أبطأ. الآن يتم ذلك عن طريق تعيين قيمة صغيرة لمخزن الاستلام المؤقت ، والتي توفر أيضًا ذاكرة الخادم.

تدفق الرسائل.
الآن ، جميع خوادم الوكيل المعروفة التي تعمل مع الوكيل الأوسط تقرأ أولاً الرسالة من العميل ثم ترسلها فقط. يمكن أن يصل حجم الرسالة الواحدة إلى 1 ميغابايت. مطلوب ذاكرة لتخزينها وزيادة تأخير الإرسال بشكل طفيف. يمكنك نقل دفق البيانات. سيؤدي هذا إلى تعقيد التعليمات البرمجية ، ولكنه سيقلل من استهلاك الذاكرة في أسوأ الحالات.

قم بتغيير طول الحزم لتجاوز المرشح على طول الحزمة .
لم أتمكن من الدخول في الإصدار.

التثبيت والبدء


  1. git clone -b مستقرة github.com/alexbers/mtprotoproxy.git ؛ مؤتمر نزع السلاح mtprotoproxy
  2. (اختياري ، موصى به) حدد PORT و USERS و AD_TAG في config.py
  3. إنشاء عامل إرساء --build -d (أو python3 mtprotoproxy.py ، بدون عامل إرساء)
  4. (اختياري ، يعرض رابطًا للنموذج tg: //) سجلات إنشاء عامل الميناء

الصورة

تطبيقات أخرى لـ MTProto proxy مع دعم إعلانات القناة:


شكر وتقدير
seriyps - للمساعدة في الاختبار على المستخدمين الحقيقيين
shifttstas - للحصول على نصائح عامل الميناء
forst (github) - لفكرة وتنفيذ العمل على IPv6
p1ratrulezzz (جيثب) - للحصول على نصائح ومقال حول المشروع
freekzy (github) - للحصول على رقعة مع تسرب مقبض

UPD: مستودع يجمع تطبيقات مختلفة لوكيل MTProto: github.com/mtProtoProxy

Source: https://habr.com/ru/post/ar414139/


All Articles