सवाल एकाधिक होप्स के माध्यम से एक एसएसएच सुरंग


एसएसएच पर टनलिंग डेटा बहुत सीधी है:

ssh -D9999 username@example.com

आपके ऊपर पोर्ट 99 99 सेट अप करता है localhost एक सुरंग के रूप में example.com, लेकिन मेरे पास एक और विशिष्ट आवश्यकता है:

  • मैं स्थानीय रूप से काम कर रहा हूं localhost
  • host1 के लिए सुलभ है localhost
  • host2 केवल कनेक्शन स्वीकार करता है host1
  • मुझे एक सुरंग बनाने की जरूरत है localhost सेवा मेरे host2

प्रभावी रूप से, मैं एक "बहु-हॉप" एसएसएच सुरंग बनाना चाहता हूं। मैं यह कैसे कर सकता हूँ? आदर्श रूप में, मैं सुपरसियर होने की आवश्यकता के बिना ऐसा करना चाहता हूं कोई भी मशीनों का।


299
2018-01-16 05:58


मूल


आपने इसके लिए क्या उपयोग किया? मैं इसे मोजे प्रॉक्सी के लिए उपयोग करना चाहता हूं। क्या ये काम करेगा? - prongs
हां, आप सुरंग प्रॉक्सी के रूप में सुरंग कनेक्शन का उपयोग करने में सक्षम होना चाहिए, जब तक कि host2 अग्रेषण से इनकार करता है - Mala
मैं एसएसएच पर एक रैपर बनाने के बारे में सोच रहा था जो प्रॉक्सी कॉमांड के कई उपयोगों का उपयोग करके स्थापित करेगा। - Pavel Šimerda
@prongs क्या आपने सॉक्स प्रॉक्सी (उन सभी वर्षों पहले) के लिए इसका उपयोग करने में कामयाब रहे हैं? - 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 जिसके माध्यम से एसएसएच सेवा host2 इस्तेमाल किया जा सकता है। फिर से दूसरी सुरंग खोला गया है localhost सेवा मेरे host2 पहली सुरंग के माध्यम से।

आम तौर पर, मैं विकल्प 1 के साथ जाऊंगा। अगर कनेक्शन से host1 सेवा मेरे host2 सुरक्षित होने की आवश्यकता है, विकल्प 2 के साथ जाएं। विकल्प 3 मुख्य रूप से एक सेवा तक पहुंचने के लिए उपयोगी है host2 यह केवल पहुंच योग्य है host2 अपने आप।


281
2018-01-17 21:31



विकल्प 3 वह था जिसे मैं ढूंढ रहा था, धन्यवाद! - Mala
मैं इस तरह से ब्राउज़ करना चाहता हूँ। कौन सा सबसे अच्छा है? मैंने पहले कोशिश की लेकिन यह काम नहीं किया। मैंने अपने ब्राउज़र लोकहोस्ट में एक मोजे प्रॉक्सी सेट की: 1234 लेकिन कोई भाग्य नहीं। :( कृपया सहायता कीजिए.. - prongs
@prongs विकल्प 3 कोशिश करें - Mala
मेजबान 1 की सुरंग के माध्यम से, host2 पर, स्थानीयहोस्ट से मेरी सार्वजनिक कुंजी को आगे बढ़ाने का कोई तरीका है? - Noli
@ नोली यदि आप एसएसएच-एजेंट (जो आपको करना चाहिए) का उपयोग करते हैं, तो आप इसका उपयोग कर कनेक्शन के माध्यम से अग्रेषित कर सकते हैं -A एसएसएच के लिए विकल्प। - Mika Fischer


वहां पर एक के उपयोग की व्याख्या का उत्कृष्ट जवाब ProxyCommand एसएसएच के लिए विन्यास निर्देश:

इसे अपने में जोड़ें ~/.ssh/config (देख man 5 ssh_config ब्योरा हेतु):

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

फिर ssh host2 स्वचालित रूप से सुरंग हो जाएगा host1 (एक्स 11 फॉरवर्डिंग आदि के साथ भी काम करता है)।

यह मेजबानों की एक पूरी कक्षा के लिए भी काम करता है उदा। डोमेन द्वारा पहचाना गया:

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

अद्यतन करें

ओपनएसएसएच 7.3 परिचय ए ProxyJump निर्देश, पहले उदाहरण को सरल बनाना

Host host2
  ProxyJump host1

141
2017-08-01 17:10



क्या यह सशर्त रूप से करने का कोई तरीका है? मैं केवल कभी-कभी ऐसा करना चाहता हूं। साथ ही, यह विशेष रूप से कमांड के लिए है, लेकिन मैं बंदरगाह 22 (एसएसएच, एसएफटीपी, आदि) के लिए कुछ ढूंढ रहा हूं। - Stephane
@Stephane आप का क्या मतलब है विशेष रूप से आदेशों के लिए? आपकी एसएसएच कॉन्फ़िगरेशन का उपयोग किसी भी चीज़ द्वारा किया जाता है ssh, समेत git, sftp आदि afaik। - kynan
@Stephane मुझे इस सशर्त रूप से सक्षम करने के तरीके से अवगत नहीं है (उदा। केवल तभी जब आप लक्ष्य होस्ट के नेटवर्क के बाहर हों)। मैंने कॉन्फ़िगरेशन ब्लॉक में सभी होस्टों के लिए यह विकल्प सेट किया है और फिर (अन) आवश्यकतानुसार लाइन पर टिप्पणी करें। सही नहीं है, लेकिन यह काम करता है। - kynan
@Stephane यकीन है: ssh -F /path/to/altconfig। सावधान रहें इस प्रणाली को व्यापक रूप से अनदेखा कर देगा /etc/ssh/ssh_config। - kynan
सेटिंग "सशर्त" बनाने का एक आसान तरीका है .ssh / config में दो अलग-अलग होस्ट को परिभाषित करना, जिसमें एक ही होस्टनाम है। जब आप सुरंग चाहते हैं तो मेजबान 2-सुरंग से कनेक्ट करें, और मेजबान 2 जब आप नहीं करते हैं। - Steve Bennett


हमारे पास हमारे निजी नेटवर्क में एक एसएसएच गेटवे है। अगर मैं बाहर हूं और निजी नेटवर्क के अंदर एक मशीन पर रिमोट खोल चाहता हूं, तो मुझे गेटवे में और वहां से निजी मशीन में जाना होगा।

इस प्रक्रिया को स्वचालित करने के लिए, मैं निम्न स्क्रिप्ट का उपयोग करता हूं:

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

क्या हो रहा है:

  1. निजी मशीन में एसएसएच प्रोटोकॉल (पोर्ट 22) के लिए एक सुरंग स्थापित करें।
  2. केवल अगर यह सफल है, सुरंग का उपयोग कर निजी मशीन में ssh। (& & ऑपरेटर यह सुनिश्चित करता है)।
  3. निजी एसएसएच सत्र बंद करने के बाद, मैं चाहता हूं कि एसएसएच सुरंग भी बंद हो। यह "नींद 10" चाल के माध्यम से किया जाता है। आमतौर पर, पहला एसएसएच कमांड 10 सेकंड के बाद बंद हो जाएगा, लेकिन इस समय के दौरान, दूसरा एसएसएच कमांड सुरंग का उपयोग करके एक कनेक्शन स्थापित करेगा। नतीजतन, पहला एसएसएच कमांड सुरंग को तब तक खुला रखता है जब तक कि निम्नलिखित दो स्थितियां संतुष्ट न हों: नींद 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($_);
}

उपयोग:

HOSTA और HOSTB (उसी उपयोगकर्ता) के माध्यम से HOSTC तक पहुंचने के लिए:

mssh HOSTA HOSTB HOSTC

HOSTA और HOSTB के माध्यम से HOSTC तक पहुंचने के लिए और गैर-डिफ़ॉल्ट SSH-portnumbers और विभिन्न उपयोगकर्ताओं का उपयोग करें:

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

HOSTA और HOSTB के माध्यम से HOSTC तक पहुंचने के लिए और एक्स-फ़ॉरवर्डिंग का उपयोग करें:

mssh HOSTA HOSTB HOSTC -X

HOSTA और HOSTB के माध्यम से HOSTC पर पोर्ट 8080 तक पहुंचने के लिए:

mssh HOSTA HOSTB -L8080:HOSTC:8080

18
2018-01-11 11:02



यह कमाल का है - Mala
मैं गंभीरता से आपको धन्यवाद नहीं दे सकता, यह स्क्रिप्ट दैनिक आधार पर मेरी जिंदगी को आसान बनाती है। एकमात्र चीज जो मैंने बदल दी थी वह आईपी (रैंड (1000)) को आईपोर्ट में जोड़ना था, ताकि एक ही समय में कई उदाहरण चल सकें। मैं निश्चित रूप से आपको एक बियर देना चाहता हूं। - Mala
यह वास्तव में अच्छी तरह से काम करता है। HOSTB, HOSTC इत्यादि को स्थानीयहोस्ट / etc / hosts और ~ / .ssh / config का उपयोग करके हल करने के लिए एक और सुधार होगा - Steve Bennett
इसके अलावा मैं दूसरी माला की टिप्पणी भी करता हूं। यादृच्छिक बंदरगाह के बिना, यदि आप फिर कोशिश करते हैं mssh HOSTA HOSTD आप वास्तव में HOSTB पर समाप्त हो जाएंगे (और शायद महसूस नहीं होगा ..) - Steve Bennett


ओपनएसएसएच 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 फ़ायरफ़ॉक्स -नो-रिमोट यह होस्ट 2 से स्थानीयहोस्ट तक फ़ायरफ़ॉक्स प्राप्त करने में तेज़ होगा। - Jaur


यह उत्तर kynan के समान है, क्योंकि इसमें प्रॉक्सी कॉमांड का उपयोग शामिल है। लेकिन आईएमओ का उपयोग करना अधिक सुविधाजनक है।

अगर आपके पास अपनी हॉप मशीनों में नेटकैट स्थापित है तो आप इस स्निपेट को अपने ~ / .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
@ एसएलएम हाँ, यह है! धन्यवाद! - silviot


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

-एल 99 99: होस्ट 2: 80

मतलब स्थानीयहोस्ट से बंधे हैं: 99 99 और लोकलहोस्ट को भेजा गया कोई भी पैकेट: 99 99 इसे होस्ट 2: 80 पर अग्रेषित करें

-आर 99 99: लोकलहोस्ट: 99 99

होस्ट 1: 99 99 द्वारा प्राप्त किसी भी पैकेट का अर्थ है इसे वापस स्थानीयहोस्ट पर: 99 99


4
2018-01-19 02:03



एक सुरंग बनाने के लिए शानदार, सबसे सरल जवाब ताकि आप स्थानीयहोस्ट से सीधे होस्ट 2 पर एप्लिकेशन तक पहुंच सकें: 99 99 - dvtoever
इस जवाब के बाद, मुझे एक मिलता है channel 3: open failed: administratively prohibited: open failed  त्रुटि संदेश। - Franck Dernoncourt


आप किसी सेवा तक पहुंचने के लिए पोर्ट अग्रेषण का उपयोग करने में सक्षम होना चाहिए host2 से localhost। एक अच्छी गाइड स्थित है यहाँ। अंश:

दो प्रकार के बंदरगाह अग्रेषण हैं: स्थानीय और दूरस्थ अग्रेषण। उन्हें क्रमशः आउटगोइंग और आने वाली सुरंग भी कहा जाता है। स्थानीय बंदरगाह अग्रेषण यातायात एक स्थानीय बंदरगाह को एक निर्दिष्ट रिमोट पोर्ट पर आ रहा है।

उदाहरण के लिए, यदि आप कमांड जारी करते हैं

ssh2 -L 1234:localhost:23 username@host

क्लाइंट पर पोर्ट 1234 पर आने वाले सभी ट्रैफ़िक सर्वर (होस्ट) पर पोर्ट 23 पर अग्रेषित किए जाएंगे। ध्यान दें कि कनेक्शन स्थापित होने के बाद sshdserver द्वारा localhost को हल किया जाएगा। इस मामले में स्थानीयहोस्ट इसलिए सर्वर (मेजबान) को संदर्भित करता है।

रिमोट पोर्ट अग्रेषण विपरीत है: यह एक निर्दिष्ट बंदरगाह पर एक निर्दिष्ट बंदरगाह के लिए आने वाले यातायात आ रहा है।

उदाहरण के लिए, यदि आप कमांड जारी करते हैं

ssh2 -R 1234:localhost:23 username@host

सर्वर (होस्ट) पर बंदरगाह 1234 पर आने वाले सभी ट्रैफ़िक को क्लाइंट (लोकलहोस्ट) पर पोर्ट 23 पर अग्रेषित किया जाएगा।

अपनी कास्ट में, प्रतिस्थापित करें localhost उदाहरण के साथ में host2 तथा host साथ में host1


2
2018-01-16 06:34



उस लेख के अनुसार, कनेक्शन केवल मध्यम मशीन (होस्ट 1) तक सुरक्षित हो जाएगा। क्या यह सुनिश्चित करने का कोई तरीका है कि पूरी चीज सुरक्षित रहेगी? - Mala
मैंने कभी यह कोशिश नहीं की है, लेकिन यदि मेजबान 1 और होस्ट 2 दोनों एसएसएच सर्वर हैं, तो हो सकता है कि आप मेजबान 1 से मेजबान 2 तक एक सुरंग स्थापित कर सकें, फिर उसी सेवा के लिए लोकलहोस्ट से होस्ट 1 तक एक सुरंग स्थापित करें (अपना स्थानीय और रिमोट प्राप्त करना बंदरगाह सही)। मुझे नहीं पता कि यह स्थानीयहोस्ट से एक कमांड में संभव है या नहीं। - fideli


मैंने जो किया वह मैंने किया सोच आप के साथ करना चाहता था

ssh -D 9999 -J host1 host2

मुझे दोनों पासवर्ड के लिए संकेत दिया जाता है, फिर मैं स्थानीयहोस्ट का उपयोग कर सकता हूं: 99 99 को सॉक्स प्रॉक्सी के लिए होस्ट 2 के लिए। यह सबसे नज़दीक है जिसे मैं पहली जगह में दिखाए गए उदाहरण के बारे में सोच सकता हूं।


2
2017-11-21 11:06





इस जवाब में मैं एक ठोस उदाहरण के माध्यम से जाना होगा। आपको बस कंप्यूटर के होस्टनाम, उपयोगकर्ता नाम और पासवर्ड को अपने द्वारा प्रतिस्थापित करने की आवश्यकता है।

समस्या का विवरण

आइए मान लें कि हमारे पास निम्न नेटवर्क टोपोलॉजी है:

our local computer <---> server 1 <---> server 2

कंक्रीटेंस के लिए, मान लीजिए कि हमारे पास निम्नलिखित कंप्यूटर के होस्टनाम, उपयोगकर्ता नाम और पासवर्ड हैं:

LocalPC            <--->  hostname: mit.edu         <---> hec.edu
                          username: bob                   username: john 
                          password: dylan123              password: doe456

लक्ष्य: हम एक सॉक्स प्रॉक्सी सेट करना चाहते हैं जो पोर्ट पर सुनता है 9991 का LocalPC ताकि प्रत्येक बार एक कनेक्शन पर LocalPC बंदरगाह से शुरू किया गया है 9991 यह गुजरता है mit.edu फिर hec.edu

उपयोग के मामले का उदाहरण: hec.edu एक HTTP सर्वर है जो केवल सुलभ है http://127.0.0.1:8001, सुरक्षा कारणो से। हम यात्रा करने में सक्षम होना चाहते हैं http://127.0.0.1:8001 एक वेब ब्राउज़र खोलकर LocalPC


विन्यास

में LocalPC, जोड़ें ~/.ssh/config:

Host HEC
    HostName hec.edu
    User john
    ProxyCommand ssh bob@mit.edu -W %h:%p

फिर टर्मिनल में LocalPC, भागो:

ssh -D9991 HEC

यह आपको पासवर्ड पूछेगा bob पर mit.edu (अर्थात।, dylan123), तो यह आपको पासवर्ड पूछेगा john पर hec.edu (अर्थात।, doe456)।

उस बिंदु पर, सॉक्स प्रॉक्सी अब पोर्ट पर चल रहा है 9991 का LocalPC

उदाहरण के लिए, यदि आप किसी वेबपृष्ठ पर जाना चाहते हैं LocalPC सॉक्स प्रॉक्सी का उपयोग करके, आप फ़ायरफ़ॉक्स में कर सकते हैं:

enter image description here

कुछ टिप्पणी:

  • में ~/.ssh/config, HEC कनेक्शन का नाम है: आप इसे अपनी इच्छानुसार किसी भी चीज़ में बदल सकते हैं।
  • -D9991 बताता है ssh बंदरगाह पर एक SOCKS4 प्रॉक्सी स्थापित करने के लिए 9991

1
2018-03-18 20:13





यदि आप दोनों मशीनों में एसएसएच कर सकते हैं, तो एसएसएच प्रॉक्सी कॉमांड निर्देश देखें। यह आपको सीधे स्थानीयहोस्ट से होस्ट 2 में जाने देगा (यदि आप सार्वजनिक कुंजी का उपयोग करते हैं तो एक आसान कमांड में !!)। फिर आप होस्ट 2 के साथ जो चाहें कर सकते हैं।

http://www.statusq.org/archives/2008/07/03/1916/


0
2018-01-19 01:35