एक स्थानीय बंदरगाह से दूसरे में सुरंग बनाने का सरल तरीका?


76

मेरे पास एक विकास सर्वर है, जो केवल 127.0.0.1:8000 से सुलभ है, न कि 192.168.1.x: 8000। एक त्वरित हैक के रूप में, क्या किसी अन्य पोर्ट (जैसे, 8001) पर सुनने के लिए कुछ सेट करने का एक तरीका है ताकि स्थानीय नेटवर्क से मैं 192.168.1.x: 8001 कनेक्ट कर सके और यह क्लाइंट और 127.0 के बीच ट्रैफ़िक को टनल करेगा। .0.1: 8000?


4
netcat यह कर सकता है।
एंडी

जवाबों:


44

Ssh का उपयोग करना सबसे आसान उपाय है।

ssh -g -L 8001: localhost: 8000 -f -N user@remote-server.com

यह आपके पोर्टवर्क पर स्थानीय पोर्ट 8001 को दूरस्थ-server.com पोर्ट 8000 पर लोकलहोस्ट एड्रेस पर फॉरवर्ड करता है।
-gइसका मतलब है कि मेरे नेटवर्क पर अन्य क्लाइंट को मेरे वर्कस्टेशन पर पोर्ट 8001 से कनेक्ट करने की अनुमति है। अन्यथा आपके वर्कस्टेशन पर केवल स्थानीय क्लाइंट ही फॉरवर्ड किए गए पोर्ट से जुड़ सकते हैं।
-Nइसका मतलब है कि मैं जो कुछ कर रहा हूं, वह बंदरगाहों को अग्रेषित कर रहा है, एक शेल शुरू न करें।
-fएक सफल SSH कनेक्शन और लॉग-इन के बाद पृष्ठभूमि में कांटा का मतलब है।
पोर्ट 8001 कई कनेक्शनों के लिए खुला रहेगा, जब तक ssh की मृत्यु नहीं हो जाती है। यदि आप विंडोज पर होते हैं, तो उत्कृष्ट SSH क्लाइंट PuTTY भी ऐसा कर सकता है। 8001 को स्थानीय पोर्ट और लोकलहोस्ट के रूप में उपयोग करें: 8000 और गंतव्य और सेटिंग्स में एक स्थानीय पोर्ट अग्रेषण जोड़ें। आप इसे PuTTY के साथ एक सफल कनेक्ट के बाद जोड़ सकते हैं।


4
क्या करता user@remote-server.comहै? यह निश्चित रूप से पोर्ट फ़ॉरवर्डिंग के लिए अनावश्यक है, हालांकि ssh जनादेश इस तर्क, अधिक से अधिक, यह वहाँ कनेक्ट करने की कोशिश करता है। और इस पेसमेकी विकल्प को होस्टनाम में सेट करने पर यह आउटपुट करता है …port 22: Connection refused (नहीं, मैंने 22 पोर्ट का उपयोग नहीं किया था) । जब तक मैं कुछ याद नहीं कर रहा हूँ, कमांड स्पष्ट रूप से काम नहीं करता है।
हाय-एंजेल

@ हाय-एंजेल user@remote-server.comसिर्फ एक उदाहरण है और आपको इसे शाब्दिक रूप से नहीं लेना चाहिए। आपको इसे उस कंप्यूटर के नाम से बदलना होगा जिसे आप इस कंप्यूटर पर और अपने उपयोगकर्ता नाम से कनेक्ट करना चाहते हैं। यह जानकारी ssh कनेक्शन स्थापित करने के लिए आवश्यक है। Ssh कनेक्शन स्थापित होने के बाद ही बंदरगाहों को इस कनेक्शन के माध्यम से भेजा जा सकता है।
पियोत्र डोब्रोगोस्ट

आप बंदरगाह बूट से उपलब्ध हो करना चाहते हैं तो एक systemd सेवा में "autossh" देख उपरोक्त विधि का उपयोग कर - everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh
रिचर्ड होलिस

मुझे "कनेक्शन से इनकार" भी मिलता है। और मुझे अभी भी समझ में नहीं आया कि जब SSH कनेक्शन शामिल नहीं है (-N के अनुसार) तो user@remote-server.com तर्क की आवश्यकता क्यों है। सिर्फ आगे के पैकेट चाहिए।
अलेक्जेंडर टेलर

2
@AlexanderTaylor का -Nमतलब यह नहीं है कि कोई SSH कनेक्शन नहीं है। इसका सीधा सा मतलब है do not execute a remote command( मैन पेज देखें )। <user>@<host>क्योंकि इस तर्क, जरूरी है कि करता है के लिए एक SSH कनेक्शन खोलने <host>(जो ओ पी के मामले के लिए किया जाएगा localhost), और वांछित बंदरगाह अग्रेषित करता है के माध्यम से है कि SSH सुरंग। यह ओपी की समस्या का एक समाधान है, लेकिन सबसे सरल नहीं। Ssh का उपयोग किए बिना लोकलहोस्ट को फॉरवर्ड करने के लिए, आप socatnetcat

94

साथ socatसर्वर पर:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

डिफ़ॉल्ट रूप से, socatमशीन पर किसी भी आईपीवी 4 या आईपीवी 6 पते (यदि समर्थित हो) पर टीसीपी पोर्ट 8001 पर सुनेंगे। आप की जगह आईपीवी 4/6 के लिए सीमित कर सकते हैं tcp-listenके साथ tcp4-listenया tcp6-listenएक जोड़कर, या एक विशिष्ट स्थानीय पता करने के लिए ,bind=that-address

जोड़ने सॉकेट आप के लिए प्रॉक्सी रहे हैं के लिए एक ही है, तो आप के स्थान पर किसी भी पते का उपयोग कर सकते localhostहैं, और की जगह tcpके साथ tcp4या tcp6यदि आप आईपीवी 4 या IPv6 पतों को पता संकल्प प्रतिबंधित करना चाहते हैं।

ध्यान दें कि सर्वर पोर्ट 8000 पर सुनने के लिए, कनेक्शन प्रॉक्सी (के मामले में से आ रही रूप में दिखाई देगा localhost, कि हो जाएगा localhost), नहीं मूल ग्राहक। आपको सर्वर के लिए डीएनएटी एप्रोच (लेकिन सुपरसुसर विशेषाधिकारों की आवश्यकता है) का उपयोग करने की आवश्यकता होगी जो यह बता सके कि ग्राहक कौन है।


1
धन्यवाद, यह बहुत अच्छा है क्योंकि आपके पास स्थानीय ssh सर्वर नहीं होना चाहिए।
15:15

क्या मैं एक ही पोर्ट लेकिन अलग पते का उपयोग कर सकता हूं?
आमोस

@amos, संपादित देखें।
स्टीफन चेज़लस

क्या केवल विशिष्ट आईपी से ही ट्रैफ़िक को अग्रेषित करना संभव होगा?
फेट

1
@Phate, देख socat बताओ एक ही आईपी पते से कनेक्शन को सुनने के लिए (और rangeऔर tcpwrapमें विकल्पों socatआदमी पृष्ठ)।
स्टीफन चेज़ेलस

46

पारंपरिक ncका उपयोग करना सबसे आसान उपाय है:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

यह संस्करण उबंटू ncके netcat-traditionalपैकेज में है। (आपको update-alternativesइसे कॉल या कॉल करना होगा nc.traditional।)

ध्यान दें कि ssh के विपरीत यह एन्क्रिप्टेड नहीं है। इसे ध्यान में रखें यदि आप इसे एक मेजबान के बाहर उपयोग करते हैं।


2
किसी को भी बराबर पता है netcat-openbsd?
श्रीधर सरनोबत

2
के लिए एनालॉग netcatसंस्करण में शामिल है busybox: nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000। (
परमों

2
कार्य करना, लेकिन ncपहले रिमोट कनेक्शन के बाद कमांड समाप्त हो जाती है। -kयदि आपको इसे चालू रखने की आवश्यकता है तो जोड़ें ।
शोपाजो डे एरिएरेज

मुझे यह त्रुटि मिल रही है: nc: cannot use -p and -lCentOS 6.4 पर। क्या आसपास कोई काम है?
निक प्रिडी

मैं ssh एक पर इस समाधान को पसंद करता हूं क्योंकि यह रूट के रूप में उपयोग करना आसान बनाता है, जब किसी को एक विशेषाधिकार प्राप्त पोर्ट को स्थानीय रूप से अग्रेषित करने की आवश्यकता होती है।
क्रिश्चियन

24

OpenBSD netcat लिनक्स पर डिफ़ॉल्ट रूप से और OS X पर भी उपलब्ध है।

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

लिनक्स:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

एक विकल्प जो ओएस एक्स बैश पर काम करता है वह एक द्विदिश पाइप का उपयोग करना है । यह अन्य यूनिक्स पर काम कर सकता है:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0

मैंने पहली बार ध्यान नहीं दिया कि आप ओपनबर्ड नेटसेट का उपयोग कर रहे थे। यह उबंटू पैकेज से एक और netcat स्थापित करने से बेहतर है।
रॉबर्ट

OpenBSD का उदाहरण Ubuntu 15.04 पर विफल रहा। खोल रीडायरेक्ट के साथ, netcat रूप से देखा सुनने के लिए पोर्ट खोलने में विफल रहता है ss -tanया netstat -tan
जस्टिन सी।

⁺¹। FTR: वैकल्पिक तरीका Ubuntu पर काम करता है
Hi-Angel

मैं आपके समाधान को नहीं समझता। क्या आप इसे समझा सकते हैं?
Trismegistos

@trismegistos इन उदाहरणों में netcat श्रोता और क्लाइंट कुछ साझा फ़ाइलों (mkfifo पाइप..पहली बार बाहर में) में इनपुट को पुनर्निर्देशित करते हैं, और उन साझा फ़ाइलों को उनके स्रोत / इनपुट / आउटपुट के गंतव्य के रूप में उपयोग करते हैं, प्रभावी रूप से एक सुरंग बनाते हैं। आमतौर पर ग्राहक / श्रोता उपयोग किया जाता है, लेकिन कुछ तकनीकों ग्राहक + ग्राहक / श्रोता + listener- का उपयोग wiki.securityweekly.com/... और slideshare.net/amiable_indian/secrets-of-top-pentesters चाहिए पढ़ता है।
Info5ek 18

4

ServerFault पर एक डेविड स्पिलेट के जवाब का हवाला देते हुए

rinetd को काम करना चाहिए, और इसके लिए एक विंडोज बाइनरी http://www.boutell.com/rinetd/ (लिनक्स के तहत एक ही चीज़ की तलाश में किसी से भी हो सकता है ) के लिए, rinetd सिर्फ हर डिस्ट्रो के बारे में मानक रिपॉजिटरी में है तो "apt-get install rinetd" या "yum install rinetd" या इसी तरह के साथ स्थापित किया जा सकता है)

यह एक सरल बाइनरी है जो प्रारूप में एक कॉन्फ़िगरेशन फ़ाइल लेता है

bindaddress bindport connectaddress connectport

उदाहरण के लिए:

192.168.1.1 8001 127.0.0.1 8000

या

0.0.0.0 8001 127.0.0.1 8000

यदि आप आने वाले पोर्ट को सभी इंटरफेस से बांधना चाहते हैं।


3
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart

कनेक्ट करने की कोशिश करने पर dport, जैसा कि nc -v localhost 2345, मैं कर रहा हूँ Connection refused। मैं iptables में बहुत अच्छा नहीं हूँ, लेकिन मुझे लगता है कि dport के पास एक सुनने वाला ऐप होना चाहिए।
हाय-एंजल

क्या होगा यदि गंतव्य बंदरगाह की तुलना में मूल-बंदरगाह अलग-अलग इंटरफ़ेस पर है?
Trismegistos

0

मार्क ए के जवाब के आधार पर , मुझे अपने मैक के लिए काम करने के लिए एक छोटा सा ट्वीक करना पड़ा (कम से कम macOS Mojave संस्करण 10.14.4 पर)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

ऐसा लगता है कि प्रिंटफ स्टेटमेंट महत्वपूर्ण है। अन्यथा नेट 8000 से पोर्ट 8000 से कनेक्ट करने की कमांड वास्तव में कभी कनेक्ट करने का प्रयास नहीं करेगी, और पोर्ट 8001 पर सुनने के लिए नेटकैट कमांड वास्तव में पोर्ट 8001 पर कभी नहीं सुनेगा। प्रिंटफ के बिना, हर बार मैं पोर्ट 8001 से कनेक्ट करने का प्रयास करूंगा। कनेक्शन नहीं हो सका।

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

नोट: मैंने मार्क की पोस्ट पर एक उत्तर छोड़ा होगा, लेकिन अभी तक मेरी प्रतिष्ठा नहीं है।


0

यह सर्वर पर दो udp पोर्ट को टनल करने का एक नया तरीका है: https://github.com/9crk/udpeer

udpeer 8001 8002

परीक्षा करना:

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