SSH सुरंग को उल्टा करें: मैं अपना पोर्ट नंबर सर्वर पर कैसे भेज सकता हूं?


12

मेरे पास दो मशीनें हैं, क्लाइंट और सर्वर।

क्लाइंट (जो एक कॉर्पोरेट फ़ायरवॉल के पीछे है) सर्वर पर एक रिवर्स SSH सुरंग खोलता है, जिसमें सार्वजनिक रूप से सुलभ IP पता होता है, जो इस कमांड का उपयोग करता है:

ssh -nNT -R0: लोकलहोस्ट: 2222 insecure@server.example.com

ओपनएसएसएच 5.3+ में, 0केवल -Rएक के लिए स्पष्ट रूप से कॉल करने के बजाय "उपलब्ध पोर्ट चुनें" के बाद होने वाली घटना । मैं ऐसा कर रहा हूं इसका कारण यह है कि मैं एक पोर्ट नहीं चुनना चाहता जो पहले से उपयोग में है। सच में, वहाँ वास्तव में कई ग्राहक हैं जो समान सुरंगों को स्थापित करने की आवश्यकता है।

इस बिंदु पर समस्या यह है कि सर्वर को पता नहीं है कि कौन सा क्लाइंट है। अगर हम इनमें से किसी एक ग्राहक (लोकलहोस्ट के माध्यम से) से जुड़ना चाहते हैं तो हमें कैसे पता चलेगा कि कौन सा पोर्ट किस क्लाइंट को संदर्भित करता है?

मुझे पता है कि ssh पोर्ट संख्या को कमांड लाइन में रिपोर्ट करता है जब उपरोक्त तरीके से उपयोग किया जाता है। हालाँकि, मैं सत्र को जीवित रखने के लिए ऑटोसह का उपयोग करना चाहूंगा। autossh कांटा / निष्पादन के माध्यम से अपनी बाल प्रक्रिया चलाता है, संभवतः, ताकि वास्तविक ssh कमांड का आउटपुट ईथर में खो जाए।

इसके अलावा, मैं क्लाइंट से रिमोट पोर्ट प्राप्त करने के लिए किसी अन्य तरीके के बारे में नहीं सोच सकता। इस प्रकार, मैं सोच रहा हूं कि क्या सर्वर पर इस पोर्ट को निर्धारित करने का कोई तरीका है।

मेरे पास एक विचार यह है कि किसी तरह / etc / sshrc का उपयोग किया जाए, जो माना जाता है कि एक स्क्रिप्ट है जो हर कनेक्शन के लिए चलती है। हालाँकि, मुझे नहीं पता कि किसी को यहाँ जानकारी कैसे प्राप्त होगी (शायद उस कनेक्शन को संभालने वाले विशेष sshd का पीआईडी?) मुझे कुछ संकेत मिले।

धन्यवाद!


2
क्या कोई वीपीएन अधिक उपयुक्त नहीं होगा? OpenVPN कॉन्फ़िगर करने के लिए सुपर सरल है।
बेन लेसानी - सोनासी

दिलचस्प लगता है। मुझे वीपीएन के बारे में ज्यादा जानकारी नहीं है। क्या यह कुछ ऐसा है जो DHCP का उपयोग करने के लिए क्लाइंट मशीन को कॉन्फ़िगर करने पर भी काम कर सकता है?
टॉम

1
हां, यह दूसरे TUN / TAP इंटरफ़ेस को चलाता है, इसलिए अन्य इंटरफेस अप्रासंगिक हैं।
बेन लेसानी - सोनासी

@sonassi, ऐसा लग रहा है कि यह वीपीएन चीज ट्रिक करेगी। जानकारी के लिए धन्यवाद।
टॉम

मैंने वीपीएन प्रक्रिया के माध्यम से आपको
ओपनवीपीएन

जवाबों:


4

क्या कोई वीपीएन अधिक उपयुक्त नहीं होगा? OpenVPN कॉन्फ़िगर करने के लिए सुपर सरल है। प्रमाणपत्र निर्माण प्रक्रिया के माध्यम से आपका मार्गदर्शन करने के लिए यहां एक नमूना विन्यास और कुछ लिंक दिए गए हैं:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

फिर एक नई फ़ाइल बनाएं /etc/openvpn/client_server.confऔर उसमें निम्न डालकर, SERVER_IP_ADDRESSजैसा उचित हो, बदल दें

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

फिर एक कुंजी प्रति उपयोगकर्ता का निर्माण करें जो कनेक्ट करने जा रहा है, और ccd dir में कॉन्फिग फाइल बनाएँ

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

IP पता / 30 सबनेट ( http://www.subnet-calculator.com/cidr.php देखें ) के लिए उपयुक्त होना चाहिए , क्योंकि प्रति कनेक्शन केवल 2 पते उपलब्ध हैं (सर्वर और क्लाइंट)। तो आपका अगला उपलब्ध क्लाइंट IP 192.168.100.6 और इसी तरह होगा।

तब आपके पास अब कनेक्टिंग उपयोगकर्ता प्रति स्थिर IP हैं।

फिर the user1@domain.com.p12एंड-यूज़र को फ़ाइल की आपूर्ति करें और निम्न कॉन्फ़िगरेशन फ़ाइल का उपयोग करें

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

पूरी तरह से उत्तर के लिए धन्यवाद! मेरे पास इस बारे में दो सवाल हैं, हालांकि। A) क्लाइंट की ifconfig-push लाइन के लिए 255.255.255.0 निर्दिष्ट करने से काम नहीं लगता है, लेकिन अगर मैं एक दूसरे आईपी पते को निर्दिष्ट करता हूं तो यह काम करता है। ऐसा क्यों है? और बी) क्या इस दृष्टिकोण का अर्थ है कि प्रति कनेक्शन 4 आईपी पते का उपयोग किया जाता है?
टॉम

कुछ लिनक्स सिस्टम पर, ifconfig-push लाइन के लिए सिंटैक्स अलग है। उदाहरण के लिए। ifconfig-push 192.168.100.2 192.168.100.3- मुझे नहीं पता कि यह प्लेटफार्मों पर अलग क्यों है। और हां, इसका मतलब है कि प्रति ग्राहक 4 आईपी का उपयोग किया जाता है (बेकार, लेकिन जानवर की प्रकृति)।
बेन लेसानी - सोनासी 18

3

यदि प्रत्येक ग्राहक के पास अलग-अलग उपयोगकर्ता नाम हैं, तो आप यह netstatपता लगाने के लिए उपयोग कर सकते हैं कि उपयोगकर्ता किस sshdप्रक्रिया को सुन रहा है। उदाहरण के लिए:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

आप अल्पकालिक पोर्ट रेंज ( /proc/sys/net/ipv4/ip_local_port_rangeलिनक्स के लिए) को बदल सकते हैं और फिर उस सीमा के बाहर सांख्यिकीय रूप से आवंटित पोर्ट का उपयोग कर सकते हैं।


उसके लिए पंचांग श्रेणी को बदलने की आवश्यकता नहीं है। डिफ़ॉल्ट रूप से पंचांग सीमा 61000 पर समाप्त होती है, इसलिए इसके ऊपर हजारों उपलब्ध पोर्ट नंबर हैं। मैंने अक्सर echo $[61002+RANDOM%4532]उस रेंज में एक पोर्ट नंबर लेने के लिए उपयोग किया है।
कास्परड जूल

2

मुझे आपके जैसा ही सेटअप चाहिए, मैंने SSH सर्वर के लॉग स्तर को DEBUG तक बढ़ा दिया, और यह लॉग में दिखाया गया कि क्लाइंट का स्थानीय पोर्ट क्या था

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

ग्राहक आदेश: ssh -N -R0:127.0.0.1:5522 connector@example.com

सर्वर लॉग:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

वहां आपको पोर्ट नंबर दिखाई देता है


0

आपको आउटपुट से संबंधित जानकारी निकालने में सक्षम होना चाहिए:

lsof -i tcp

रूट के रूप में चलाएं।


0

इस स्क्रिप्ट को सर्वर पर चलाएँ:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

आपको दो सूडो की आवश्यकता हो सकती है या नहीं। यदि आप नहीं निकालते हैं।

पुनश्च - यह एक समाधान का एक संशोधित संस्करण है जो मैंने कुछ समय पहले कहीं और पाया था। मुझे लगता है कि यह StackOverflow से आया हो सकता है, लेकिन मुझे मूल संदर्भ नहीं मिल रहा है।

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