एक मध्य मशीन के माध्यम से SSH ट्रैफ़िक को अग्रेषित करें


110

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.

इसलिए मैं ए -> बी से और बी -> सी से एसएसएच कर सकता हूं, लेकिन ए -> सी से नहीं।

क्या बी के माध्यम से ए से एसएसएच सुरंग स्थापित करने का एक तरीका है, इसलिए जब मैं अन्य एसएसएच कमांड चलाता हूं, तो वे सिर्फ मेरे मोबाइल मशीन ए से काम करते हैं? मैं मूल रूप से घर से काम करने के लिए गिट रेपो को क्लोन करने की कोशिश कर रहा हूं (और मैं मशीन बी पर गिट स्थापित नहीं कर सकता)।

इसके अलावा, एक बार सेटअप .. मैं इसे कैसे परेशान करूँगा?


मेरा मानना ​​है कि कहीं न कहीं एक डुप्लिकेट प्रश्न है, लेकिन मेरा खोज-फू आज कमजोर है।
21-13 को 21



यदि आप मशीन A पर लिनक्स चला रहे हैं, तो sshuttle नामक एक टूल का उपयोग करें, जो आपको A-> B सुरंग के लिए C के लिए सभी ट्रैफ़िक को चुनिंदा रूप से अग्रेषित करने की अनुमति देता है (C को B से दिखाई देता है)।
जोत

जवाबों:


128

इसे अपनी .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कम्प्यूटेशनल रूप से अधिक महंगा है और अतिरिक्त प्रयास और रैपर को पहले से एन्क्रिप्ट किए गए ट्रैफ़िक को टनलिंग करते समय उतना सुरक्षित होने की आवश्यकता नहीं है।


यदि आप 5.3 से पहले OpenSSH का उपयोग कर रहे हैं, तो -Wविकल्प उपलब्ध नहीं है। इस मामले में आप netcat ( nc) का उपयोग करके उपरोक्त को लागू कर सकते हैं :

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

1
ये जबरदस्त है! धन्यवाद। यह एक समस्या है जो मुझे पिछले 2 दिनों से खा रहा है: hostC एक फ़ायरवॉल के पीछे बैठता है और मेरे पास hosta, एक लैपटॉप जो दुनिया में कहीं भी हो सकता है, से डेटा प्राप्त करना चाहता है। hostC भी hostC के साथ समान फ़ायरवॉल के पीछे है, लेकिन इसमें SSH पोर्ट दुनिया के लिए खुला है। इस प्रकार मैं hostC -> hostB से ssh कर सकता हूं। मैंने hostC और hostB के बीच एक रिवर्स SSH सुरंग की स्थापना की है, इसलिए मैं hostB -> hostC (localhost के माध्यम से अग्रेषित) से भी ssh कर सकता हूं। आपकी चाल से मैं hostA -> hostC से जा सकता हूँ! यह OSX पर SCP & Fugu के साथ मूल रूप से काम करता है! धन्यवाद!
एंडीएल

-Wविकल्प के बजाय इस्तेमाल किया जाना चाहिए ncविकल्प।
vy32

किस SSH का समर्थन करना चाहिए -W, केवल hostA (मूल) पर या hostB (मध्य मशीन) पर भी एक?
जियोले

जानकारी के लिए, यदि आपके पास एक से अधिक होस्ट करने की आवश्यकता है hostB, तो इसके माध्यम से कई Host hostCलाइनों की घोषणा करना संभव है , ProxyCommandजिससे मध्य सर्वर के माध्यम से कई होस्ट तक पहुंचना सुपर आसान हो जाता है।
fduff

7

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

ऐसा लगता है कि आप निम्नलिखित की तरह एक समाधान चाहते हैं:

ssh -L localhost:22:machinec:22 machineb

यह आपको एक शेल मिलेगा machineb। इसे अकेला छोड़ दो; टर्मिनल विंडो को छोटा करें।

अब, जब भी आप करने के लिए एक ssh कनेक्शन बनाने localhost, आप वास्तव में से जोड़ा जाएगा machinecके जरिए machineb। जब आप सुरंग के साथ किया जाता है, तो उस टर्मिनल को बंद करें जिसमें आपने उपरोक्त कमांड चलाया था।

ध्यान दें कि कमांड चलाने के लिए आपको सुपरसुसर विशेषाधिकारों की आवश्यकता होगी।


+1 धन्यवाद वेस्ले। यह वास्तविक ssh टनलिंग उत्तर है। इसके बारे में एक लेख यहां दिया गया है: Securityfocus.com/infocus/1816
लैरी के

3
कुल मिलाकर, यह काफी बुराई है ... लेकिन मुझे ओपनएसएसएच के प्राचीन संस्करणों या अन्य एसश ग्राहकों के साथ ऐसा करना पड़ा है। आप 8022 जैसे कुछ उच्च पोर्ट चुन सकते हैं: इस तरह यह लोकलहोस्ट पर किसी भी ssh सेवा के साथ हस्तक्षेप नहीं करता है, और इसे रूट के रूप में चलाने की आवश्यकता नहीं है। बस जोड़ने के -p 8022अपने ssh आदेश के। और यह git के साथ आसान है: URI का उपयोग करें ssh://localhost:8022/path/to/repo.git
अपरिपक्व

3

लगता है जैसे आप ए पर एक शेल उर्फ ​​चाहते हैं जो सी पर होने का कारण बनता है

  1. मुझे लगता है कि A पर, आप ssh me @ b "ssh me @ c hostname" टाइप कर सकते हैं और "C" वापस पा सकते हैं
  2. एक उपनाम sshc करें जो sshc foo को ssh me @ b "ssh me @ c foo" में विस्तारित करता है
  3. उपनाम बनाने के सटीक सिंटैक्स के लिए, superuser.com से परामर्श करें

1
आप जोड़ना पड़े -tबाहरी ssh के विकल्प के लिए अगर आप एक इंटरैक्टिव खोल चाहते के बाद से sshमान लिया गया है -Tकि यह एक आदेश दिया है।
एपीकेमिनेशन

1

इंटरेक्टिव शेल के लिए आप इस सरल कमांड का उपयोग कर सकते हैं:

ssh -J <user>@<hostB> <user>@<hostC>

-J विकल्प कूद के लिए है


0

यदि आपका नियोक्ता वीपीएन प्रदान करता है, तो मैं इसके बजाय इसका उपयोग करने की सलाह दूंगा।

इस तरह, आपको किसी भी एप्लिकेशन को विशेष रूप से (यहां तक ​​कि ssh) को कॉन्फ़िगर करने की आवश्यकता नहीं होगी, और आप फ़ायरवॉल के पीछे किसी भी मशीन को देख सकते हैं। इसके अतिरिक्त, आपके सभी ट्रैफ़िक को वीपीएन सॉफ़्टवेयर द्वारा एन्क्रिप्ट किया जाएगा, जो किसी भी अनजाने या जानबूझकर अनियंत्रित ट्रैफ़िक में सुरक्षा जोड़ देगा।


6
कभी-कभी इसका वीपीएन यही कारण है कि हमें इन ट्रिक्स की जरूरत है ...
लुई

0

YASS फिर भी एक और सरल उपाय

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • पहले कमांड HostB के लिए एक ssh कनेक्शन खोलें और HostB को लोकलहोस्ट से आगे के कनेक्शन के लिए बताएं: 2222 से HostC: 22
  • -fएक बार कनेक्शन स्थापित होने के बाद पैरामीटर SSH को पृष्ठभूमि में जाने के लिए कहता है
  • दूसरा कमांड केवल लोकलहोस्ट के लिए क्लाइंट कनेक्शन खुला : 2222
  • विकल्प HostKeyAlias ​​की आवश्यकता नहीं है, लेकिन गलत होस्ट के कनेक्शन को रोकने में मदद कर सकता है
  • नोट: sleep 10दूसरे ssh कमांड के फॉरवर्ड पोर्ट का उपयोग करने तक कनेक्शन बनाए रखने के लिए कमांड की आवश्यकता होती है। तब पहला ssh बंद होगा जब दूसरा 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 और -S परम का उपयोग करने का मुख्य लाभ यह है कि केवल एक कनेक्शन HostA से HostC के लिए खुला है, बाद का सत्र फिर से प्रमाणित नहीं होगा और बहुत तेज चलाएगा।


0

विशेष मामला, मिश्रित निक्स प्लेटफॉर्म:

  hostA (linux) -> HostB (सोलारिस) -> HostC (linux)

यदि hostC पर एक X एप्लिकेशन की आवश्यकता है, और मध्यवर्ती हॉप Solaris बॉक्स पर है ... इस मामले में मुझे ProxyCommand पर आवश्यक netcat (nc) ऐसा मिला:

होस्ट: ~ $ vi। ssh / config:

मेजबान मेजबान
    ProxyCommand ssh hostB nc% h% p # जहां nc netcat है

फिर स्वचालित टनलिंग कार्य:

hosta: ~ $ ssh hostC

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.