التطبيق الذي يتحدث SOCKS فقط ليس لديه ما يتصل به على شبكة VPN عادية، لأن النفق يحمل الحزم بينما يريد التطبيق نقطة وكيل. يستطيع OpenSSH توفير تلك النقطة عندما يسمح مالك الوصول بذلك، لأن التوجيه الديناميكي يحول جلسة SSH واحدة إلى وكيل محلي. ثم هناك قفزتان يجب إبقاؤهما واضحتين: النفق الذي يصل إلى مضيف SSH، والاتصال الذي يفتحه ذلك المضيف بعد ذلك. والفصل بينهما يفسر سبب نجاح هذا الترتيب وأيضا ما لن يفعله أبدا.

ما الذي يصير إليه مستمع SSH وما لا يصير إليه

التوجيه الديناميكي يجعل عميل SSH يستمع محليا ويتحدث SOCKS4 أو SOCKS5 إلى أي شيء يتصل. كل طلب يسمي وجهة، ويفتح خادم SSH الاتصال التالي، ولهذا يمكن أن يجري بحث الوجهة في الطرف البعيد. هذا توجيه TCP على مستوى التطبيق، وليس شبكة VPN للجهاز كله. لا يحمل أي ربط UDP، ولا ICMP، ولا شيئا للتطبيقات التي تتجاهل إعدادات الوكيل تماما. كما أن القفزة من خادم SSH إلى التطبيق ليست داخل نفقك، وهذا مهم عندما لا تقبل الوجهة حركة إلا من شبكات معروفة.

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

ابدأه على الاسترجاع المحلي بمنفذ صريح

اختر منفذا محليا غير مستخدم واربطه صراحة بالاسترجاع المحلي بدلا من ترك العنوان غائبا. الخيارات الثلاثة أدناه موجودة لسبب واحد لكل منها.

ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
  [email protected]

-N يتخطى الأمر البعيد، بينما -T يتخطى الطرفية الزائفة، لذا توجد الجلسة للتوجيه فقط. ExitOnForwardFailure يجعل العميل يخرج عندما يتعذر إنشاء المستمع، بدلا من العمل دون التوجيه الذي طلبته. ControlPath=none يبقي الجلسة خارج اتصال مضاعف قائم قد يضيف توجيهاته الخاصة. الاسترجاع المحلي يبقي المستمع خارج الشبكة المحلية، لكنه ليس حدا للتصريح على جهاز مشترك، لأن عمليات محلية أخرى تستطيع الوصول إليه أيضا. ويوثق مرجع عميل OpenSSH كل هذه الخيارات، والتحذير الخاص بالاسترجاع المحلي ينتج من طبيعة مقبس الاستماع.

أرسل الأسماء عبر الوكيل لا حوله

يستطيع عميل SOCKS5 أن يحل الوجهة بنفسه أو أن يطلب من الوكيل ذلك، وهذا الاختيار يحدد أي محلل يجيب. مع socks5h يرسل curl اسم المضيف عبر الوكيل، فيحدث البحث على خادم SSH. ومع socks5 العادي يحل الحاسوب المحمول أولا ويسافر الاتصال وحده، وهذا يبطل الغرض بهدوء عندما يكون الاسم داخليا. والطلب أدناه يمسح أيضا قائمة الاستثناء من الوكيل، فلا تستطيع قيمة NO_PROXY الموروثة أن توجهه حول الوكيل.

curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health

تظل مصادقة الشهادة وتسجيل الدخول الخاص بالتطبيق ساريين، لأن الوكيل لا يستبدل أي منهما. ويبقى بحثان: على الحاسوب المحمول أن يصل إلى مضيف SSH عبر مسار VPN وDNS المسموح به، وعلى خادم SSH أن يحل اسم التطبيق بنفسه. والثاني قابل للاختبار وحده قبل أن تمر أي حركة عبر الوكيل.

ssh [email protected] getent hosts app.corp.example

أثبت وجهة واحدة مسموحا بها ثم أغلق الجلسة

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

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

ss -ltn | grep 1080

الأعطال التي لا يستطيع هذا الترتيب إصلاحها

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

What you seeWhat it usually meansWhere to look
The app connects and nothing followsIt ignores proxy settings entirelyIts own network settings, not the SSH session
A name resolution error for the destinationThe SSH server cannot resolve itServer resolver and search domains
A UDP-only application failsDynamic forwarding carries TCP onlyThis arrangement cannot serve it
curl works, the browser does notThe browser is not using the socks5h endpointBrowser proxy configuration
The listener answers after the session endedAnother process owns port 1080The ss output, then the owning process

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

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