मैं कनेक्टिंग कंप्यूटर से रिवर्स SSH कनेक्शन को कैसे कॉन्फ़िगर कर सकता हूं?


20

मैं निकट भविष्य में कई मशीनों की तैनाती करने जा रहा हूं जो राउटर्स के पीछे होंगी। प्रत्येक राउटर और पोर्ट फ़ॉरवर्डिंग पर डायनेमिक DNS सेट करना संभव नहीं होगा, इसलिए एक तरीका है जिससे मैं इन मशीनों को अपने कंप्यूटर से टीसीपी कनेक्शन आरंभ करने के लिए कॉन्फ़िगर कर सकता हूं और फिर अपने कंप्यूटर को दूरस्थ कंप्यूटर पर SSH कनेक्शन आरंभ कर सकता हूं वह कनेक्शन?

अर्थात:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

क्या यह संभव है, और यदि हां, तो मैं यह कैसे कर सकता हूं?


2
संबंधित (यह कैसे और क्यों काम करता है): रिवर्स एसएसएच टनलिंग कैसे काम करता है?
गिलेस एसओ-

जवाबों:


21

में /etc/ssh/sshdके लिए कंप्यूटर बी सेट:

AllowTcpForwarding yes
TCPKeepAlive yes

से कंप्यूटर एक :

$ ssh -R 2222:localhost:22 ip.of.computer.b

से कम्प्यूटर बी :

$ ssh localhost -p 2222

ध्यान दें कि 2222 एक मनमाना हाई-पोर्ट नंबर है जिसे मैंने चुना था। कंप्यूटर बी पर उस पोर्ट को तब एसएसएच कनेक्शन के माध्यम से कंप्यूटर ए पर पोर्ट 22 पर आरम्भ किया जाएगा। यदि आपके पास कई मशीनें हैं तो आपको प्रत्येक मशीन के लिए एक अलग पोर्ट का उपयोग करना चाहिए।

आपके उपयोग के मामले के लिए आप संभवतः इसे एक स्क्रिप्ट से चलाना चाहेंगे ताकि आप इसे एक डेमॉन बना सकें और समय-समय पर लिंक को गिराए जाने पर फिर से कनेक्ट करने का प्रयास कर सकें। आप शायद आने वाले कनेक्शन को संभालने के लिए कंप्यूटर बी/bin/true पर शेल के साथ एक विशेष खाता चाहते हैं । फिर आप प्रत्येक मशीन के लिए एक ही कुंजी या एकाधिक कुंजी सेट कर सकते हैं जिसे "घर पर कॉल" करने की अनुमति है।

पर कंप्यूटर एक आप देख सकते हैं -n, -Nऔर -Tउपयोगी विकल्प यह स्थानीय इनपुट से डिस्कनेक्ट करने किसी भी दूरस्थ कमांड चलाने का प्रयास (इसलिए यह पृष्ठभूमि में चला सकते हैं), नहीं, बस सुरंग खोलें, और एक tty नहीं बना।

एक डेमॉन स्पॉनिंग के अधिकांश सामान्य तरीके इस तरह से एक नेटवर्क सुरंग स्थापित करने के साथ बहुत अच्छी तरह से काम नहीं करते हैं। नेटवर्क कनेक्टिविटी में एक समस्या यह दीवार को हराकर नीचे जाने की कोशिश करेगी। एक नींद के साथ एक साधारण लूप इंतजार करना चाहिए। दस मिनट एक अच्छी संख्या है क्योंकि यह नेटवर्क में बाढ़ नहीं करता है और अगर कोई समस्या (जैसे कंप्यूटर बी ऑफ़लाइन हो रहा है) में अटैक के साथ लॉग फाइल करता है, लेकिन यह अभी भी आपको बहुत जल्दी वापस मिल जाता है अगर कनेक्शन छोड़ दिया जाता है।

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

एक स्क्रिप्ट जिसे बूट पर लॉन्च किया जा सकता है /etc/rc.localकंप्यूटर ए बूट्स के लगभग दस मिनट बाद मशीन में प्रवेश करने के लिए आपका पहला बदलाव शुरू होगा ।


1
अच्छा लगा। तो मैं मूल रूप से स्थानीय मशीन पर एक बंदरगाह के लिए प्रत्येक दूरस्थ मशीन सुरंग स्थानीय SSH बंदरगाह होगा? यह समझदारी हो सकती है कि प्रत्येक मशीन में केवल मांग पर ही कनेक्शन हो। जब मैं इसे रिवर्स कनेक्शन का प्रयास करना चाहता हूं, तो प्रबंधन को आसान बनाने के लिए (और मेरे सभी बंदरगाहों को बंद करने के लिए नहीं;)। धन्यवाद!
नफ़ुली केयू

@TKKocheran: चुनने के लिए काफी कुछ बंदरगाह हैं ... विशेष रूप से अधिक से अधिक आपके पास कियोस्क होंगे। एसएसएच टनल को कैसे रखा जा रहा है, जो http कनेक्शन को खुला रखने से भी बदतर है?
कालेब

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

1
@TKKocheran: आपको मैपिंग किसी भी तरह से करनी होगी, अन्यथा यहां तक ​​कि आपकी आलसी तात्कालिकता उन परिस्थितियों में भी चलेगी जहां उन्होंने प्रत्येक अभिभावक को लुभाने की कोशिश की थी।
कालेब

1
मुझे नहीं पता कि यह आम तौर पर लागू होता है, लेकिन मेरा sshd कॉन्फिग अब पर है/etc/ssh/sshd_config
gc5
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.