مراقبة عملية tor ثم بدء تشغيل VPN هي الطريقة الأكثر شيوعًا لبناء هذه المنظومة بشكل خاطئ. فالخادم الخفي يظهر قبل وقت طويل من قدرته على نقل تدفق العميل، والنوم لمدة ثابتة تخمين مُلبَّس بثوب الاعتمادية. يجب أن تكون البوابة هي الحالة التي يحتاجها المكوّن التالي فعليًا. اتبع الخطوات الأربع أدناه بالترتيب، وتعامل مع كل واحدة منها كشرط منفصل لا كتأخير يمكن ضبطه.

الخطوة 1: اختر النقل الذي تملكه فعليًا

ابدأ بالبروتوكول، لأن بقية التصميم تعتمد عليه. واجهة SOCKS في Tor لا تنفّذ UDP ASSOCIATE، لذا فإن أي شيء يُنقل عبرها يجب أن يكون تدفق TCP. ملف تعريف OpenVPN الذي يستخدم UDP لن يعمل عبر هذا المسار مهما كانت طريقة كتابة المشرف. حوّل ملف التعريف إلى TCP وتأكد من أن الطرف البعيد يقبله قبل أن تمس منطق بدء التشغيل.

ثم تأكد من أن عميلك يستطيع الوصول إلى وكيل SOCKS أصلًا. توثّق OpenVPN 2.6 خيار socks-proxy لملفات تعريف TCP، وتتيح العملاء المختلفة دعمًا مختلفًا للوكيل. المشغّل الذي يتجاهل خيار الوكيل بصمت سيتصل مباشرة وسيبدو وكأنه يعمل، وهذا أسوأ من الفشل.

اكتب النقل المختار في دليل التشغيل، لأن كل فحص لاحق يعتمد عليه.

الخطوة 2: اقرأ مرحلة bootstrap، لا قائمة العمليات

يجيب بروتوكول التحكم في Tor على GETINFO status/bootstrap-phase بأحدث حالة bootstrap، بما يشمل نسبة تقدّم ووسمًا موجزًا. تلك الإجابة مفيدة تحديدًا لأن وحدة التحكم قد تتصل بعد أن يكون الخادم الخفي قد أنهى bootstrap بالفعل. المشرف الذي يستمع للأحداث فقط سيفوّت الحالة التي كان فيها Tor جاهزًا قبل بدء المشرف.

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

اقرأ المرحلة مرة واحدة عند بدء التشغيل، ثم اشترك في أحداث التقدّم للعرض الحي.

printf 'AUTHENTICATE\r\nGETINFO status/bootstrap-phase\r\nQUIT\r\n' | nc 127.0.0.1 9051
ss -ltn | grep -E '9050|9051'
tor --verify-config -f /etc/tor/torrc

استجابة بتقدّم 100 ووسم done تعني أن الخادم الخفي أنهى بدء تشغيله الخاص. وهي لا تعني بعد وجود دائرة صالحة للاستخدام نحو وجهتك.

الخطوة 3: انتظر حدث دائرة العميل

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

تعامل مع الحدث كإذن بالمحاولة، لا كضمان بشأن وجهة معينة. فسياسة الخروج قد ترفض الطرف البعيد، ومصافحة VPN نفسها قد تفشل لأسباب لا علاقة لها بـ Tor.

أبقِ الشرطين منفصلين في الشيفرة. قيمة منطقية واحدة باسم ready ستدمجهما وتجعل الحادثة التالية غير مقروءة.

الخطوة 4: بوّب VPN على مصافحته الخاصة

لدى VPN شرط جاهزية خاص به، وهو الوحيد الذي يثبت أن النفق قد قام. انتظر حتى يُبلغ العميل عن حالة متصلة بعنوان مُخصَّص، ثم تحقق من أن شرط الوكيل ظل ساريًا. حلقة إعادة المحاولة التي تُسقط خيار socks-proxy بعد فشل واحد ستتصل مباشرة وتبطل التصميم كله بهدوء.

قرّر ما يحدث عندما يكون الطرف البعيد غير قابل للوصول قبل أن تحتاج إلى معرفة ذلك. إعادة محاولة محدودة بفشل ظاهر أسهل في التشغيل من حلقة لا نهائية، وهي تعطي نظام المراقبة ما ينبّه عليه. القرار نفسه ينطبق على النقل: إذا أُعيد تشغيل Tor، فيجب تفكيك VPN وإعادة بوّابته لا تركه يعمل على دائرة ميتة.

أخيرًا، أبقِ سياسة التطبيق نفسها مفعّلة أثناء توقف VPN. المشرف الذي ينتظر بشكل صحيح لا يفعل شيئًا لمنع عملية غير ذات صلة من إرسال حركة المرور مباشرة.

افحص التحولات الأربعة التي يجب أن تصمد أمامها

أربع حالات تغطي التصميم: بدء بارد يأتي فيه Tor أولاً، ومشرف يتصل بـ Tor جاهز مسبقًا، وطرف بعيد لـ VPN غير متاح، وفقدان النقل أثناء قيام النفق. لكل حالة انتقال متوقع مختلف، وكل حالة تُنتج سطر سجل مختلفًا إذا كُتبت البوابة بشكل صحيح.

شغّلها عمدًا، واحدة في كل مرة، واقرأ تغيّرات الحالة لا قائمة العمليات.

journalctl -u tor@default -n 30 --no-pager
systemctl status [email protected]
curl -sS --socks5-hostname 127.0.0.1:9050 https://check.torproject.org/api/ip

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

مقالات ذات صلة