नेट राउटर के पीछे ऑफिस होस्ट की एसएसएच पहुंच


33

मैं घर से अपने ऑफिस के लिनक्स होस्ट के ssh पोर्ट को एक्सेस करना चाहूंगा। दुर्भाग्य से मेजबान एक NAT रूटर के पीछे स्थित है। इसलिए, आईपी पता सार्वजनिक रूप से उपलब्ध नहीं है। हालांकि एक अन्य इंटरनेट होस्ट (सर्वर) तक पहुंच है जो दुर्भाग्य से केवल गैर-रूट एक्सेस है। खोज के कुछ समय बाद मुझे एक उपयुक्त समाधान नहीं मिला।

निम्नलिखित सेटअप:

  • नेट (आईपी सार्वजनिक नहीं) के पीछे ऑफिस पीसी (लिनक्स, रूट एक्सेस) लेकिन पूर्ण इंटरनेट एक्सेस।
  • सर्वर पीसी (लिनक्स, कोई रूट एक्सेस) स्थिर और सार्वजनिक आईपी और पूर्ण इंटरनेट का उपयोग।
  • NAT (IP सार्वजनिक नहीं) लेकिन पूर्ण इंटरनेट एक्सेस के पीछे होम पीसी (लिनक्स, रूट एक्सेस)।

संभावित कनेक्शन: ऑफिस पीसी -> सर्वर <- होम पीसी

संभव नहीं: कार्यालय पीसी <-X- सर्वर -X-> होम पीसी

न तो होम पीसी, न ही सर्वर कार्यालय पीसी तक पहुंच शुरू कर सकता है। लेकिन Office PC और Home PC दोनों सर्वर से कनेक्शन आरंभ कर सकते हैं।

एसएसएच सुरंग को उल्टा संभव नहीं: मैंने रिवर्स एसश-सुरंग नामक एक विधि की कोशिश की। दुर्भाग्य से इसके लिए सर्वर पर GatewayPorts को "Yes" में / etc / ssh / sshd_config पर सेट करना पड़ता है, जहाँ मेरा कोई रूट एक्सेस नहीं है।

सिद्धांत रूप में यह संभव होना चाहिए:

0) सर्वर पर मैं एक यूजरस्पेस प्रोग्राम शुरू करता हूं जो 2 पोर्ट (1 इनकमिंग, 1 आउटगोइंग) पर सुनता है।

1) अपने कार्यालय पीसी पर मैं एक अन्य कार्यक्रम चलाता हूं जो सर्वर पर आउटगोइंग पोर्ट के लिए एक टीसीपी कनेक्शन खुला रखता है।

2) घर से मैं सर्वर के आने वाले पोर्ट से जुड़ता हूं।

इसके लिए वहां एक मानक समाधान होना चाहिए।

इसे हल करने का सबसे तेज और साफ उपाय क्या है?

फ्रैंक


1
कार्य पीसी एक ssh सुरंग स्थापित करने के लिए घर से कनेक्ट कर सकते हैं? en.gentoo-wiki.com/wiki/Autossh

आप फ़ाइलज़िला का उपयोग Sftp और पोर्ट फ़ॉरवर्डिंग के साथ कर सकते हैं। बाहर की जाँच करें: superuser.com/a/1286681/141314
Noam Manos

जवाबों:


31
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

बाद में:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

आप यह क्या कर सकते हैं: चरण 1 में कार्यालय पीसी से सर्वर तक एक दूरस्थ बंदरगाह को आगे बढ़ाया 12345जाता है ( इसका उपयोग एक उदाहरण के रूप में किया जाता है, किसी भी बंदरगाह> 1024 को करना चाहिए)। अब सर्वर पर 12345 से कनेक्ट होकर आपको ऑफिसपैक पर पोर्ट 22 से कनेक्ट करना चाहिए।

चरण 2 में, अपने होम मशीन से 12345 पोर्ट को सर्वर पर 12345 (जहां यह चरण 1 में सेट अप किया गया है, कार्यालय -22 पर अग्रेषित किया जाता है)

चरण 3 में, आप अपने कार्यालय पीसी लॉगिन के साथ स्थानीय पोर्ट 23456 से कनेक्ट होते हैं । यह आपके सर्वर पर चरण 2 से 12345 पोर्ट करने के लिए, और चरण 1 से आपके कार्यालय पीसी के लिए भेजा जाता है।

ध्यान दें कि मैं फॉरवर्डिंग के लिए ऑटोसह का उपयोग कर रहा हूं, क्योंकि यह एक एसश रैपर है जो स्वचालित रूप से सुरंग को फिर से जोड़ता है इसे काट दिया जाना चाहिए; हालांकि सामान्य ssh भी काम करेगा, जब तक कि कनेक्शन ड्रॉप नहीं होता।

एक संभावित भेद्यता है: जो कोई भी लोकलहोस्ट से जुड़ सकता है: 12345 सर्वरपैक पर अब ऑफिसपैक से जुड़ सकता है: 22, और इसमें हैक करने की कोशिश करें। (ध्यान दें कि यदि आप एक SSH सर्वर चला रहे हैं, तो आपको वैसे भी इसे मूलभूत सुरक्षा के ऊपर सुरक्षित रखना चाहिए, जो डिफ़ॉल्ट रूप से चालू हैं। मैं कम से कम रूट लॉगिन को अक्षम करने और पासवर्ड प्रमाणीकरण को अक्षम करने की सलाह देता हूं - यह देखें जैसे )

संपादित करें : मैंने इसे उसी कॉन्फ़िगरेशन से सत्यापित किया है, और यह काम करता है। GatewayPorts noकेवल उन बंदरगाहों को प्रभावित करता है जो बड़े पैमाने पर दुनिया के लिए खुले हैं, स्थानीय सुरंगों में नहीं। यह वही है जो अग्रेषित पोर्ट हैं:

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

तो, जहाँ तक नेटवर्क स्टैक का संबंध है, यह संबंधित लूपबैक इंटरफेस (प्लस ssh कनेक्शन पर सभी स्थानीय यातायात है करने के लिए serverpc); इसलिए, GatewayPortsबिल्कुल जाँच नहीं की जाती है।

हालाँकि, निर्देश है AllowTcpForwarding: यदि वह है no, तो यह सेटअप विफल हो जाएगा क्योंकि किसी भी अग्रेषण की अनुमति नहीं है, लूप इंटरफ़ेस के पार भी नहीं।

कैविट्स :

  • अगर ऑटोस और हाल के ssh का उपयोग कर रहे हैं, तो आप ssh का उपयोग करना चाहते हैं ServerAliveIntervalऔर ServerAliveCountMaxसुरंग को बनाए रखने के लिए। ऑटोशो में एक अंतर्निर्मित चेक है, लेकिन जाहिर तौर पर फेडोरा पर इसके कुछ मुद्दे हैं। -M0अक्षम करता है कि, और -oServerAliveInterval=20 -oServerAliveCountMax=3जाँचता है कि क्या कनेक्शन है - प्रत्येक 20 सेकंड की कोशिश करता है, अगर यह एक पंक्ति में 3x विफल रहता है, तो ssh बंद हो जाता है (और ऑटो एक नया बनाता है):

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • ssh सुरंग को पुनः आरंभ करने के लिए उपयोगी हो सकता है अगर आगे विफल हो जाता है, का उपयोग करते हुए -oExitOnForwardFailure=yes- यदि बंदरगाह पहले से ही बाध्य है, तो आपको एक काम करने वाला SSH कनेक्शन मिल सकता है, लेकिन कोई अग्रेषित सुरंग नहीं।

  • ~/.ssh/configविकल्प (और पोर्ट) के लिए उपयोग करना उचित है, अन्यथा कमांड लाइन बहुत अधिक क्रियाशील हो जाती है। उदाहरण के लिए:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

तो आप बस सर्वर उपनाम का उपयोग कर सकते हैं:

    autossh -M0 fwdserverpc

मुझे विश्वास है कि आप जो तरीका अपना रहे हैं उसे "रिवर्स एसश-टनल" कहा जाता है। दुर्भाग्य से इसके लिए सर्वर पर गेटवेपॉर्ट्स को "हां" में / etc / ssh / sshd_config सेट करना पड़ता है। इस सर्वर का कोई गेटवे पोर्ट सक्षम नहीं है और मेरी वहां कोई जड़ नहीं है।

3
@ फ्रेंक: वास्तव में, मुझे ऐसा नहीं लगता: GatewayPorts noखुले हुए पोर्ट्स को केवल लूपबैक इंटरफेस पर एक्सेस करने के लिए प्रतिबंधित करता है; ध्यान दें कि चरण 2 में आप लूपबैक इंटरफ़ेस पर आगे बढ़ रहे हैं (वास्तव में, दोनों फ़ॉरेस्ट "लोकलहोस्ट केवल") हैं, इसलिए यह काम कर सकता है ( AllowTcpForwarding nosshd config में यह टूट जाएगा)।
पिस्कवॉर

3
@ फ्रांक: हाँ, पुष्टि की। इसके साथ भी काम करता है GatewayPorts no; उत्तर संपादित किया। ध्यान दें कि अन्य निर्देश (जैसे कि PermitOpenऔर AllowTcpForwarding) जो इस सेटअप को तोड़ सकते हैं: manpagez.com/man/5/sshd_config
Piskvor

1
बहुत बढ़िया जवाब! यह काम करता है, आपने मेरा सप्ताहांत बचाया! बहुत धन्यवाद!!

1
मेरा ऑटो संस्करण (फेडोरा कोर) टर्मिनल के बिना -M से नहीं चल सकता था। मैंने एक अन्य व्यक्ति से भी जुड़ा है, जिसने अनुभव किया है। आप सही हैं कि मैनुअल में इसे वैकल्पिक तर्क के रूप में चिह्नित किया गया है। अच्छा है अगर यह कई लोगों के लिए काम करता है, अफ़सोस कि सभी के लिए नहीं।
यारोस्लाव निकितेंको

4

यदि आप घर से आंतरिक सर्वर से और अपने कार्यालय लिनक्स मशीन से आंतरिक सर्वर के लिए ssh कर सकते हैं, तो घर से आप ProxyCommandसर्वर के माध्यम से आंतरिक मशीन nc(netcat) के माध्यम से चुपचाप उछाल के लिए उपयोग कर सकते हैं

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

फिर आप बस ssh user@internalpcऔर आप सर्वर मशीन के माध्यम से चुपचाप आगे बढ़े जाते हैं, बंदरगाहों या सुरंगों का कोई भी उद्घाटन आवश्यक नहीं है।


1
आपके उत्तर के लिए धन्यवाद। दुर्भाग्य से, न तो होम पीसी, न ही सर्वर कार्यालय पीसी तक पहुंच शुरू कर सकता है। लेकिन Office PC और Home PC दोनों सर्वर से कनेक्शन आरंभ कर सकते हैं।

4

उस कंप्यूटर में रोबो-टीआईटीओ स्थापित करें जिसे आप दूरस्थ रूप से एसएसएच तक पहुंचना चाहते हैं।

  • यह आपको कहीं भी Google टॉक क्लाइंट ऐप से एसएसएच का उपयोग करने की अनुमति देगा।
  • एक सार्वजनिक आईपी पते या विशेष सेटिंग की कोई आवश्यकता नहीं है।
  • यह मुफ़्त और खुला स्रोत है, अब किसी भी आवेदन सेवाओं का भुगतान नहीं।
  • SSH पोर्ट खोलने की आवश्यकता नहीं है (अपने कंप्यूटर को सुरक्षित रखें)।
  • कोई सुरंग खोलने की जरूरत नहीं (जैसे, वीपीएन या ऐसा कुछ)

निम्नलिखित इंस्टॉलेशन निर्देश अप्रचलित हैं, क्योंकि साइट स्थानांतरित हो गई है। नया URL https://github.com/formigarafa/robotito है

मैंने एक स्क्रिप्ट बनाई (रास्पबेरी पाई में मेरे रास्पियन ओएस पर परीक्षण किया गया) ताकि आप रास्पबेरी पाई, डेबियन या उबंटू बॉक्स (डेबियन पैकेज वितरण) पर आसानी से रोबो-टीआईटीओ स्थापित कर सकें। यह आपके लिनक्स बॉक्स को प्राप्त करने योग्य उपाय है:

  1. शेल कमांड खोलें या आप इसे टर्मिनल कह सकते हैं, अपने होम फोल्डर पर जा सकते हैं, कमांड द्वारा इंस्टॉलर स्क्रिप्ट डाउनलोड करें:

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. उसके बाद कमांड दर्ज करके स्क्रिप्ट चलाएँ:

    $ sudo ./robotito
    
  3. और फिर आप credentials.rbअपने GTalk खाते का उपयोग करके रोबो-टीआईटीओ के कॉन्फ़िगरेशन फ़ोल्डर से फ़ाइल को संपादित कर सकते हैं और इसे Ctrl+ Xऔर दबाकर सहेज सकते हैं Y। डिफ़ॉल्ट नैनो संपादक का उपयोग कर रहा है।

  4. Robo-TiTO को Robo-TiTO फ़ोल्डर से कमांड द्वारा चलाना

    $ cd robotito
    $ ./jabbershd start
    
  5. अब यह किया जाता है कि आप किसी भी Google टॉक क्लाइंट से SSH का उपयोग कर सकते हैं। अपने Google टॉक खाते में रोबो-टीआईटीओ जीटॉक खाते को जोड़ना न भूलें और खाते का उपयोग करने से पहले एक दूसरे से चैटिंग के साथ इसका परीक्षण करें।


5
मुझे एक गंभीर समस्या है "एसएसएच पोर्ट को खोलने की आवश्यकता नहीं है (अपने कंप्यूटर को बचाएं रखें )" - शेल-ओवर-जैबर बॉट जो आप प्रस्तावित करते हैं, सादेCLIENT_PASSPHRASE = "logmein" में , उद्धरण, के साथ सुरक्षित है । यह सचमुच शून्य सुरक्षा है - आप किसी को भी प्रवेश करने के लिए ट्रक के आकार का छेद बना रहे हैं। SSH सार्वजनिक कुंजी प्रमाणीकरण के विपरीत: मैं क्रेडेंशियल्स का उपयोग करके एक सुरक्षित चैनल पर प्रमाणीकरण कर रहा हूं , जो कभी भी तार को पार नहीं करता है। अब उनके कंप्यूटर को कौन सुरक्षित रख रहा है?
पिस्कवॉर

@Piskvor, robotito केवल श्वेतसूची वाले संपर्कों से कमांड चलाएगा। github.com/formigarafa/robotito/blob/master/config/…
formigarafa

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

1
@formigarafa: (1) यदि आप इस उत्पाद के विकास में शामिल हैं या हैं, तो आपको स्पष्ट रूप से ऐसा कहना होगा। एक ही नाम का उपयोग करना पर्याप्त नहीं है; ज्यादातर लोगों का ध्यान नहीं जाएगा। (आप अपनी प्रोफ़ाइल में इसका उल्लेख कर सकते हैं ।) (2) जब आप किसी पोस्ट को संपादित करते हैं, तो आपको इसे जितना संभव हो उतना ठीक करना चाहिए। उदाहरण के लिए, "वॉट्स" जैसे टाइपोस को पकड़ने की कोशिश करें। और, यदि कोई लिंक नीचे चला गया है, तो इसे केवल एक मृत लिंक के रूप में लेबल न करें; पोस्ट में नया URL डालें । लोगों को सही जानकारी खोजने के लिए टिप्पणियों के माध्यम से खुदाई नहीं करनी चाहिए।
जी-मैन का कहना है कि 'मोनिका'

@ जी-मैन, मूल उत्तर और संपादन मेरा नहीं था। और मेरा कभी इरादा नहीं था कि मैं इसे अपना बनाऊं। मैंने उत्तर पर एक मृत लिंक देखा, मैंने लिंक भी नहीं बनाया। मैं वास्तव में इसकी सामग्री को देखने के लिए उत्सुक था और इसका पालन करने की कोशिश की। दुर्भाग्य से मुझे संसाधन नहीं मिले। मैंने इस उम्मीद पर एक मृत कड़ी के रूप में चिह्नित किया कि जिसने भी उत्तर लिखा है उसे बदलाव से सूचित किया जाएगा और इसे ठीक करने का प्रयास किया जाएगा।
फॉर्मिगराफा

3

Piskvor का समाधान काम करता है और अच्छा है। हालाँकि, यह टर्मिनलों को लॉगिन गोले के साथ खुले लटकते रहता है। बहुत अच्छा नहीं है।

मैंने हमेशा इस छोटी लिपि का उपयोग किया है जिसे मैंने एक सर्वर से कनेक्ट करने के लिए लिखा था और इसे क्रोन में चलाकर इसे जुड़ा रखा है:

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

मुझे यकीन है कि हम शायद एक अलग स्क्रीन के साथ अधिक सुरुचिपूर्ण ऑटोशॉट का उपयोग करके पिस्कॉर के समाधान को ठीक कर सकते हैं या पृष्ठभूमि में कनेक्शन को बनाए रखने के लिए -NT ssh तर्कों का उपयोग कर सकते हैं।


तारीफ के लिए धन्यवाद :) मेरे उपयोग के मामलों के लिए, मुझे नियमित रूप से शेल एक्सेस, साथ ही फॉरवर्डिंग की आवश्यकता है; साथ ही, मैंने यहां न्यूनतम मामले को दिखाने की कोशिश की है (पारदर्शी एसएसएच होस्ट होपिंग के साथ उपरोक्त दो कमांडों को सरल बनाना संभव है, लेकिन इसके लिए homepcकंप्यूटर पर अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता होगी )।
पिस्कोवोर

2

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


1
अब जबकि 5.0.0.0/8नेटवर्क में वास्तव में सार्वजनिक IPv4 पते हैं, हमाची मुसीबत में है (यदि हमाची चल रहा है, तो आप इंटरनेट के कुछ हद तक यादृच्छिक भाग तक नहीं पहुंच सकते हैं)। इसके अलावा, हमाची अब फ्री-टू-यूज़ नहीं है।
पिस्कवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.