पोर्ट टनलिंग उल्टा


59

मुझे कल किसी को अपने स्थानीय मशीन पर चलने वाली वेबसाइट दिखाने की आवश्यकता है। आम तौर पर मैं इसे अपने स्थानीय राउटर पर पोर्ट अग्रेषण द्वारा पूरा करता हूं, लेकिन हार्डवेयर को विफल करने के लिए धन्यवाद और इसका प्रतिस्थापन भयानक है, मेरा वर्तमान राउटर मुझे पोर्ट अग्रेषण करने की अनुमति नहीं देता है।

तो इस देरी के साथ अटक गया और पूरी चीज को एक उचित सर्वर पर धकेलना नहीं चाहता था, मेरे पास एक पागल विचार था: क्या मैं एसएसएच के ऊपर एक बाहरी सर्वर पर अपने पोर्ट को आगे बढ़ा सकता हूं?

मैंने पहले भी पोर्ट टनलिंग किया है लेकिन मैं आमतौर पर इसे सही तरीके से करता हूँ:

  • मैं एक रिमोट बॉक्स से जुड़ता हूं और पूछता हूं कि पोर्ट 12345 मेरी लोकल मशीन में पोर्ट 12345 पर दिखाता है।
  • मैं दूरस्थ मशीन पर P12345 पर कुछ शुरू करता हूं
  • मैं इसे लोकलहोस्ट के जरिए एक्सेस कर सकता हूं: 12345

मुझे क्या करना है:

  • एक दूरस्थ पीसी से कनेक्ट करें और पूछें कि इसका स्थानीय P12345 मेरे स्थानीय P12345 (सुरंग के ऊपर) से चीजें प्राप्त करता है
  • मैं P12345 पर अपने स्थानीय कंप्यूटर पर कुछ शुरू करता हूं
  • अन्य लोग रिमोट एक्सेस कर सकते हैं: 12345 और मेरा लोकलहोस्ट देखें: 12345

जवाबों:


96

localhostपोर्ट 8000 पर दूरस्थ होस्ट के लिए आपके स्थानीय मशीन ( ) से पोर्ट 80 को अग्रेषित करने की कमान है:

ssh -R 8000:localhost:80 oli@remote-machine

इसके लिए SSH सर्वर पर एक अतिरिक्त ट्विस्ट की आवश्यकता होती है, लाइनों को इसमें जोड़ें /etc/ssh/sshd_config:

Match User oli
   GatewayPorts yes

इसके बाद, सर्वर निष्पादित करके कॉन्फ़िगरेशन को फिर से लोड करें sudo reload ssh

सेटिंग GatewayPorts yesवाइल्डकार्ड पते पर पोर्ट 8000 को बाँधने के लिए SSH का कारण बनता है, इसलिए यह remote-machine( remote-machine:8000) के सार्वजनिक पते पर उपलब्ध हो जाता है ।

यदि आपको वाइल्डकार्ड पते पर सब कुछ बाध्यकारी नहीं करने का विकल्प है, तो बदल GatewayPorts yesदें GatewayPorts clientspecified। क्योंकि sshडिफ़ॉल्ट रूप से लूपबैक पते पर बांधता है, आपको bind_addressवाइल्डकार्ड पते को बाइंड करने के लिए एक खाली निर्दिष्ट करने की आवश्यकता होती है :

ssh -R :8000:localhost:80 oli@remote-machine

:पहले 8000अनिवार्य करता है, तो है GatewayPortsपर सेट है clientspecifiedऔर आप के लिए सार्वजनिक उपयोग की अनुमति देना चाहते remote-machine:8000

प्रासंगिक मैनुअल अंश:

ssh (1)

-R [bind_address:] port: host: hostport यह
निर्दिष्ट करता है कि रिमोट (सर्वर) होस्ट पर दिए गए पोर्ट को दिए गए होस्ट और पोर्ट को स्थानीय तरफ भेजा जाना है। यह रिमोट साइड पर पोर्ट को सुनने के लिए सॉकेट आवंटित करके काम करता है, और जब भी इस पोर्ट से कनेक्शन बनाया जाता है, तो कनेक्शन को सुरक्षित चैनल पर अग्रेषित किया जाता है, और स्थानीय मशीन से पोर्ट होस्टपोर्ट होस्ट करने के लिए कनेक्शन बनाया जाता है। डिफ़ॉल्ट रूप से, सर्वर पर सुनने वाला सॉकेट केवल लूपबैक इंटरफ़ेस के लिए बाध्य होगा। इसे एक bind_address निर्दिष्ट करके ओवरराइड किया जा सकता है। एक खाली bind_address, या '*' पता, इंगित करता है कि रिमोट सॉकेट को सभी इंटरफेस पर सुनना चाहिए। दूरस्थ bind_address निर्दिष्ट करना केवल तभी सफल होगा जब सर्वर का GatewayPorts विकल्प सक्षम हो (sshd_config (5) देखें)।

sshd_config (5)

GatewayPorts
निर्दिष्ट करता है कि दूरस्थ होस्ट को क्लाइंट के लिए अग्रेषित पोर्ट से कनेक्ट करने की अनुमति है या नहीं। गेटवेपोर्ट्स का उपयोग यह निर्दिष्ट करने के लिए किया जा सकता है कि sshd को दूरस्थ पोर्ट अग्रेषण को गैर-लूपबैक पतों पर बाँधने की अनुमति देनी चाहिए, इस प्रकार अन्य होस्ट को कनेक्ट करने की अनुमति मिलती है। दूरस्थ होस्ट के लिए उपलब्ध पोर्ट बल को अग्रेषित करने के लिए तर्क 'नहीं' हो सकता है, वाइल्डकार्ड पते पर बाँधने के लिए रिमोट पोर्ट फ़ॉरवर्डिंग के लिए बाध्य करने के लिए 'हाँ' या क्लाइंट को उस पते का चयन करने की अनुमति देने के लिए 'क्लासिफ़ीकाइज्ड' अग्रेषण बाध्य है। डिफ़ॉल्ट 'नहीं' है।

यह सभी देखें:


7
GatewayPortsयहाँ जादू की गोली थी। मुझे पसंद है कि आपको एक ऐसा संस्करण मिला है जो मुझे कुछ उपयोगकर्ताओं के लिए इस शक्तिशाली तकनीक को सीमित करने की अनुमति दे सकता है।
ओली

1
जो मुझे भ्रमित कर रहा था, वह यह था कि गेटवेपॉर्ट्स को मशीन पर सेट किया जाना चाहिए जो रिवर्स सुरंग (स्थानीय) को आरंभ करने के लिए वास्तविक ssh कमांड चलाता है। मेरे मन में यह बात कहीं अधिक तार्किक थी कि दूसरे छोर (रिमोट) के साथ कनेक्शन स्वीकार करने के लिए सौदा होगा, क्योंकि आप जहां से जुड़ते हैं और जहां से पुनः निर्देशित होते हैं। मुझे लगता है कि चारों ओर पाने के लिए उम्र ले लिया।
Ars Magika

2
@ArsMagika मुझे यकीन नहीं है अगर मैं आपको समझ रहा हूँ। गेटवेपोर्ट्स को एसएसएच सर्वर पर सेट किया जाना चाहिए, न कि आपके स्थानीय मशीन पर जो sshकमांड चलाता है । यह कॉन्फ़िगर करता है कि क्या अन्य क्लाइंट सर्वर पर अग्रेषित पोर्ट से संवाद कर सकते हैं।
लेकेन्स्टाइन

इस समाधान के नीचे: आप वेब सर्वर के एक्सेस लॉग में क्लाइंट के आईपी पते को निर्धारित करने की क्षमता खो देते हैं। उस उपद्रव को भी हल करने का कोई उपाय?
Twonky

@Twkyky यदि आपको क्लाइंट का सटीक आईपी पता जानने की आवश्यकता नहीं है (बस यह कि यह रिमोट था और "लोकलहोस्ट" नहीं), और आपका स्थानीय सर्वर वाइल्डकार्ड एड्रेस (यानी किसी भी पते से कनेक्शन स्वीकार करना) पर सुन रहा है, तब आप -R :8000:127.0.1.1:80(या किसी अन्य 127.x.x.xपते) को अग्रेषित करने का प्रयास कर सकते हैं । अन्यथा, नहीं, आप दूरस्थ IP पता नहीं सीख पाएंगे।
लेकेन्सटाइन

14

यदि सर्वर है GatewayPorts no, तो आप क्लाइंट पर कमांड निष्पादित ssh -g -L 8001:localhost:8000 oli@remote-machineकरने के बाद सर्वर पर निष्पादित करके उसी परिणाम को प्राप्त कर सकते हैं ssh -R। यह पोर्ट 8001 पर सभी इंटरफेस पर सुलभ सर्वर पर लूपबैक पोर्ट 8000 बनाएगा।

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