سؤال قم بإعادة توجيه حركة مرور SSH من خلال جهاز متوسط


نفق SSH محير للغاية بالنسبة لي. أنا أتساءل إذا كنت أستطيع القيام بذلك في لينكس.

لدي 3 آلات ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

لذا يمكنني استخدام SSH من A -> B ومن B -> C ، ولكن ليس من A -> C.

هل هناك طريقة لإعداد نفق SSH من A إلى B ، لذلك عندما أقوم بتشغيل أوامر SSH الأخرى ، فإنها تعمل فقط من الجهاز المحلي A؟ أنا في الأساس أحاول استنساخ git repo من العمل إلى المنزل (ولا أستطيع تثبيت بوابة على الجهاز B).

أيضا ، مرة واحدة الإعداد .. كيف يمكنني غير ذلك؟


102
2018-02-11 03:58


الأصل


أعتقد أن هناك سؤالًا مكررًا في مكان ما ، لكن البحث-فو ضعيف اليوم. - quack quixote
من شأنه أن يكون لي: superuser.com/questions/96489/ssh-tunnel-via-multiple-hops - Mala


الأجوبة:


ضع هذا في حياتك .ssh/config ملف على hostA (انظر رجل 5 ssh_config للتفاصيل):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

الآن سوف ينفق الأمر التالي تلقائيًا من خلال hostB

hostA:~$ ssh hostC

قد ترغب في إضافة خيارات مثل -oCiphers=arcfour و -oClearAllForwardings=yes لتسريع الامور ، منذ التفاف ssh في داخل ssh هو أكثر تكلفة من الناحية الحسابية والجهد الإضافي والغلاف لا يحتاجان إلى أن يكونا آمنين عندما يتم نقل حركة المرور المشفرة بالفعل.


إذا كنت تستخدم OpenSSH أقدم من 5.3 ، فإن -W الخيار غير متوفر. في هذه الحالة ، يمكنك تنفيذ ما سبق باستخدام netcat (nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

119
2018-02-11 04:11



هذا عبقري! شكرا لكم. هذا يحل مشكلة تم تناولها خلال اليومين الماضيين: hostC يجلس خلف جدار ناري ولديه بيانات أريد الوصول إليها من hostA ، كمبيوتر محمول يمكن أن يكون في أي مكان في العالم. hostB أيضا وراء نفس جدار الحماية مع hostC ، ولكن لديه منفذ SSH مفتوح للعالم. وهكذا يمكنني سه من hostC -> hostB. أقوم بإعداد نفق SSH عكسي بين hostC و hostB ، حتى أتمكن من سه من hostB -> hostC (تم إعادة توجيهه من خلال localhost). مع خدعة الخاص بك يمكن أن أذهب من hostA -> hostC! يعمل بسلاسة مع SCP & Fugu على OSX! شكرا لكم! - AndyL
ال -W يجب استخدام الخيار بدلا من nc اختيار. - vy32
التي يجب أن تدعم SSH -W، فقط واحد على hostA (الأصل) أو أيضا على hostB (الجهاز الأوسط)؟ - gioele
للحصول على معلومات ، إذا كان لديك مضيفين متعددين تحتاج إلى الوصول إليها عبر نفس الجهاز hostB، من الممكن أن تعلن متعددة Host hostC خطوط فوق ProxyCommand مما يجعل من السهل الوصول إلى العديد من المضيفين عبر الخادم الأوسط. - fduff


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

يبدو أنك تريد حلًا مثل ما يلي:

ssh -L localhost:22:machinec:22 machineb

هذا سوف تحصل على قذيفة machineb. اترك هذا بمفردك تقليل نافذة المحطة.

الآن ، كلما قمت بإجراء اتصال ssh localhost، سوف تكون متصلاً بالفعل machinec عبر machineb. عندما تنتهي من النفق ، أغلق الطرف الذي قمت بتشغيل الأمر أعلاه.

لاحظ أنك ستحتاج إلى امتيازات المستخدم المتميز لتشغيل الأمر.


6
2018-02-11 04:11



+1 شكرا ويسلي. هذا هو الجواب نفق ssh الحقيقي. إليك مقالة حول هذا الموضوع: securityfocus.com/infocus/1816 - Larry K
على العموم ، هذا أمر شرير تماما ... ولكن كان علي أن أفعل ذلك مع الإصدارات القديمة من OpenSSH ، أو غيرها من عملاء ssh. يمكنك اختيار بعض المنافذ العالية مثل 8022: بهذه الطريقة لا تتداخل مع أي خدمة ssh على المضيف المحلي ، ولا تتطلب التشغيل كجذر. فقط اضف -p 8022 إلى أوامر ssh الخاصة بك. ومن السهل braindead مع بوابة: استخدام URI ssh://localhost:8022/path/to/repo.git. - ephemient


يبدو وكأنك تريد اسم مستعار قذيفة على A الذي يسبب ssh تحدث على C

  1. أفترض أنه في A ، يمكنك كتابة ssh me @ b "ssh me @ c hostname" والعودة "C"
  2. جعل اسم مستعار sshc الذي يوسع sshc foo إلى ssh me @ b "ssh me @ c foo"
  3. للبناء الدقيق لإنشاء الاسم المستعار ، استشر superuser.com

3
2018-02-11 04:04



قد تضطر إلى إضافة -t لخيارات ssh الخارجية إذا كنت تريد قوقعة تفاعلية ، منذ ذلك الحين ssh يفترض -T إذا أعطيت الأمر. - ephemient


إذا كان صاحب العمل يوفر شبكة افتراضية خاصة ، فأوصيك باستخدام ذلك بدلاً من ذلك.

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


0
2018-02-11 20:14



في بعض الأحيان هو VPN الذي هو السبب في أننا بحاجة إلى هذه الحيل ... - Louis


YASS بعد حل بسيط آخر

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • الأمر الأول فتح اتصال ssh إلى HostB وأقول HostB لإعادة توجيه الاتصالات من مضيف محلي: 2222 إلى HostC: 22.
  • ال -f المعلمة تقول SSH للذهاب إلى الخلفية بمجرد إنشاء الاتصال
  • الأمر الثاني مفتوح ببساطة اتصال العميل ل مضيف محلي: 2222
  • اختيار HostKeyAlias غير مطلوبة ، ولكن قد تساعد في منع الاتصال بالمضيف الخاطئ
  • نوتا: الأمر sleep 10 هناك حاجة للحفاظ على اتصال حتى استخدام الأمر ssh الثاني إعادة توجيه الميناء. ثم أولا سه سوف تغلق عند الثانية سه مغادرة ميناء المعاد.

يمكنك الآن تشغيل جلسات ssh التالية:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

البديل:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

جلسات ssh اللاحقة يمكن فتحها عن طريق تشغيل:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

الميزة الرئيسية لاستخدام M-and -S param هي أن اتصال واحد فقط مفتوح من HostA إلى HostC ، لن تتم مصادقة الجلسة التالية مرة أخرى وتشغيلها بشكل أسرع كثيرًا.


0
2017-11-10 15:35