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

التوجيه وDNAT وSOCKS تغيّر أشياء مختلفة

مسار بالسياسة يعيد كتابة قرار عند الطبقة 3. سطران يكفيان لإرسال حركة عميل واحد إلى قفزة تالية مختارة:

ip route add default via 10.50.0.2 table 101
ip rule add from 10.77.0.2 lookup 101

بعد ذلك، يسلّم النواة الحزمة إلى 10.50.0.2 مع بقاء الوجهة الأصلية في ترويسة IP. إذا كان 10.50.0.2 موجّهًا، فإنه يمرّرها. وإذا كان مضيفًا يشغّل خادم SOCKS على 1080، فالحزمة غير موجّهة إلى أي شيء يستطيع قبولها، ولا يفيد DNAT إلى المنفذ 1080 أيضًا، لأن الحزمة المحوّلة لا تزال تحمل حمولة التطبيق الأصلية بدل تحية SOCKS.

SOCKS5 يبدأ ببايت إصدار، وقائمة طرق، وتبادل مصادقة، وطلب يسمّي الوجهة. تلك بيانات تطبيق. لا سجل توجيه ولا هدف netfilter يولّدها، وهذا هو المقارنة في سطر واحد: التوجيه يختار مسارًا، وSOCKS يطلب من خادم إنشاء اتصال ثانٍ.

الحالة الأولى: التطبيق يستطيع التحدث بـSOCKS بنفسه

حين يملك البرنامج إعداد وسيط، فهذا أقصر مسار ولا يحتاج إلى تغيير في النواة. وجّهه إلى المستمع، وقدّم بيانات الاعتماد إذا طلبها الخادم، وحدّد ما إذا كانت الأسماء تُحلّ محليًا أو تُمرّر إلى الوسيط. مع curl تكون هذه أعلامًا مختلفة، والفرق يهم عندما تُحلّ الوجهة من جهة الوسيط فقط:

curl --socks5 10.50.0.2:1080 https://docs.example.com
curl --socks5-hostname 10.50.0.2:1080 https://internal.example.com

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

الحالة الثانية: محوّل يحوّل تدفقات IP إلى جلسات وسيط

للبرامج التي لا تستطيع التحدث بـSOCKS، يجب أن يحدث التحويل في شيء ينهي حركة IP ويفتح جلسات وسيط نيابةً عنها. ذلك المكوّن يملك واجهة نفق، ويقبل التدفقات التي اختارها التوجيه بالسياسة، وينفّذ مصافحة SOCKS لكل واحد منها، ويعيد بناء الردود. المسار يوجّه الحركة إليه؛ والمحوّل هو ما ينشئ الجلسة.

اقرأ توثيقه قبل أن تأتمنه على شبكة فرعية كاملة. كثير من المحوّلات تحمل TCP جيدًا وتتعامل مع UDP فقط عبر ارتباط UDP في SOCKS5، ولا يحوّل أي منها ICMP إلى حركة وسيط، لذا لا يقول ping ناجح شيئًا عن مسار الوسيط. DNS هو الفخ الآخر: إذا حلّ المحوّل الأسماء محليًا، فإن السجلات الداخلية فقط تُحلّ إلى إجابة خاطئة، أو إلى لا شيء على الإطلاق.

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

الحالة الثالثة: المضيف في الحقيقة بوابة موجَّهة

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

الحالات الثلاث تنفصل سريعًا. تحقّق مما يستمع فعلاً، ثم انظر إلى أول البايتات التي تصل إلى المضيف:

ss -ltnp 'sport = :1080'
tcpdump -ni eth0 -X 'tcp port 1080'

أول بايت حمولة لدى عميل SOCKS حقيقي هو 0x05، الإصدار في التحية. إذا أظهر الالتقاط بيانات تطبيق أصلية بدل ذلك، فلن يجيب أي خادم SOCKS، لأن التفاوض لم يبدأ. وإذا لم يستمع شيء على 1080، فالمضيف بوابة، والسؤال يصبح هل يمرّر، وهل يوجد مسار عودة.

اختر الطبقة بأربعة أسئلة

هل يملك البرنامج إعداد وسيط؟ استخدمه وتوقّف عند ذلك. هل تشمل الحركة UDP أو ICMP يجب أن يبقى؟ بوابة موجَّهة أو بوابة NAT وحدها تحمل ICMP، ويحتاج UDP إلى ارتباط SOCKS5 يدعمه الطرفان. هل يجب تغطية كل عملية على الجهاز، بما فيها ما لا تستطيع إعداده؟ إذن تحتاج إلى محوّل يملك الواجهة وينهي التدفقات. وهل تستطيع أن تملك أيضًا استثناءات التوجيه وDNS ومنع الحلقات الخاصة به؟ إن لم تستطع، فالبوابة العادية ستكلّف أقل في التشغيل.

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

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