سؤال نفق SSH عبر عدة قفزات


نفق البيانات عبر SSH جميلة إلى الأمام:

ssh -D9999 username@example.com

يضع منفذ 9999 على حسابك localhost كنفق إلى example.com، ولكن لدي حاجة أكثر تحديدًا:

  • أنا أعمل محليًا على localhost
  • host1 يمكن الوصول إليها localhost
  • host2 يقبل فقط الاتصالات من host1
  • أحتاج إلى إنشاء نفق من localhost إلى host2

على نحو فعال ، أريد إنشاء نفق SSH متعدد القفزات. كيف يمكنني أن أفعل هذا؟ من الناحية المثالية ، أود القيام بذلك دون الحاجة إلى أن يكون مستخدمًا متميزًا أي من الآلات.


299
2018-01-16 05:58


الأصل


ماذا كنت تستخدم ل؟ اريد استخدامه لالجوارب وكيل. هل ستعمل؟ - prongs
نعم ، يجب أن تكون قادرًا على استخدام الاتصال النفقي كخادم بروكسي SOCKS ، ما لم يكن host2 ينفي الشحن - Mala
كنت أفكر في إنشاء غلاف حول SSH من شأنه إعداد ذلك باستخدام استخدام ProxyCommand المتعدد. - Pavel Šimerda
prongs هل تمكنت من استخدام هذا الوكيل بروكسي SOCKS (كل تلك السنوات الماضية)؟ - Drux


الأجوبة:


لديك أساسا ثلاثة احتمالات:

  1. نفق من localhost إلى host1:

    ssh -L 9999:host2:1234 -N host1
    

    كما ذكر أعلاه ، الاتصال من host1 إلى host2 لن يتم تأمينها.

  2. نفق من localhost إلى host1 و من host1 إلى host2:

    ssh -L 9999:localhost:9999 host1 ssh -L 9999:localhost:1234 -N host2
    

    هذا سيفتح نفق من localhost إلى host1 ونفق آخر من host1 إلى host2. ومع ذلك الميناء 9999 إلى host2:1234 يمكن استخدامها من قبل أي شخص host1. هذا قد يكون أو لا يكون مشكلة.

  3. نفق من localhost إلى host1 و من localhost إلى host2:

    ssh -L 9998:host2:22 -N host1
    ssh -L 9999:localhost:1234 -N -p 9998 localhost
    

    هذا سيفتح نفق من localhost إلى host1 من خلالها خدمة SSH على host2 يمكن استعماله. ثم يتم فتح نفق ثاني من localhost إلى host2 من خلال النفق الأول.

عادة ، سأذهب مع الخيار 1. إذا كان الاتصال من host1 إلى host2 يجب أن يتم تأمينها ، انتقل مع الخيار 2. الخيار 3 مفيد بشكل أساسي للوصول إلى الخدمة على host2 التي لا يمكن الوصول إليها إلا من host2 بحد ذاتها.


281
2018-01-17 21:31



كان الخيار 3 ما كنت أبحث عنه ، وذلك بفضل! - Mala
أريد أن أفعل التصفح بهذه الطريقة. أيهما أفضل؟ جربت أول مرة لكنها لم تنجح. أنا وضعت وكيل الجوارب في المتصفح localhost: 1234 ولكن لا حظ. :( الرجاء المساعدة .. - prongs
prongs جرّب الخيار 3 - Mala
هل هناك طريقة لإعادة توجيه مفتاحي العام من localhost ، من خلال نفق المضيف 1 ، إلى host2؟ - Noli
Noli إذا كنت تستخدم ssh-agent (والذي يجب عليك) ، يمكنك إعادة توجيهه من خلال الاتصالات باستخدام -A الخيار ل ssh. - Mika Fischer


هناك إجابة ممتازة تشرح استخدام ProxyCommand توجيه التكوين ل SSH:

أضف هذا إلى حسابك ~/.ssh/config (نرى man 5 ssh_config للتفاصيل):

Host host2
  ProxyCommand ssh host1 -W %h:%p

ثم ssh host2 سوف نفق تلقائيا من خلال host1 (يعمل أيضًا مع إعادة توجيه X11 وما إلى ذلك).

يعمل هذا أيضًا مع فئة كاملة من المضيفين ، على سبيل المثال. تم تحديده بواسطة النطاق:

Host *.mycompany.com
  ProxyCommand ssh gateway.mycompany.com -W %h:%p

تحديث

OpenSSH 7.3 يقدم ا ProxyJump التوجيه ، وتبسيط المثال الأول ل

Host host2
  ProxyJump host1

141
2017-08-01 17:10



هل هناك طريقة للقيام بذلك بشكل مشروط؟ أنا فقط أريد أن أفعل هذا في بعض الأحيان. أيضا ، وهذا هو خصيصا للأوامر ، ولكن أنا أبحث عن شيء لجميع المنفذ 22 (ssh ، sftp ، الخ). - Stephane
@ ستافان ماذا تقصد ب خصيصا للأوامر؟ يستخدم التكوين SSH الخاص بك عن طريق أي شيء باستخدام ssh، بما فيها git، sftp الخ afaik. - kynan
Stephane لا أعلم طريقة تمكين هذا الشرط (على سبيل المثال فقط عندما تكون خارج شبكة المضيف المستهدف). أنا وضعت هذا الخيار لجميع المضيفين في السؤال في كتلة التكوين ثم (الامم المتحدة) تعليق السطر حسب الحاجة. ليس مثاليا، لكنه يعمل. - kynan
ستافان متأكد: ssh -F /path/to/altconfig. حذار هذا سيتجاهل النظام على نطاق واسع /etc/ssh/ssh_config. - kynan
طريقة سهلة لجعل الإعدادات "شرطية" هي تحديد مضيفين مختلفين في .ssh / config ، والتي لها نفس اسم المضيف. تواصل مع host2-tunnel عندما تريد النفق ، والمضيف 2 عندما لا تريد ذلك. - Steve Bennett


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

لأتمتة هذا الإجراء ، استخدم البرنامج النصي التالي:

#!/bin/bash
ssh -f -L some_port:private_machine:22 user@gateway "sleep 10" && ssh -p some_port private_user@localhost

ماذا يحدث:

  1. إنشاء نفق لبروتوكول ssh (المنفذ 22) إلى الجهاز الخاص.
  2. فقط إذا كان هذا ناجحًا ، استخدم ssh في الجهاز الخاص باستخدام النفق. (يضمن & & operater ذلك).
  3. بعد إغلاق جلسة ssh الخاصة ، أريد أن يغلق نفق ssh أيضًا. يتم ذلك عبر خدعة "النوم 10". عادةً ، يتم إغلاق أول أمر ssh بعد 10 ثوانٍ ، ولكن خلال هذا الوقت ، سيقوم الأمر ssh الثاني بإنشاء اتصال باستخدام النفق. ونتيجة لذلك ، يحافظ أمر ssh الأول على فتح النفق حتى يتم استيفاء الشرطين التاليين: يتم الانتهاء من النوم 10 ولن يتم استخدام النفق بعد الآن.

20
2018-01-24 18:47



ذكي جدا!!! أحبها! - Hendy Irawan


بعد قراءة ما سبق ووضع كل شيء معاً ، قمت بإنشاء نص برل التالي (احفظه كـ mssh في / usr / bin وجعله قابلاً للتنفيذ):

#!/usr/bin/perl

$iport = 13021;
$first = 1;

foreach (@ARGV) {
  if (/^-/) {
    $args .= " $_";
  }
  elsif (/^((.+)@)?([^:]+):?(\d+)?$/) {
    $user = $1;
    $host = $3;
    $port = $4 || 22;
    if ($first) {
      $cmd = "ssh ${user}${host} -p $port -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no";
      $args = '';
      $first = 0;
    }
    else {
      $cmd .= " -L $iport:$host:$port";
      push @cmds, "$cmd -f sleep 10 $args";
      $cmd = "ssh ${user}localhost -p $iport -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no";
      $args = '';
      $iport ++;
    }
  }
}
push @cmds, "$cmd $args";

foreach (@cmds) {
  print "$_\n";
  system($_);
}

الاستعمال:

للوصول إلى HOSTC عبر HOSTA و HOSTB (نفس المستخدم):

mssh HOSTA HOSTB HOSTC

للوصول إلى HOSTC عبر HOSTA و HOSTB واستخدام منافذ SSH غير الافتراضية ومستخدمين مختلفين:

mssh user1@HOSTA:1234 user2@HOSTB:1222 user3@HOSTC:78231

للوصول إلى HOSTC عبر HOSTA و HOSTB واستخدام إعادة التوجيه X:

mssh HOSTA HOSTB HOSTC -X

للوصول إلى المنفذ 8080 على HOSTC عبر HOSTA و HOSTB:

mssh HOSTA HOSTB -L8080:HOSTC:8080

18
2018-01-11 11:02



هذا رائع - Mala
أنا جاد لا أستطيع أن أشكرك بما فيه الكفاية ، وهذا السيناريو يجعل حياتي أسهل على أساس يومي. الشيء الوحيد الذي قمت بتغييره هو إضافة int (rand (1000)) إلى iport ، للسماح بتشغيل مثيلات متعددة في نفس الوقت. أنا بالتأكيد مدين لك بيرة. - Mala
هذا يعمل بشكل جيد حقا. ومن التحسينات الأخرى حل HOSTB و HOSTC etc باستخدام المضيفين المحليين / etc / hosts و ~ / .ssh / config - Steve Bennett
أيضا أنا ثاني تعليق مالا. بدون المنفذ العشوائي ، إذا حاولت بعد ذلك mssh HOSTA HOSTD سوف ينتهي بك الحال في HOSTB (وربما لن تدرك ..) - Steve Bennett


OpenSSH v7.3 فصاعدا يدعم أ -J التبديل و ProxyJump الخيار ، والذي يسمح بواحدة أو أكثر من مضيفات القفز المفصولة بفاصلة ، لذلك ، يمكنك ببساطة القيام بذلك الآن:

ssh -J jumpuser1@jumphost1,jumpuser2@jumphost2,...,jumpuserN@jumphostN user@host

18
2017-08-10 09:11



ssh -J user1 @ host1 -YC4c arcfour، blowfish-cbc user2 @ host2 firefox -no-remote هذا سيسرع في الحصول على Firefox من host2 إلى localhost. - Jaur


هذه الإجابة مشابهة لـ kynan ، حيث أنها تتضمن استخدام ProxyCommand. لكنه أكثر ملاءمة لاستخدام IMO.

إذا كان لديك netcat مثبتًا في أجهزة القفزات ، فيمكنك إضافة هذا المقتطف إلى ~ / .ssh / config:

Host *+*
    ProxyCommand ssh $(echo %h | sed 's/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s/:/ -p /') nc $(echo %h | sed 's/^.*+//;/:/!s/$/ %p/;s/:/ /')

ثم

ssh -D9999 host1+host2 -l username

سوف تفعل ما سألت.

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


8
2018-03-13 09:57



أعتقد أن هذا هو أصل الخدعة: wiki.gentoo.org/wiki/SSH_jump_host - slm
@ slm نعم ، هذا كل شيء! شكر! - silviot


ssh -L 9999:host2:80 -R 9999:localhost:9999 host1

-L 9999: host2: 80

تعني ربط localhost: 9999 وأية حزمة يتم إرسالها إلى localhost: 9999 قم بإعادة توجيهها إلى host2: 80

-R 9999: localhost: 9999

تعني أي حزمة تم استلامها بواسطة host1: 9999 لإعادة توجيهها إلى localhost: 9999


4
2018-01-19 02:03



الإجابة الرائعة والبسيطة لجعل النفق حتى تتمكن من الوصول إلى التطبيق على host2 مباشرة من localhost: 9999 - dvtoever
بعد هذه الإجابة ، أحصل على channel 3: open failed: administratively prohibited: open failed  رسالة خطأ. - Franck Dernoncourt


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

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

على سبيل المثال ، إذا قمت بإصدار الأمر

ssh2 -L 1234:localhost:23 username@host

سيتم توجيه كل حركة المرور القادمة إلى المنفذ 1234 على العميل إلى المنفذ 23 على الخادم (المضيف). لاحظ أنه سيتم حل localhost بواسطة sshdserver بعد تأسيس الاتصال. في هذه الحالة ، يشير localhost إلى الخادم (المضيف) نفسه.

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

على سبيل المثال ، إذا قمت بإصدار الأمر

ssh2 -R 1234:localhost:23 username@host

سيتم توجيه كل حركة المرور التي تأتي إلى المنفذ 1234 على الخادم (المضيف) إلى المنفذ 23 على العميل (localhost).

في فريقك ، استبدل localhost في المثال مع host2 و host مع host1.


2
2018-01-16 06:34



وفقا لهذه المادة ، سيتم تأمين الاتصال فقط حتى الجهاز الأوسط (host1). هل هناك طريقة للتأكد من أن كل شيء يبقى آمنًا؟ - Mala
لم أحاول ذلك من قبل ، ولكن إذا كانت host1 و host2 خادمين ssh ، فقد تتمكن من إعداد نفق من host1 إلى host2 ، ثم إعداد نفق من المضيف المحلي إلى host1 لنفس الخدمة (الحصول على موقعك المحلي والبعيد المنافذ اليمين). لا أعرف ما إذا كان ذلك ممكنًا في أمر واحد من localhost. - fideli