एक मशीन से दूसरे मशीन में पोर्ट कैसे फॉरवर्ड करें?


19

निम्नलिखित स्थिति पर विचार करें:

मेरे घर पर, मेरे पास एक राउटर (जो इंटरनेट से जुड़ा है), सर्वर (एस) और मेरी मुख्य मशीन (एम) है। एस इंटरनेट से पहुंच योग्य है (इसमें स्थिर आईपी है), और यह 24/7 है, जबकि एम नहीं है।

कभी-कभी, मैं कुछ ऐप बनाना चाहता हूं (जो एम पर कुछ पोर्ट को सुनता है, उदाहरण के लिए 8888) बाहरी इंटरनेट से सुलभ।

उसके लिए, मैं M के पोर्ट 8888 पर फॉरवर्ड करने के लिए S (2222) पर कुछ पोर्ट सेट करना चाहता था, ताकि S: 2222 को एक्सेस करने वाले को ऐसा लगे कि वह M: 8888 को एक्सेस कर रहा है।

मैंने ssh पोर्ट फ़ॉरवर्डिंग का उपयोग करने की कोशिश की, मेरा सर्वश्रेष्ठ प्रयास इस प्रकार था:

ssh -L 2222:M:8888 -N M

लेकिन यह केवल मुझे सर्वर से 2222 पोर्ट का उपयोग करने की अनुमति देता है, अन्य मशीनों से नहीं।

क्या इसे ठीक से करने का कोई तरीका है? अधिमानतः, मैं चाहूंगा कि यह एक साधारण कमांड हो, जिसे मैं ^ C के साथ शुरू करने और बंद करने में सक्षम होऊंगा जब मुझे अब आगे की आवश्यकता नहीं है।


Localhost.run आज़माएं जो एक ऐसी वेबसाइट है जिसे आप localhost.run पर प्राप्त कर सकते हैं। मुझे लगता है कि आपके उत्पाद को वहाँ लाने का एक तरीका है ..
Angelena Neilsomt

जवाबों:


16

हां, इसे GatewayPortsएसएसएच में कहा जाता है। इसका एक अंश ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

और आप फ़ॉरवर्डिंग के localhostबजाय उपयोग कर सकते हैं M, जैसा कि आप उसी मशीन को अग्रेषित कर रहे हैं जैसे कि आप SSH-ing को - यदि मैं इस प्रश्न को सही ढंग से समझता हूं।

तो, कमांड यह बन जाएगा:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

और इस तरह दिखेगा netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

अब पोर्ट 2222 टीसीपी पर इस मशीन को एक्सेस करने वाला कोई भी व्यक्ति वास्तव में लोकलहोस्ट से बात करेगा: 8888 जैसा कि मशीन एम में देखा गया है। ध्यान दें कि यह एम के 8888 पोर्ट को सादे अग्रेषण के समान नहीं है।


1
धन्यवाद! यह काम करता है! लेकिन कुछ विचित्रता है - किसी कारण के लिए, आउटपुट में लाइन "बाइंड: एड्रेस पहले से उपयोग में है" है। इसका क्या मतलब हो सकता है?
रोज डेच

1
आपके पास उस पोर्ट पर पहले से ही कुछ प्रक्रिया चल रही है। netstatवास्तव में क्या है, यह जानने के लिए उसी कमांड का उपयोग करें । संभवतः इसी तरह की एक और एसएसएच अभी भी पृष्ठभूमि में चल रही है और पीआईडी ​​नेटस्टैट का उपयोग करके इसे आपको बताती है।
gertvdijk

मजेदार बात यह है कि मैंने पहले से ही ऐसा किया है - एस और एम दोनों पर उन बंदरगाहों पर कोई प्रक्रिया नहीं होती।
दुष्ट

10

एक और तरीका है। आप iptables के साथ S: 2222 से W: 8888 तक पोर्ट फॉरवर्डिंग सेट कर सकते हैं। एकल आदेश:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

जहाँ 1.2.3.4 M का IP पता है। इसे NAT (नेटवर्क एड्रेस ट्रांसलेशन) कहा जाता है।


1
जैसा कि आप यहां केवल NAT (गंतव्य स्रोत NAT के विपरीत) कर रहे हैं, यह केवल विशिष्ट परिस्थितियों में मज़बूती से काम करेगा और रूटिंग टेबल को संशोधित करने की आवश्यकता हो सकती है। होस्ट (एस) पर चलने वाली आभासी मशीनों (एम) को अग्रेषित करने के लिए, यह अच्छी तरह से काम कर सकता है, हालांकि।
gertvdijk

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

यदि S और M एक ही LAN पर हैं, तो आपको पोर्ट फॉरवर्डिंग की आवश्यकता नहीं है, क्योंकि उनके बीच कोई ट्रैफिक गेटवे नहीं गुजरता है।
gertvdijk

1
हां, लेकिन M: 8888 से कनेक्ट करना इंटरनेट से बना है, मुझे लगता है। कोई व्यक्ति इंटरनेट बनाता है -> S: 2222 -> M और S LAN रूटर के साथ iptables -> M: 8888
Gevial

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