توجيه SSH الديناميكي كوكيل SOCKS عبر شبكة VPN
تطبيق لا يتحدث إلا SOCKS لا يجد نقطة وكيل في شبكة VPN عادية. قفزتان، ومستمع واحد على الاسترجاع المحلي، وبحث عن الاسم يجب أن يقوم به خادم SSH بنفسه.
التطبيق الذي يتحدث 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 see | What it usually means | Where to look |
|---|---|---|
| The app connects and nothing follows | It ignores proxy settings entirely | Its own network settings, not the SSH session |
| A name resolution error for the destination | The SSH server cannot resolve it | Server resolver and search domains |
| A UDP-only application fails | Dynamic forwarding carries TCP only | This arrangement cannot serve it |
| curl works, the browser does not | The browser is not using the socks5h endpoint | Browser proxy configuration |
| The listener answers after the session ended | Another process owns port 1080 | The ss output, then the owning process |
الصفوف الثلاثة الأولى هي التي يسيء الناس تشخيصها، لأن كلا منها ينتج محاولة اتصال بدلا من خطأ عن الوكيل نفسه. والاسم الذي يحل على الحاسوب المحمول لا يقول شيئا عن محلل الخادم، ويقرأ العطل بدلا من ذلك كمشكلة شهادة أو مهلة. والتطبيقات التي تعمل بـ UDP فقط تقف خارج التصميم لا معطلة داخله، ولا يغير أي خيار ssh إضافي ذلك. وصف المتصفح هو التذكير المعتاد بأن إعدادات الوكيل لكل تطبيق على حدة. والصف الأخير هو سبب وجود فحص الإغلاق: منفذ ما زال يستمع يعني أن شيئا آخر يملكه الآن.