Ssh टनल को जनता के लिए खुला कैसे बनाया जाए?


172

खैर, इस सवाल का जिक्र करते हुए , मैं कमांड चला रहा हूं

ssh -R 8080:localhost:80 -N root@example.com

एक मैक पर। फिर भी जिस बंदरगाह पर सुरंग बनाई जा रही है वह सार्वजनिक रूप से काम नहीं कर रहा है। मैं इसे बनाने के लिए ऐसी कमांड चला रहा हूं ताकि स्थानीय पोर्ट को दूरस्थ कंप्यूटर पर खोला जा सके। और यह दूरस्थ कंप्यूटर पर लोकलहोस्ट पर पोर्ट को खोलने पर काम करता है, लेकिन जब मैं अपने स्थानीय कंप्यूटर से दूरस्थ कंप्यूटर के सार्वजनिक आईपी पते तक पहुंचने का प्रयास करता हूं तो पोर्ट खुला नहीं लगता है। किसी को भी एक्सेस करने के लिए मैं आईपी पर सुरंग को कैसे सार्वजनिक करूंगा?

EDIT: ऐसा लगता है जैसे रिमोट साइड सभी इंटरफेस के बजाय केवल लोकलहोस्ट पर बांधता है।

EDIT 2: क्लाइंट मैक ओएस एक्स 10.6 है और सर्वर लिनक्स मिंट है, लेकिन वे दोनों ओपनएसएसएच हैं।


सार्वजनिक आईपी का क्या अर्थ है? यदि आप राउटर के माध्यम से और इंटरनेट के माध्यम से एक स्थानीय कंप्यूटर से कनेक्ट करने का प्रयास कर रहे हैं, तो अधिकांश राउटर ऐसे लूपबैक की अनुमति नहीं देंगे।
harrymc

जवाबों:


344

यदि आप ssh के लिए मैन पेज की जांच करते हैं, तो आप पाएंगे कि सिंटैक्स -Rरीड के लिए है:

-R [ bind_address :] port : host : hostport

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

ssh -R \*:8080:localhost:80 -N root@example.com

या

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

या

ssh -R "[::]:8080:localhost:80" -N root@example.com

पहला संस्करण व्यक्तिगत रूप से सभी इंटरफेस को बांधता है। दूसरा संस्करण एक सामान्य IPv4- केवल बाइंड बनाता है, जिसका अर्थ है कि पोर्ट IPv4 के माध्यम से सभी इंटरफेस पर उपलब्ध है। तीसरा संस्करण संभवतः तकनीकी रूप से पहले के बराबर है, लेकिन फिर से यह केवल एक बाइंड बनाता है ::, जिसका अर्थ है कि पोर्ट आईपीवी 6 के माध्यम से और आईपीवी 4 के माध्यम से आईपीवी 4-मैप किए गए आईपीवी 6 पतों (विंडोज, ओपनबीएसडी पर काम नहीं करता है) के माध्यम से सुलभ है। । (आपको उद्धरण चिह्नों की आवश्यकता है क्योंकि [::]एक ग्लोब के रूप में अन्यथा व्याख्या की जा सकती है।)

ध्यान दें कि यदि आप OpenSSH sshdसर्वर का उपयोग करते हैं , तो सर्वर के GatewayPortsविकल्प को काम करने के लिए सक्षम (सेट yesया clientspecified) होना चाहिए ( /etc/ssh/sshd_configसर्वर पर फ़ाइल की जांच करें)। अन्यथा (इस विकल्प के लिए डिफ़ॉल्ट मान है no), सर्वर हमेशा पोर्ट को केवल लूपबैक इंटरफ़ेस पर बाध्य होने के लिए मजबूर करेगा।


11
ओह मेरे भगवान काम किया !!!!! मैंने ठीक 1 बार ऐसा किया है !! मैं बस भूल गया कि *बैश में फाइलें देगा और मुझे ज़रूरत थी\*
ट्रेवर रूडोल्फ

4
हाँ, यही कारण है कि मैं हमेशा पसंद करता हूं 0.0.0.0- यह केवल IPv4 है, लेकिन यह ज्यादातर समय करेगा :)
स्टीफन सेडेल

32
गेटवेपोर्ट्स ने मेरी समस्या का समाधान किया।
Sunry

4
GatewayPorts = Yes (रिमोट sshd config पर) ने इसे मेरे लिए भी तय कर दिया है
Phil_1984_

3
"गेटवेपोर्ट्स हो" ने मेरा दिन बना दिया, धन्यवाद @StefanSeidel
karser

37

संपादित करें:

-g स्थानीय अग्रेषित पोर्ट के लिए काम करता है, लेकिन आप जो चाहते हैं वह एक रिवर्स / रिमोट फॉरवर्ड पोर्ट है, जो अलग है।

आप जो चाहते हैं, वह यह है

अनिवार्य रूप से, चालू example.com, सेट किया GatewayPorts=clientspecifiedगया /etc/ssh/sshd_config

--- पिछला (गलत) उत्तर ---

-G विकल्प का उपयोग करें। Ssh के मैन पेज से:

-g     Allows remote hosts to connect to local forwarded ports.

काम नहीं लगता ... यह शुरू होता है, लेकिन मैं दूर से कनेक्ट नहीं कर सकता
ट्रेवर रूडोल्फ

2
netstat -elnptयह पता लगाने के लिए कि किस पोर्ट से बंधे हैं, यह पता लगाने के लिए एक अलग ट्टी से दौड़ने की कोशिश करें । बिना -g, एक बंदरगाह के लिए बाध्य होना चाहिए 127.0.0.1:PORT। इसके साथ -g, इसे बाध्य किया जाना चाहिए 0.0.0.0:PORT, जो इसे दूर से सुलभ बनाता है।
स्नैपशॉट


2
GatewayPorts=clientspecifiedयाGatewayPorts clientspecified
ट्रेवर रूडोल्फ

और क्या मैं इसे क्लाइंट या रिमोट से जोड़ता हूं?
ट्रेवर रुडोल्फ

14

यहाँ मेरा जवाब पूरा होने के लिए है:

मैंने नेटवर्क ट्रैफ़िक को पुनर्निर्देशित करने के ssh -R ...लिए टनलिंग के लिए और इसके socatशीर्ष पर उपयोग करके समाप्त किया 127.0.0.1:

सुरंग 127.0.0.1 से बंधी: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

अन्य विकल्प यह है कि उसके ऊपर एक स्थानीय केवल सुरंग बनाई जाए, लेकिन मुझे यह बहुत धीमा लगता है

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


मुझे यह तथ्य पसंद है कि मुझे sshd विन्यास से निपटना नहीं है और यह कि मैं यह सब सुडो के बिना कर सकता हूं। साथ ही मैं सीखता हूं कि समाज मौजूद है। धन्यवाद!
ब्रूटसैट

+ ऊपर तुम अच्छे जाते हो सर। मैंने ssh को बिना सफलता के 0.0.0.0 बाँधने के लिए कहने की कोशिश की .. फिर * सिंटैक्स देखा, कोशिश की, कोई पासा नहीं। मुझे लगता है कि यह sshd config पर कुछ सुरक्षा सुविधा या ऐसा कुछ हो सकता है जो इसे अनुमति नहीं दे रहा है। अंत में इस पोस्ट को देखा और socatकमाल का काम किया। सुपर उपयोगी, इसे मेरी पीठ की जेब में डालकर]]
जयम

10

यदि आप जीत गए या बदल सकते हैं / etc / ssh / sshd_config, तो आप एक डबल फ़ॉरवर्ड का भी उपयोग कर सकते हैं।

रिमोट मशीन पर लूपबैक डिवाइस पर पहले अस्थायी पोर्ट (जैसे 10080) के लिए आगे, फिर सभी इंटरफेस पर पोर्ट 10080 से 80 पर पुनर्निर्देशित करने के लिए वहां स्थानीय फॉरवर्ड का उपयोग करें:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
यह वास्तव में अग्रेषण नियमों को बायपास करने के लिए काम करता है!
माइकल शुबर्ट

इस घोल से प्यार करें। महान परिवर्तन जब आप मशीन पर कॉन्फ़िगरेशन को बदलना नहीं चाहते हैं
ग्रीज़ो

8

"गेटवे पोर्ट्स" विकल्प का उपयोग करें।

ssh -g -R REMOTE_PORT:HOST:PORT ...

इसका उपयोग करने के लिए, आपको संभवतः GatewayPorts yesअपने सर्वर में " " जोड़ना होगा /etc/ssh/sshd_config


वास्तव में यह काम किया। मैं क्या करता हूं कि मैं अपने REST सर्वर के फारवर्डर के रूप में EC2 इंस्टेंस का उपयोग करता हूं। इस तरह, मुझे DMZ में अपने सर्वर को छड़ी करने की आवश्यकता नहीं है और मुझे सार्वजनिक आईपी की आवश्यकता नहीं है। मेरे द्वारा बनाए गए पहले EC2 उदाहरण के साथ काफी मजेदार, ssh -R रिमोट_पोर्ट: लोकलहोस्ट: port xxx @ ec2xxx ने ठीक काम किया, लेकिन फिर मुझे किसी कारण से बाद में एक और उदाहरण बनाना पड़ा और उस बिंदु से, मुझे हमेशा मिल रहा था, कनेक्शन: मना कर दिया। मैं क्या देख रहा था और ज्यादा जानकारी नहीं थी, यह देखने के लिए tcpdump का उपयोग किया। -जी प्लस गेटवेपोर्ट्स ने चाल चली।
ईटी

1

जंप मेजबान ओपनएसएसएच के लिए हाल के अतिरिक्त हैं। इसके लिए मध्यवर्ती तक SSH की आवश्यकता होती है, लेकिन अतिरिक्त कॉन्फ़िगरेशन के बिना काम करना चाहिए।

ssh -J root@example.com remoteuser@localhost -p 8080

यह कमांड SSH को निर्देश देता root@example.comहै कि वह पहले उस मशीन से, और फिर उस मशीन से, 8080 पोर्ट पर एक कनेक्शन शुरू करने के लिए localhost(यानी, वह पोर्ट जो जम्प होस्ट से रिमोट होस्ट के लिए सुरंग में है) remoteuserउपयोगकर्ता नाम के तहत ।


0

यदि आप ~/.ssh/configकमांड लाइन मापदंडों का उपयोग करने के बजाय आप में कॉन्फ़िगरेशन डालना चाहते हैं , तो आप कुछ इस तरह की कोशिश कर सकते हैं

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

याद रखें कि आपके पास दूरस्थ होस्ट का फ़ायरवॉल 8080 से कनेक्शन की अनुमति देता है और यह सुनिश्चित करता है कि GatewayPortsआपके /etc/ssh/sshdकॉन्फ़िगरेशन का विकल्प सेट नहीं हैno

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