रिवर्स SSH टनलिंग कैसे काम करता है?


350

जैसा कि मैं यह समझता हूं, फ़ायरवॉल (डिफ़ॉल्ट सेटिंग्स मानकर) आने वाले सभी ट्रैफ़िक से इनकार करते हैं जिनके पास कोई पूर्ववर्ती आउटगोइंग ट्रैफ़िक नहीं है।

एक ssh कनेक्शन और SSH टनलिंग मेड ईज़ी को उलटने के आधार पर , pesky फ़ायरवॉल प्रतिबंधों को प्राप्त करने के लिए रिवर्स SSH टनलिंग का उपयोग किया जा सकता है।

मैं रिमोट मशीन पर शेल कमांड निष्पादित करना चाहता हूं। रिमोट मशीन का अपना फ़ायरवॉल है और अतिरिक्त फ़ायरवॉल (राउटर) के पीछे है। इसका IP पता 192.168.1.126 (या कुछ इसी तरह) है। मैं एक फ़ायरवॉल के पीछे नहीं हूँ और मुझे दूरस्थ मशीन का IP पता पता है जैसा कि इंटरनेट से देखा गया है (192.168.1.1269) नहीं। इसके अतिरिक्त, मैं किसी को ssh (something)रिमोट मशीन पर रूट के रूप में निष्पादित करने के लिए कह सकता हूं ।

क्या कोई भी मुझे समझा सकता है, कदम से कदम, फायरवॉल (स्थानीय और दूरस्थ मशीनों की फायरवॉल और उनके बीच अतिरिक्त फ़ायरवॉल) के आसपास पाने के लिए SSH सुरंग कैसे रिवर्स काम करती है?

स्विच (की क्या भूमिका है -R, -f, -L, -N)?


जवाबों:


402

मुझे विज़ुअलाइज़ेशन के माध्यम से इस तरह की बात समझाना बहुत पसंद है। :-)

अपने SSH कनेक्शन को ट्यूब के रूप में सोचें। बड़ी ट्यूब। सामान्यतया, आप दूरस्थ कंप्यूटर पर शेल चलाने के लिए इन ट्यूबों के माध्यम से पहुँचेंगे। शेल वर्चुअल टर्मिनल (tty) में चलता है। लेकिन आप इस हिस्से को पहले से ही जानते हैं।

एक ट्यूब के भीतर एक ट्यूब के रूप में अपनी सुरंग के बारे में सोचो। आपके पास अभी भी बड़ा SSH कनेक्शन है, लेकिन -L या -R विकल्प आपको इसके अंदर एक छोटी ट्यूब स्थापित करने देता है।

हर ट्यूब की एक शुरुआत और एक अंत होता है। बड़ी ट्यूब, आपका SSH कनेक्शन, आपके SSH क्लाइंट के साथ शुरू होता है और आपके द्वारा जुड़े SSH सर्वर पर समाप्त होता है। सभी छोटी ट्यूबों में एक ही समापन बिंदु होते हैं, सिवाय इसके कि "प्रारंभ" या "अंत" की भूमिका निर्धारित की जाती है कि क्या आपने उन्हें ( -Lया -Rक्रमशः) उन्हें बनाने के लिए उपयोग किया था।

(आपने कहा नहीं है, लेकिन मैं यह मानने जा रहा हूं कि आपने जिस "रिमोट" मशीन का उल्लेख किया है, फ़ायरवॉल के पीछे, नेटवर्क एड्रेस ट्रांसलेशन (NAT) का उपयोग करके इंटरनेट तक पहुंच सकता है। यह एक तरह का महत्वपूर्ण है, इसलिए अगर यह गलत है तो कृपया इस धारणा को सुधारें।)

जब आप एक सुरंग बनाते हैं, तो आप एक पता और पोर्ट निर्दिष्ट करते हैं, जिस पर वह जवाब देगा, और एक पता और बंदरगाह जिस पर उसे वितरित किया जाएगा। -Lविकल्प सुरंग सुरंग (मेजबान अपने ग्राहक चल) के स्थानीय पक्ष पर जवाब देने के लिए कहता है। -Rविकल्प सुरंग दूरदराज के पक्ष (SSH सर्वर) पर जवाब देने के लिए कहता है।

ssh सुरंग दिशाएँ

तो ... इंटरनेट से एक फायरवॉल के पीछे एक मशीन में SSH करने में सक्षम होने के लिए, आपको बाहरी दुनिया के लिए SSH कनेक्शन खोलने के लिए मशीन की आवश्यकता है और इसमें एक -Rसुरंग शामिल है जिसका "प्रवेश" बिंदु "रिमोट" पक्ष है उसका कनेक्शन।

ऊपर दिखाए गए दो मॉडलों में से, आप दाईं ओर चाहते हैं।

फ़ायरवॉल होस्ट से:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

यह आपके क्लाइंट को एक -Rएमोट एंट्री पॉइंट के साथ एक सुरंग स्थापित करने के लिए कहता है । जो कुछ भी सुरंग के दूर छोर पर 22222 पोर्ट से जुड़ता है, वह वास्तव में "लोकलहोस्ट पोर्ट 22" तक पहुंच जाएगा, जहां "लोकलहोस्ट" सुरंग के निकास बिंदु (यानी आपके ssh क्लाइंट) के दृष्टिकोण से है।

अन्य विकल्प हैं:

  • -f यह प्रमाणित होने के बाद खुद को पृष्ठभूमि के लिए ssh बताता है, इसलिए आपको सुरंग के जीवित रहने के लिए रिमोट सर्वर पर कुछ चलाने के लिए बैठने की ज़रूरत नहीं है।
  • -Nकहते हैं कि आप SSH कनेक्शन चाहते हैं, लेकिन आप वास्तव में कोई दूरस्थ कमांड नहीं चलाना चाहते हैं। यदि आप जो भी निर्माण कर रहे हैं वह एक सुरंग है, तो इस विकल्प को शामिल करने से संसाधनों की बचत होती है।
  • -T छद्म ट्टी आवंटन को अक्षम करता है, जो उचित है क्योंकि आप एक इंटरैक्टिव शेल बनाने की कोशिश नहीं कर रहे हैं।

जब तक आपने पासवर्ड रहित लॉगिन के लिए DSA या RSA कुंजी सेट नहीं की है, तब एक पासवर्ड चुनौती होगी।

ध्यान दें कि यह दृढ़ता से अनुशंसा की जाती है कि आप एक फेंक-दूर खाते का उपयोग करें (अपना लॉगिन नहीं) जो आप बस इस सुरंग / ग्राहक / सर्वर के लिए सेट करें।

अब, अपने शेल से yourpublichost पर , सुरंग के माध्यम से फ़ायरवॉल होस्ट में एक कनेक्शन स्थापित करें:

ssh -p 22222 username@localhost

आपको एक मेजबान कुंजी चुनौती मिलेगी, क्योंकि आपने शायद पहले कभी इस मेजबान को नहीं मारा है। फिर आपको usernameखाते के लिए एक पासवर्ड चुनौती मिलेगी (जब तक कि आपने पासवर्ड रहित लॉगिन के लिए कुंजी सेट नहीं की है)।

यदि आप इस होस्ट को नियमित रूप से एक्सेस करने जा रहे हैं, तो आप अपनी ~/.ssh/configफ़ाइल में कुछ लाइनें जोड़कर एक्सेस को आसान बना सकते हैं :

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

समायोजित remotehostnameऔर remoteusernameसूट करने के लिए। remoteusernameक्षेत्र दूरस्थ सर्वर पर अपना उपयोगकर्ता नाम से मेल खाना चाहिए, लेकिन remotehostnameकिसी भी होस्ट नाम है कि आप सूट हो सकता है, यह कुछ भी समाधान योग्य मैच के लिए नहीं है।

( गैर-लोकलहोस्ट आईपी पर रिवर्स समापन बिंदु को उजागर करने के लिए , इस पोस्ट को देखें )


2
ssh -D के बारे में क्या। कृपया उसी विधि का उपयोग करके समझाएं।
बिगसैक

6
SOCKS परदे के पीछे सुरंग के समान नहीं हैं। यदि आपके पास उन्हें उपयोग करने के तरीके के बारे में कोई प्रश्न है, तो कृपया इसे पूछें
घटिया

12
सर्वर, क्लाइंट, लोकल मशीन, रिमोट मशीन, होस्ट, yourpublichost, localhost, रिमोटहोस्टनाम: सर्वर की ढीली उपयोग के कारण इस स्पष्टीकरण के बाद मुझे बहुत मुश्किल समय हो रहा है। इन सभी ढीले और अपरिभाषित शब्दों के साथ, यह माना जा सकता है कि इसे स्थापित करने के लिए किसी को 8 कंप्यूटरों की आवश्यकता होगी। मैं इसे बताता हूं क्योंकि अन्य सभी पहलुओं में यह बहुत अच्छी व्याख्या है। कृपया शर्तों को कम करें और परिभाषित करें।
Rucent88

4
@ Rucent88, मुझे यकीन नहीं है कि क्या कमी संभव होगी। एक क्लाइंट एक सर्वर से कनेक्शन स्थापित करता है। नेटवर्किंग की दुनिया भर में यह सामान्य शब्दावली है। स्थानीय और दूरस्थ मशीनें बहुत स्पष्ट दिखाई देती हैं। यदि आप दस्तावेज़ पढ़ने के बाद SSH या सामान्य यूनिक्स शब्दावली के बारे में उलझन में हैं, तो मुझे यकीन है कि आपको यहां उन लोगों को खोजने में कोई परेशानी नहीं होगी जो आपके पास मौजूद किसी भी प्रश्न का उत्तर देने के लिए तैयार हैं।
घोटी

9
@ghoti यह वास्तव में भ्रामक है, क्योंकि स्थानीय और दूरस्थ मशीनें सापेक्ष हैं। जब मैं वर्कप्लेस पर बैठता हूं तो मेरा होम कंप्यूटर रिमोट होता है, जब मैं घर पर बैठता हूं, तो वर्कप्लेस कंप्यूटर रिमोट होता है। टनलिंग की बात करते समय सर्वर और क्लाइंट भी भ्रमित होते हैं। उदाहरण के लिए, यदि मैं ssh -R के साथ काम से घर से जुड़ता हूं। मैं लोकलहोस्ट को कनेक्ट करके होम कंप्यूटर से अपने काम से जुड़ता हूं। इसलिए सॉकेट के नजरिए से सर्वर होम कंप्यूटर ही है। लेकिन तार्किक रूप से मैं अपने काम के कंप्यूटर से जुड़ा था। वह भ्रामक है।
कैलमेरियस

357

मैंने कुछ रेखाचित्र खींचे हैं

मशीन, जहां ssh टनल कमांड टाइप की जाती है, उसे »आपका होस्ट« कहा जाता है ।

ssh सुरंग स्थानीय से शुरू होती है


ssh सुरंग रिमोट से शुरू होती है

परिचय

  1. स्थानीय: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHostका अर्थ है: ssh के साथ कनेक्ट करें connectToHost, और स्थानीय सभी कनेक्शन प्रयासों को आगे बुलाया मशीन पर sourcePortपोर्ट onPortकरने के लिए forwardToHost, जिसे connectToHostमशीन से पहुँचा जा सकता है ।

  2. दूरस्थ: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHostका अर्थ है: ssh के साथ कनेक्ट connectToHost, और आगे के लिए सभी कनेक्शन प्रयासों को रिमोट sourcePort करने के लिए onPortबुलाया मशीन पर पोर्ट forwardToHost, जिसे आपके स्थानीय मशीन से पहुँचा जा सकता है।

अतिरिक्त विकल्प

  • -f यह प्रमाणित होने के बाद खुद को पृष्ठभूमि के लिए ssh बताता है, इसलिए आपको सुरंग के जीवित रहने के लिए रिमोट सर्वर पर कुछ चलाने के लिए बैठने की ज़रूरत नहीं है।
  • -Nकहते हैं कि आप SSH कनेक्शन चाहते हैं, लेकिन आप वास्तव में कोई दूरस्थ कमांड नहीं चलाना चाहते हैं। यदि आप जो भी निर्माण कर रहे हैं वह एक सुरंग है, तो इस विकल्प को शामिल करने से संसाधनों की बचत होती है।
  • -T छद्म ट्टी आवंटन को अक्षम करता है, जो उचित है क्योंकि आप एक इंटरैक्टिव शेल बनाने की कोशिश नहीं कर रहे हैं।

आपका उदाहरण

तीसरी छवि इस सुरंग का प्रतिनिधित्व करती है। लेकिन नीला कंप्यूटर जिसे आपका होस्ट कहा जाता है, वह उस कंप्यूटर का प्रतिनिधित्व करता है जहां कोई व्यक्ति ssh सुरंग शुरू करता है, इस मामले में फ़ायरवॉल मशीन।

तो, किसी को अपनी मशीन के लिए एक ssh सुरंग कनेक्शन शुरू करने के लिए कहें । कमांड को मूल रूप से दिखना चाहिए

ssh -R 12345:localhost:22 YOURIP

अब सुरंग खोली गई। अब आप कमांड के साथ सुरंग के माध्यम से फ़ायरवॉल मशीन में ssh के माध्यम से कनेक्ट कर सकते हैं

ssh -p 12345 localhost

जो localhostपोर्ट पर आपके अपने (आपकी मशीन) से कनेक्ट हो जाएगा 12345, लेकिन 12345फायरवॉल कंप्यूटर (यानी फ़ायरवॉल कंप्यूटर) के स्थानीयहोस्ट के पोर्ट 22 को पोर्ट के माध्यम से पोर्ट के लिए भेजा जाता है।


9
बहुत बढ़िया जवाब! एक प्रस्तुति में इसका उपयोग किया जाएगा।
यशायाह टर्नर

4
धन्यवाद। आपका स्वागत है। यदि आप वेक्टर इमेज (svg या pdf) चाहते हैं तो मुझे एक संदेश लिखें।
एर

1
@erik, आपने ये चित्र कैसे बनाए?
पचेरियर

31
अरे यार, काश, मैन पेज इस तरह स्पष्टीकरण होते! धन्यवाद!
लुकास पॉटरस्की

30
आपको पता है कि ? मुझे पाठ व्याख्या भी नहीं पढ़नी थी। अच्छा कार्य !
deppfx

21

ssh टनलिंग अतिरिक्त ट्रैफ़िक भेजने के लिए पहले से स्थापित ssh कनेक्शन का उपयोग करके काम करता है।

जब आप किसी दूरस्थ सर्वर से जुड़ते हैं, तो आपके पास सामान्य उपयोगकर्ता इंटरैक्शन के लिए आमतौर पर सिर्फ 1 चैनल होता है (या यदि आप STDIN / STDOUT / STDERR को अलग मानते हैं तो 3 चैनल)। किसी भी समय, स्थानीय या दूरस्थ ssh प्रक्रिया मौजूदा कनेक्शन पर अतिरिक्त चैनल खोल सकती है। ये चैनल तब सुरंग यातायात भेजते हैं / प्राप्त करते हैं। किसी भी ट्रैफ़िक को भेजते या प्राप्त करते समय, ssh प्रक्रिया बस कहती है "यह ट्रैफ़िक चैनल फ़ॉबोर के लिए है"।

यह अनिवार्य रूप से इस तरह काम करता है:

  1. आप ssh को पोर्ट XXXX पर सुनना शुरू करना चाहते हैं और यह है कि प्राप्त किए गए किसी भी ट्रैफ़िक को सुरंग रहित किया जाए, और फिर पोर्ट ZZZZ पर YYYY पर सेट किया जाए।
  2. स्थानीय ssh पोर्ट XXXX (आमतौर पर पर 127.0.0.1, लेकिन बदला जा सकता है) पर सुनना शुरू कर देता है।
  3. कुछ एप्लिकेशन स्थानीय मशीन पर XXXX को पोर्ट करने के लिए एक कनेक्शन खोलता है।
  4. स्थानीय ssh दूरस्थ ssh के लिए एक चैनल खोलता है और कहता है "इस चैनल पर कोई भी ट्रैफ़िक YYYY: ZZZZ को जाता है
  5. दूरस्थ ssh YYYY: ZZZZ से जुड़ता है और "ओके, चैनल खुला है" को वापस भेजता है
  6. अब स्थानीय मशीन पर XXXX को पोर्ट करने के लिए कनेक्शन के साथ भेजा जाने वाला कोई भी ट्रैफ़िक YYYY: ZZZZ द्वारा अनुमानित है।

यह प्रक्रिया आगे और पीछे दोनों सुरंगों के लिए एक समान है (उपरोक्त प्रक्रिया में केवल 'स्थानीय' और 'दूरस्थ' शब्दों को स्वैप करें)। किसी भी तरफ सुरंग शुरू हो सकती है। जब आप पहली बार ssh शुरू करते हैं तो यह भी नहीं होता है। आप सुरंग खोल सकते हैं जबकि ssh पहले से चल रहा है ( ESCAPE CHARACTERSविशेष रूप से देखें ~C)।

की भूमिका के लिए -R, -f, -L, और -N, क्या तुम सच में सिर्फ आदमी पेज से परामर्श करना चाहिए, यह आप सबसे अच्छा संभव स्पष्टीकरण देता है। लेकिन मैं उल्लेख करेंगे -Rऔर -L
-Rकनेक्शन के लिए सुनने के लिए दूरस्थ ssh को बताता है, और स्थानीय ssh को वास्तविक गंतव्य से कनेक्ट करना चाहिए। -Lकनेक्शन के लिए सुनने के लिए स्थानीय ssh को बताता है, और उस दूरस्थ ssh को वास्तविक गंतव्य से जोड़ना चाहिए।

ध्यान दें, यह एक बहुत ही कच्चा विवरण है, लेकिन आपको यह जानने के लिए पर्याप्त जानकारी देनी चाहिए कि क्या हो रहा है


16

यह एसएसएच मैनुअल में समझाया गया है, विशेष रूप से -L(स्थानीय) और -R(दूरस्थ) के बीच अंतर ।


-L

-L [bind_address:]port:host:hostport

निर्दिष्ट करता है कि स्थानीय (क्लाइंट) होस्ट पर दिए गए पोर्ट को दिए गए होस्ट और पोर्ट पर पोर्ट को अग्रेषित किया जाना है

यह स्थानीय पक्ष पर पोर्ट को सुनने के लिए एक सॉकेट आवंटित करके काम करता है, वैकल्पिक रूप से निर्दिष्ट bind_address के लिए बाध्य है।

जब भी इस पोर्ट से कनेक्शन बनाया जाता है, तो कनेक्शन को सुरक्षित चैनल पर भेज दिया जाता है, और रिमोट मशीन से पोर्ट करने के लिएhosthostport कनेक्शन बनाया जाता है

निम्नलिखित उदाहरण क्लाइंट मशीन से आईआरसी सत्र का उपयोग करता है 127.0.0.1( localhostपोर्ट 1234 से रिमोट सर्वर का उपयोग करके server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

नोट: -fविकल्प पृष्ठभूमि ssh और दूरस्थ कमांड sleep 10सेवा को शुरू करने के लिए समय की एक राशि की अनुमति देने के लिए निर्दिष्ट है जिसे ट्यून किया जाना है।

उदाहरण:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N आपके कनेक्ट होने के बाद बस वहीं लटक जाएं (आपको शेल प्रॉम्प्ट नहीं मिलेगा)

    रिमोट कमांड निष्पादित न करें।

  • -L 22000कनेक्शन आपके व्यक्तिगत, L ocal मशीन के पोर्ट 22000 पर उत्पन्न होगा

  • localhost:11000- remote.server.comयह सुनिश्चित करेगा कि सुरंग का दूसरा छोर localhostपोर्ट है11000

ssh -N -L 22000: 192.168.1.2: 11000 Remote.server.com

स्रोत: एक सचित्र गाइड, ट्यूटोरियल, कैसे-पर, ssh टनलिंग पर


-R

-R [bind_address:]port:host:hostport

निर्दिष्ट करता है कि दूरस्थ (सर्वर) होस्ट पर दिए गए पोर्ट को दिए गए होस्ट और पोर्ट को स्थानीय तरफ भेजा जाना है

यह portरिमोट साइड पर सुनने के लिए एक सॉकेट आवंटित करके काम करता है , और जब भी इस पोर्ट से कनेक्शन बनाया जाता है, तो कनेक्शन को सुरक्षित चैनल पर अग्रेषित किया जाता है, और स्थानीय मशीन से पोर्ट के लिएhosthostport कनेक्शन बनाया जाता है

उदाहरण:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N आपके कनेक्ट होने के बाद बस वहीं लटक जाएं (आपको शेल प्रॉम्प्ट नहीं मिलेगा)

    रिमोट कमांड निष्पादित न करें।

  • -R22000 कनेक्शन R emote कंप्यूटर के पोर्ट 22000 पर उत्पन्न होगा (इस मामले में, Remote.server.com)

  • localhost:11000आपका व्यक्तिगत, स्थानीय कंप्यूटर सुनिश्चित करेगा कि सुरंग का दूसरा छोर localhostपोर्ट है11000

ssh -N -R 22000: localhost: 11000 Remote.server.com

स्रोत: एक सचित्र गाइड, ट्यूटोरियल, कैसे-पर, ssh टनलिंग पर


6
कान और मुंह यह स्पष्ट करते हैं कि कौन बात कर रहा है और कौन सुन रहा है!
Thufir

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