एक ही टर्मिनल कमांड का उपयोग करके LAN के अंदर और बाहर से SSH पहुंच


10

मेरे पास रास्पबेरी पाई (आरपीआई) है और मैं ssh का उपयोग करके इसे दूरस्थ कनेक्शन बना रहा हूं। मैंने ssh को सही तरीके से सेट करने में कामयाबी हासिल की है, ताकि मैं स्थानीय क्षेत्र के नेटवर्क और इंटरनेट से (किसी विशिष्ट पोर्ट का उपयोग करके, जिसे मैंने अपने राउटर पर खोला हो) दोनों से आरपीआई का उपयोग कर सकता हूं।

एक उपयोगकर्ता नाम johnऔर एक आरपीआई नाम raspi:

लैन एक्सेस के अंदर

ssh john@192.168.2.7
ssh john@raspi
ssh raspi

LAN एक्सेस के बाहर

ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89

लेकिन मैं ssh raspiअपने LAN के बाहर कैसे कर सकता हूँ ? क्या दो IP-adresses, एक LAN में और एक इंटरनेट पर इंगित करने के लिए raspi को कॉन्फ़िगर करने का एक तरीका है?

जो मैं मूल रूप से चाहता हूं वह मेरी आरपीआई को एक ही तरीके से एक्सेस करना है, चाहे मैं घर पर हो या काम पर।


आप अपने स्थानीय लैन पर एक DNS सर्वर चला सकते हैं जो स्थानीय लैन आईपी पते के साथ "रास्पि" नाम के अनुरोध का जवाब देता है। अब एक ही नाम को एक अलग बाहरी पते पर हल करने के लिए उस नाम को इस तरह से (डायनामिक डीएन) पॉप्युलेट करना होगा कि यह भी हल हो जाए। लेकिन आपको शायद "रससी" की तुलना में लंबे नाम की आवश्यकता होगी।
च्ककॉट्रिल

: इस क्यू एंड ए देखें unix.stackexchange.com/questions/61655/...
SLM

जवाबों:


7

आपके प्रश्न को करीब से देखने पर, ऐसा प्रतीत होता है कि आप LAN के अंदर और बाहर दोनों ओर से एक ही कंप्यूटर का उपयोग कर रहे हैं। मैंने अपने उत्तर को उसी के अनुसार संशोधित किया है:

अपने में ~/.ssh/config, जोड़ें:

Host raspi-wan
    HostName 12.34.56.78
    User john
    Port 1234

Host raspi-lan
    HostName 192.168.1.2
    User john
    Port 22

फिर, आप ssh raspi-wanLAN से बाहर से, या LAN के ssh raspi-lanअंदर से DNS सर्वरों के बारे में फफूंद लगाए बिना या /etc/hostsसभी उपयोगकर्ताओं के लिए संपादन कर सकते हैं, या यहां तक ​​कि रूट के रूप में कुछ भी करने की आवश्यकता हो सकती है। यदि आप चाहते raspiहैं कि आप जहां हैं, उसके आधार पर नाम अलग से हल करें, तो संभवत: आपके नेटवर्क का पता लगाने और तदनुसार कार्य करने के लिए कुछ शेल स्क्रिप्टिंग जादू की आवश्यकता होगी।


1
धन्यवाद डोपघोटी, मैं आपके समाधान के साथ एक -wanऔर -lanपोस्टफिक्स को शामिल करने के लिए बहुत सहज हूं । मेरा ssh हालांकि Usernameक्षेत्र (खराब कॉन्फ़िगरेशन विकल्प) को पसंद नहीं करता था । यह इसके बिना ठीक काम कर रहा है।
Aeronaelius

2
मुझे खेद है, सही वाक्यविन्यास है User john, नहीं UserName। मैं इसे दर्शाने के लिए अपना उत्तर सही कर रहा हूं, और जब आप इस प्रकार अपना कॉन्फिगरेशन सेट कर लेते हैं, तो आप sshकमांड लाइन से यूजरनेम को छोड़ सकते हैं ।
डोपघोटी

5

यह केवल ssh कॉन्फिगरेशन के साथ पूरी तरह से करने योग्य है, बिना लैन और वान के लिए अलग उपनामों का उपयोग किए बिना या इसके लिए कोई अतिरिक्त पोर्ट बनाने के बिना। (लेकिन आपको स्वाभाविक रूप से यह पता लगाने के लिए किसी तरह की आवश्यकता है कि आप अपने लैन के अंदर हैं या नहीं)

में ~/.ssh/config, आप कुछ इस तरह जोड़ना चाहते हैं:

Match host raspi exec "am_i_outside_of_my_lan"
    HostName 12.345.67.89
    Port 1234

इसके स्थान पर am_i_outside_of_my_lanआप एक कमांड रखना चाहते हैं जो यह निर्धारित करे कि आप अपने घर के नेटवर्क के अंदर हैं या नहीं, और यदि आप इसके बाहर हैं, तो 0 एग्जिट कोड के साथ रिटर्न करते हैं और कुछ और।

hostहालत शायद आत्म व्याख्यात्मक है, लेकिन execहालत वारंट कुछ स्पष्टीकरण: यह मेल खाता है केवल जब बाहर निकलने के कोड 0, यानी साथ दिया आदेश रिटर्न। कोई ग़लती नहीं।

तो दूसरे शब्दों में, यह क्या करता है host raspiयह नियम इस नियम को प्रतिबंधित करता है जब आप मेजबान रास्पि से कनेक्ट करने का प्रयास करते हैं, और exec "am_i_outside_my_lan"आगे इसे प्रतिबंधित करता है ताकि यह केवल तब लागू हो जब आप अपने घर के नेटवर्क के बाहर से कनेक्ट कर रहे हों। इसलिए आपके होम नेटवर्क के अंदर ssh user@raspiवही होता है जो सामान्य रूप से होता है, लेकिन इसके बाहर नियम मेल खाता है और इसके बजाय इसके बराबर होता है ssh -p 1234 user@12.345.67.89

इसके स्थान पर क्या उपयोग करना है am_i_outside_of_my_lan, यह पूरी तरह से आपके सेटअप पर निर्भर करता है। मैं इनलाइन लिखने की कोशिश करने के बजाय एक अलग स्क्रिप्ट में कमांड रखने का सुझाव देता हूं, क्योंकि सही होने के लिए उद्धरण थोड़ा कठिन लगता है।

व्यक्तिगत रूप से, मैंने यह पता लगाने के लिए निम्नलिखित पायथन लिपि का उपयोग किया कि क्या मैं अपने स्वयं के नेटवर्क के अंदर हूं: (चूंकि मेरा डोमेन नाम मेरे ही नेटवर्क के अंदर एक स्थानीय आईपी का समाधान करता है)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

यदि आपके पास एक समान सेटअप नहीं है, तो आपको कुछ और करना होगा। (उदाहरण के लिए, आप उस वायरलेस नेटवर्क के नाम को देख सकते हैं, जिससे आप जुड़े हैं, या यहां तक ​​कि जिस नेटवर्क से आप जुड़े हैं, उसका बाहरी आईपी प्राप्त करने के लिए कुछ व्हाट्सएप-माय-आईपी सेवा से क्वेरी करें)


यह सही जवाब है; यह बहुत दुख की बात है कि अन्य लोगों के पास अधिक वोट हैं।
जोनाथन तोमर

@ जोनाथनटोमर: ठीक है, निष्पक्ष होने के लिए, मैंने यह पूछे जाने के 3 साल बाद जवाब दिया, जबकि उच्च-स्कोरिंग उत्तर घंटों के भीतर पोस्ट किए गए थे, इसलिए यह सिर्फ "प्रारंभिक पक्षी कीड़ा हो जाता है" का मामला है: पी (मेरे पास भी है) यह कहना कि मुझे काफी पसंद है एलिस होआग के इस सामान्य समाधान का विशिष्ट संस्करण - arp का उपयोग करना काफी चतुर है, और समाधान को और अधिक सामान्य बनाता है, जैसा कि नेटवर्क डिटेक्शन कमांड में प्रत्येक नेटवर्क सेटअप के लिए ट्यून नहीं करना पड़ता है)
अलेक्सई तोरहमी

3

आपके कंप्यूटर पर (कनेक्ट- ing एक), आप के लिए एक होस्टनाम सेट कर सकते हैं 12.345.67.89। अपनी /etc/hostsफ़ाइल खोलें , और DNS प्रविष्टि सेट करें:

12.345.67.89    raspi

आपकी मशीन फिर "raspi" को "12.345.67.89" में एक स्थानीय DNS रिज़ॉल्यूशन प्रक्रिया के हिस्से के रूप में बदल देगी। यदि आप कई मशीनों का उपयोग करते हैं, तो उनमें से प्रत्येक पर परिवर्तन किया जाना चाहिए। समस्या यह है: इसे संपादित करने के लिए रूट एक्सेस की आवश्यकता होती है /etc/hosts, और आपके पास हर जगह नहीं हो सकता है।

यदि आप चाहते हैं कि "रास्पी" को कहीं से भी स्वचालित रूप से पहचाना जाए, तो क्षमा करें: संभव नहीं है। इसके लिए एक डोमेन नाम के रूप में "raspi" के पंजीकरण की आवश्यकता होगी, जो "raspi" के रूप में नहीं हो सकता है, जिसमें कोई TLD नहीं है, और यह किसी DNS रूट सर्वर पर निर्भर नहीं होगा। हालाँकि, आप एक डोमेन नाम पंजीकृत कर सकते हैं (आइए कहते हैं cfbaptista.me, और इसे अपने WAN IP पते पर इंगित करें। कुछ पोर्ट अग्रेषण के साथ, आप अपने रास्पबेरी पाई का उपयोग कर पाएंगे:

ssh (you@)(raspi.)cfbaptista.me

(अभी भी, कि लगभग कुछ भी नहीं के लिए पैसा खर्च कर रहा है ...)

user@भाग के बारे में , यह विभिन्न मशीनों पर आपके लॉगिन नाम पर निर्भर करता है। आप पर एक ही नाम है, तो जोड़ने मशीन और पर दूरदराज के एक है, तो निर्दिष्ट करने के लिए कोई जरूरत नहीं। यदि नहीं, तो आपको यह निर्दिष्ट करने की आवश्यकता है कि आप दूरस्थ मशीन पर कौन हैं ।


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

वास्तव में ! यहाँ एक छोटी सी लिंक है: collectiveidea.com/blog/archives/2011/02/04/how-to-ssh-aliases
जॉन डब्ल्यूएच स्मिथ

0

लक्ष्य: ssh raspi LAN के अंदर और सार्वजनिक इंटरनेट पर काम करना चाहिए।

ऐसा करने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि नाम लैन पर आंतरिक आईपी, और सार्वजनिक आईपी को बाहर से हल करता है।

सबसे पहले, आपको एक डोमेन नाम प्राप्त करना चाहिए जैसे कि raspi.yourdomain.com। शौक के उपयोग के लिए मुफ्त डोमेन के लिए http://freedns.afraid.org/ देखें । अपने सार्वजनिक आईपी पर डोमेन को इंगित करें

LAN के लिए, मैं DNSMasq चलाने की सलाह देता हूं। खुले DD-WRT फर्मवेयर कसकर DNSMasq के साथ एकीकृत करता है, इसे डीएचसीपी और डीएनएस के लिए उपयोग करता है। आपको बस इसे अपना खोज डोमेन ("yourdomain.com") बताना होगा और यह प्रत्येक क्लाइंट के अनुरोधित नाम के आधार पर DNS नामों को ऑटो-असाइन करेगा। यह काम करने के लिए, raspi / etc / hostname को पढ़ना चाहिए raspi

एक बार यह सेट हो जाने के बाद, raspi.yourdomain.com को आपके LAN पर लोकल IP को हल करना चाहिए (बस यह सुनिश्चित करें कि आप अपनी सभी मशीनों पर स्थानीय DNS का उपयोग कर रहे हैं)।

अब, आप शायद सार्वजनिक इंटरनेट पर पोर्ट 22 को उजागर नहीं करना चाहते हैं, क्योंकि आपको एक टन का स्निफर ट्रैफ़िक मिलेगा। तो आपके पास रास्पि को उजागर करने वाला आपका राउटर हो सकता है: 22 को कुछ अन्य पोर्ट के रूप में कहें, 1234। सार्वजनिक और आंतरिक दोनों नेटवर्क पर एक ही पोर्ट का उपयोग करने के लिए, आप रास्पि में एक पोर्ट रीडायरेक्ट नियम जोड़ सकते हैं। लिनक्स पर:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j REDIRECT --to-port 22
sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

(अपने नेटवर्क इंटरफ़ेस के नाम के अनुसार eth0 को बदलें , ip linkया ifconfigआपके सार्वजनिक पोर्ट पर 1234)

अब आप ssh -p 1234 raspi.yourdomain.comसार्वजनिक और LAN दोनों से कर सकते हैं ।

आप ssh raspi@DopeGii द्वारा बताए अनुसार इसे छोटा करने के लिए अपने क्लाइंट मशीन पर ~ / .ssh / config में एक प्रविष्टि जोड़ सकते हैं ।

यदि आप एक ही सार्वजनिक IP पर अतिरिक्त मशीनों के SSH पोर्ट्स को उजागर करना चाहते हैं, तो बस एक अन्य DNS नाम और सार्वजनिक पोर्ट के साथ प्रक्रिया को दोहराएं। चीयर्स!


0

यहाँ अपने वर्तमान सार्वजनिक आईपी को हथियाने के लिए कर्ल का उपयोग करके अलेक्सई टॉरामो के जवाब का एक संक्षिप्त, कार्यशील संस्करण है और फिर यह जाँचता है कि क्या यह आपके सर्वर के सार्वजनिक आईपी से मेल खाता है (यानी, आप उसी स्थानीय नेटवर्क पर हैं)।

अपने ~/.ssh/configऐड में

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) == '12.345.67.89' ]]"
  User john
  HostName 192.168.2.7

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]"
  User john
  HostName 12.345.67.89
  Port 1234

मैं विश्वास है कि ssh आदेश में सभी मिलान निर्देशों पर कार्रवाई करेंगे,, सिद्धांत रूप में तो आप की तरह कुछ करने के लिए सक्षम होना चाहिए Match host raspi / User john / HostName 192.168.2.7के बाद Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234केवल एक साथ और एक ही प्रभाव प्राप्त curlदे, मंगलाचरण == '12.345.67.89'मामले दूसरे की विफलता से ग्रहण किया जा Matchशासन के exec
23

(आपको यह सुनिश्चित करना होगा कि पहले में निर्दिष्ट प्रत्येक तर्क Matchया तो समान है या दूसरे में भी निर्दिष्ट है - यदि आपने Port xxxxपहले में एक गैर-मानक निर्दिष्ट किया है Match, और दूसरे में मानक बंदरगाह का उपयोग करना चाहते हैं Match, आपको स्पष्ट रूप से इसे वापस लेना होगा Port 22ताकि यह पोर्ट का उपयोग करना जारी न रखे xxxx।)
FeRD

0

मान लें कि आपकी मशीन में IP 192.168.1 है। * आपके LAN से कनेक्ट होने पर, आप इसे निम्न कॉन्फ़िगरेशन के साथ प्राप्त कर सकते हैं ~/.ssh/configताकि आप ssh raspiकनेक्ट करने के लिए हमेशा एक ही कमांड (बस ) का उपयोग कर सकें :

Match Originalhost raspi Exec "ifconfig | grep 192\.168\.1\."
    HostName 192.168.1.2
    User john
    Port 22

Host raspi
    HostName 12.34.56.78
    User john
    Port 1234

0

यह समाधान मानता है कि आपके घर नेटवर्क में एक एकल राउटर है जो मुझे विश्वास है कि सामान्य मामला है।

अपने में जोड़ें ~/.ssh/config

Match host raspi exec "test $(arp 192.168.1.1 | awk '{print $4}') = ROUTER_MAC_ADDRESS"
        Hostname 192.168.2.7
        User john

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