सवाल एसएसएच सुरंग को भरोसेमंद कैसे रखें?


मैं काम से एक एसएसएच सुरंग का उपयोग विभिन्न निष्क्रिय फ़ायरवॉल के आसपास जाने के लिए करता हूं (यह मेरे मालिक के साथ ठीक है :))। समस्या यह है कि, थोड़ी देर बाद एसएसएच कनेक्शन आमतौर पर लटकता है, और सुरंग टूट जाती है।

अगर मैं कम से कम सुरंग की निगरानी कर सकता हूं, तो जब मैं लटकता हूं तो सुरंग को फिर से शुरू कर सकता हूं, लेकिन मुझे ऐसा करने का एक तरीका भी नहीं मिला है।

बोनस उन लोगों के लिए इंगित करता है जो मुझे बता सकते हैं कि मेरे एसएसएच कनेक्शन को लटकने से कैसे रोकें!


207
2017-09-08 13:04


मूल


यह आपकी सुरंग मृत है क्योंकि निष्क्रियता? मुझे यह समस्या थी जब मेरे फोन से बंदरगाहों को सुरंग कर रहा था, इसलिए अंत में मैंने इसे "जीवित" बनाने के लिए कनेक्शन पर डमी कमांड को समाप्त कर दिया watch कमांड की तरह: watch -n1 60 echo "wiiiii"। जब तक नेटवर्क टूटा नहीं जाता है या आप इसका उपयोग नहीं करते हैं तो सुरंग मर नहीं जाएगा। - erm3nda
सम्बंधित: unix.stackexchange.com/q/200239 - sampablokuper


जवाब:


आपको पसंद की तरह लगता है autossh। यह एक एसएस सुरंग की निगरानी करेगा और आवश्यकतानुसार इसे पुनरारंभ करेगा। हमने इसे कुछ वर्षों तक इस्तेमाल किया है और ऐसा लगता है कि यह अच्छी तरह से काम करता है।

autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C

-एम पैरामीटर पर अधिक जानकारी यहाँ


247
2017-09-08 13:43



Autossh के लिए +1, यह टिन पर क्या कहता है। मेरा मानना ​​है कि इसकी कार्यक्षमता का हिस्सा भी किसी भी प्रकार के टाइमआउट को रोकने के लिए रख-रखाव वाले स्टाइल पैकेट भेजना है। - akent
क्या आप उदाहरण सुरंग का उपयोग कर सकते हैं autosshजवाब में? - Ehtesh Choudhury
autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 username@myoutsidebox.com   आप देख सकते हैं कि मैंने इसे -nNT का उपयोग करके सेट किया है जो रिमोट टर्मिनल नहीं बनाता है ताकि मैं पृष्ठभूमि में ऑटोशैश डाल सकूं, और .p विकल्प को .pem फ़ाइल का उपयोग करने के लिए। यदि आप हर समय एक कनेक्शन खोलने जा रहे हैं, तो मैं निश्चित रूप से अतिरिक्त सेटअप के माध्यम से जाने की सलाह देता हूं। - juckele
इसके लायक होने के लिए, ऐसा लगता है कि इसे छोड़ना आम तौर पर बेहतर होता है -M पैरामीटर: bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162 - rinogo
अगर मेरे पास पासफ्रेज़ है तो यह कैसे काम करता है? क्या यह उस कीफ्रेज़ को एक कीचेन में संग्रहीत करेगा (उदाहरण के लिए मैक पर)? - Yannick Y


सभी राज्यिक फ़ायरवॉल कुछ समय के लिए उस कनेक्शन के लिए एक पैकेट नहीं देखने के बाद कनेक्शन के बारे में भूल जाते हैं (राज्य टेबल को कनेक्शन से भरा होने से रोकने के लिए जहां दोनों सिरों कनेक्शन बंद किए बिना मृत्यु हो जाती है)। अधिकांश टीसीपी कार्यान्वयन दूसरी तरफ से सुनने के बिना लंबे समय के बाद एक रखरखाव पैकेट भेज देंगे (2 घंटे एक आम मूल्य है)। यदि, हालांकि, एक राज्यव्यापी फ़ायरवॉल है जो रखरखाव पैकेट भेजे जाने से पहले कनेक्शन के बारे में भूल जाता है, एक लंबे समय तक रहने वाला लेकिन निष्क्रिय कनेक्शन मर जाएगा।

यदि ऐसा है, तो समाधान कनेक्शन को निष्क्रिय होने से रोकने के लिए है। ओपनएसएसएच में एक विकल्प कहा जाता है ServerAliveInterval जिसका उपयोग कनेक्शन को बहुत लंबे समय तक निष्क्रिय होने से रोकने के लिए किया जा सकता है (बोनस के रूप में, यह पता लगाएगा कि कनेक्शन निष्क्रिय होने पर भी सहकर्मी जल्द ही मर गया था)।


35
2017-09-28 13:47



निर्दिष्ट अंतराल सेकंड में है, इसलिए आप कुछ बढ़िया ट्यूनिंग प्रदान कर सकते हैं। यदि आपके स्टेटफुल फ़ायरवॉल में 5 मिनट के निष्क्रिय टाइमआउट हैं, तो 60 या 120 सेकंड कनेक्शन को खोलने के लिए पर्याप्त है। यह मेरे घर राउटर के माध्यम से मेरे एसएसएच सत्रों को खोलने के तरीकों में से एक है। - Darren Hall
धन्यवाद, इससे मदद मिली। लेकिन ध्यान दें (यहां निम्न रैंक वाले उत्तर से, superuser.com/a/146641/115515) कि यदि आप ServerAliveInterval निर्दिष्ट करते हैं और ServerAliveCountMax नहीं, तो आप जानबूझकर जानबूझकर डिस्कनेक्ट कर सकते हैं जितना आप चाहते थे। - metamatt
@metamatt, आपके द्वारा संदर्भित निम्न-रैंकिंग उत्तर अच्छे कारण के लिए निम्न रैंकिंग है: यह गलत है। - Lambart


अपने स्वयं के मैक या लिनक्स मशीन पर अपने एसएसएच को सर्वर को हर 3 मिनट में जीवित रखें। टर्मिनल खोलें और अपने घर में अपना अदृश्य। एसएसएच जाएं:

cd ~/.ssh/ 

फिर इसके साथ एक 1 लाइन कॉन्फ़िगरेशन फ़ाइल बनाएं:

echo "ServerAliveInterval 180" >> config

आपको यह भी जोड़ना चाहिए:

ServerAliveCountMax xxxx (high number)

डिफ़ॉल्ट 3 है इसलिए ServerAliveInterval 180 9 मिनट के बाद भेजना बंद कर देगा (सर्वर एलीव इंटरवल द्वारा निर्दिष्ट 3-मिनट अंतराल में से 3)।


23
2018-05-29 13:45



ध्यान दें कि यदि आपके पास पहले से कॉन्फ़िगर फ़ाइल है तो आपके आदेश की अनुशंसा नहीं की जाती है। पुनर्निर्देशन के लिए >> का उपयोग करना बहुत बेहतर होगा! - Peltier
क्यों करता है ServerAliveInterval 180 हमें 6 मिनट दें? अंतर्ज्ञान मुझे यह कोशिश करता है: 180/60 == 3। ऐसा करता है ServerAliveInterval 30 सेकंड के गुणकों में काम करते हैं? - nemesisfixx
@mcnemesis: ServerAliveInterval 180 का अर्थ 3 मिनट है। ServerAliveCountMax 3 का अंतराल उन अंतराल में से 3 है, इसलिए 9 मिनट। - metamatt
मैं इस जवाब को वोट दे रहा हूं क्योंकि ServerAliveCountMax का उल्लेख करने के लिए धन्यवाद, और यदि आप ServerAliveCountMax के बिना ServerAliveInterval निर्दिष्ट करते हैं तो क्या होता है। लेकिन पिछली टिप्पणियों की तरह, मुझे लगता है कि "बाद में भेजना बंद कर देगा" पर गणना गलत है, और मुझे लगता है कि यह जवाब बेहतर होगा अगर उसने इन विकल्पों पर जानकारी दी, हमें यह नहीं बताया कि सीडी और इको कमांड के साथ उन्हें कैसे लागू किया जाए । - metamatt
डाउनवॉटिंग क्योंकि सर्वर एलीव काउंटरमैक्स को "उच्च संख्या" में सेट करने का कोई मतलब नहीं है। ServerAliveCountMax निर्दिष्ट करता है कि इसे छोड़ने से पहले "रखरखाव" संदेश भेजने में कितनी बार कोशिश की जाएगी। डिफ़ॉल्ट 3 है, इसलिए ServerAliveInterval 180 के साथ, यह केवल तभी भेजना बंद कर देगा जब सर्वर 9 मिनट के बाद उत्तर नहीं दिया गया है, इस स्थिति में आपका कनेक्शन शायद अच्छा और वास्तव में मर चुका है। - Lambart


पिछली बार मरने पर मैंने नए एसएस सुरंगों को बढ़ाने के लिए निम्नलिखित बैश स्क्रिप्ट का उपयोग किया है। जब आप नहीं चाहते हैं या अतिरिक्त पैकेज स्थापित नहीं कर सकते हैं या कंपाइलर का उपयोग नहीं कर सकते हैं तो एक स्क्रिप्ट का उपयोग करना आसान है।

while true
do
  ssh <ssh_options> [user@]hostname
  sleep 15
done

ध्यान दें कि कनेक्शन को स्वचालित रूप से स्थापित करने के लिए इसके लिए एक कीफाइल की आवश्यकता होती है लेकिन यह ऑटोशॉ के साथ भी मामला है।


20
2017-09-22 14:58



आपको इस स्क्रिप्ट का उपयोग autossh पर किसी भी कारण से जोड़ना चाहिए, या यह सिर्फ इतना आसान है कि यह इस तरह से आसान है? - kyrias
अगर एसएसएच खुद फ्रीज हो तो यह मदद नहीं करेगा, है ना? - nafg
यह मदद करता है अगर आप सर्वर में चीजें इंस्टॉल नहीं कर सकते हैं। autossh पूर्वस्थापित नहीं किया गया है और bureucracy यह कभी कभी बहुत उलझन में है। - quarkex
हां, चीजों को स्थापित करने के लिए बेहतर नहीं है। मैं एक साल के लिए इस तरह से कर रहा हूं क्योंकि रिमोट मशीन को सुलभ रखने का मेरा एकमात्र तरीका है (इसे रीबूट पर चलाने के लिए क्रॉन्टाब भी सेट करें)। यह कभी विफल नहीं हुआ है, और सबसे महत्वपूर्ण बात यह है कि मुझे पता है कि यह कभी विफल क्यों नहीं होगा। - sudo


Systemd आदर्श रूप से इसके लिए उपयुक्त है।

एक सेवा फ़ाइल बनाएँ /etc/systemd/system/sshtunnel.service युक्त

[Unit]
Description=SSH Tunnel
After=network.target

[Service]
Restart=always
RestartSec=20
User=sshtunnel
ExecStart=/bin/ssh -NT -o ServerAliveInterval=60 -L 5900:localhost:5900 user@otherserver

[Install]
WantedBy=multi-user.target

(एसएस कमांड को सूट करने के लिए संशोधित करें)

  • यह उपयोगकर्ता के रूप में चलाएगा sshtunnel तो सुनिश्चित करें कि उपयोगकर्ता पहले मौजूद है
  • मुद्दा systemctl enable sshtunnel बूट समय पर शुरू करने के लिए इसे सेट करने के लिए
  • मुद्दा systemctl start sshtunnel तुरंत शुरू करने के लिए

जनवरी 2018 अपडेट करें: कुछ distros (उदा। फेडोरा 27) systemd init से एसएसएच के उपयोग को रोकने के लिए SELinux नीति का उपयोग कर सकते हैं, इस मामले में आवश्यक छूट प्रदान करने के लिए एक कस्टम नीति बनाने की आवश्यकता होगी।


11
2017-07-28 06:10



यह मेरी जिंदगी के समान दिखता है: gist.github.com/guettli/... प्रतिक्रिया का स्वागत है! - guettli
ए के लिए उत्कृष्ट systemd प्रणाली। अगर कोई उपयोग करता है Restart=on-failure फिर मैन्युअल रूप से एसएसएच क्लाइंट को मारने से परिणामस्वरूप बाहर निकलने के साथ एसएसएच क्लाइंट के रूप में पुनरारंभ-द्वारा-सिस्टम नहीं किया जाएगा। - David Tonhofer
यदि आप तर्क के रूप में दिए गए (bash) स्क्रिप्ट से ssh शुरू करना चाहते हैं ExecStart उदाहरण के लिए बनाने के लिए ssh तर्क सूची, मूल जांच आदि करें, फिर इसे स्क्रिप्ट से कॉल करें exec /bin/ssh -N ...। मेरा आदेश यहाँ है: exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}" कहा पे TUNNEL_INLET="127.0.0.1:3307" तथा TUNNEL_OUTLET="127.0.0.1:3306" - David Tonhofer


यह निश्चित रूप से मुझे लगता है कि आप ServerAliveCountMax को गलत व्याख्या कर रहे हैं। जैसे-जैसे मैं दस्तावेज़ों को समझता हूं, यह सर्वर जीवित संदेशों की संख्या है जो कनेक्शन समाप्त होने के बिना अनुत्तरित जा सकते हैं। ऐसे में जिन मामलों में हम यहां चर्चा कर रहे हैं, इसे उच्च मूल्य पर सेट करना सिर्फ यह सुनिश्चित करेगा कि एक लटका कनेक्शन का पता नहीं लगाया जाएगा और समाप्त नहीं किया जाएगा!

बस सर्वरAliveInterval को कनेक्शन के बारे में भूलने वाली फ़ायरवॉल के साथ समस्या को हल करने के लिए पर्याप्त होना चाहिए, और सर्वरAliveCountMax को छोड़कर मूल अंत विफलता को नोटिस करने और कनेक्शन को विफल होने पर समाप्त होने की अनुमति देगा।

आप जो चाहते हैं, 1) सामान्य परिस्थितियों में स्थायी रूप से खुलने के लिए कनेक्शन के लिए, 2) कनेक्शन विफलता के लिए और विफलता पर बाहर निकलने के लिए मूल पक्ष के लिए, और 3) ssh कमांड को हर बार फिर से जारी करने के लिए बाहर निकलता है (आप यह कैसे करते हैं कि प्लेटफॉर्म पर निर्भर है, जावा द्वारा सुझाए गए "सत्य" स्क्रिप्ट एक तरीका है, ओएस एक्सआई पर वास्तव में एक लॉन्च आइटम स्थापित किया गया है)।


9
2017-11-28 01:04





हमेशा उपयोग करें ServerAliveInterval एसएसएच विकल्प समय-समय पर एनएटी सत्रों द्वारा सुरंग मुद्दों को उत्पन्न किया जाता है।

कनेक्टिविटी पूरी तरह से नीचे आने पर हमेशा एक श्वसन विधि का उपयोग करें, आपके पास कम से कम तीन विकल्प हैं:

  • autossh कार्यक्रम
  • बैश स्क्रिप्ट (while true do ssh ...; sleep 5; done) नींद कमांड को न हटाएं, ssh जल्दी से विफल हो सकता है और आप बहुत सी प्रक्रियाओं को राहत देंगे
  • /etc/inittab, बॉक्स में अग्रेषित पोर्ट के बिना, एनएटी के पीछे किसी अन्य देश में भेजे गए और इंस्टॉल किए गए बॉक्स तक पहुंच प्राप्त करने के लिए, आप इसे एक एसएस सुरंग बनाने के लिए कॉन्फ़िगर कर सकते हैं:

    tun1:2345:respawn:/usr/bin/ssh -i /path/to/rsaKey -f -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip 'sleep 365d'
    
  • उबंटू पर अपस्टार्ट स्क्रिप्ट, जहां /etc/inittab उपलब्ध नहीं है:

    start on net-device-up IFACE=eth0
    stop on runlevel [01S6]
    respawn
    respawn limit 180 900
    exec ssh -i /path/to/rsaKey -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip
    post-stop script
        sleep 5
    end script
    

या हमेशा दोनों तरीकों का उपयोग करें।


9
2018-03-08 21:30



यदि आप इसे अपने सभी एसएसएच कनेक्शन के लिए नहीं चाहते हैं तो इनलाइन विकल्प के लिए +1 - user1146334
आप "कनेक्टिविटी पूरी तरह से नीचे चला जाता है" लिखते हैं। अब मुझे समझ में नहीं आ रहा है, ऑटोशो खुद को क्या समस्याएं हल करता है, और यह क्या नहीं करता? मैंने सोचा, ज़ाहिर है, यह किसी भी टूटे हुए कनेक्शन का ख्याल रखेगा, जैसे केबल को कुछ घंटों तक अनप्लग करना, लेकिन शायद नहीं? - Mads Skjern


मैंने इस समस्या को हल किया:

संपादित करें

~/.ssh/config

और जोड़

ServerAliveInterval 15
ServerAliveCountMax 4

इसके अनुसार मैन पेज ssh_config के लिए:

ServerAliveCountMax
         Sets the number of server alive messages (see below) which may be
         sent without ssh(1) receiving any messages back from the server.
         If this threshold is reached while server alive messages are
         being sent, ssh will disconnect from the server, terminating the
         session.  It is important to note that the use of server alive
         messages is very different from TCPKeepAlive (below).  The server
         alive messages are sent through the encrypted channel and there‐
         fore will not be spoofable.  The TCP keepalive option enabled by
         TCPKeepAlive is spoofable.  The server alive mechanism is valu‐
         able when the client or server depend on knowing when a connec‐
         tion has become inactive.

         The default value is 3.  If, for example, ServerAliveInterval
         (see below) is set to 15 and ServerAliveCountMax is left at the
         default, if the server becomes unresponsive, ssh will disconnect
         after approximately 45 seconds.  This option applies to protocol
         version 2 only.

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.

6
2018-05-30 13:32



हर 15 सेकंड सर्वर को पिंग करने के लिए अक्सर लगता है। - Lambart
@ लैम्बर्ट लेकिन यदि कनेक्शन वास्तव में flaky है और अक्सर कनेक्शन ड्रॉप करता है, तो कम से कम एक मृत कनेक्शन का पता लगाता है और पहले से पुनः प्रयास करने का मौका देता है। - binki


ExitOnForwardFailure yes अन्य सुझावों के लिए एक अच्छा सहायक है। यदि यह कनेक्ट होता है लेकिन पोर्ट अग्रेषण स्थापित नहीं कर सकता है तो यह आपके लिए बेकार है जैसे कि यह बिल्कुल कनेक्ट नहीं हुआ था।


3
2018-06-06 23:41



यह एक बहुत अच्छा विचार है। यहां तक ​​कि ऑटोसैश बेकार है यदि पिछले कनेक्शन को स्थानीय होस्ट की तुलना में रिमोट साइड में पहले समय के रूप में माना जाता है, क्योंकि इस मामले में स्थानीय होस्ट फिर से कनेक्ट करने का प्रयास करेगा, लेकिन अग्रेषण स्थापित नहीं किया जा सकता क्योंकि पोर्ट अभी भी खुला है। - Raúl Salinas-Monteagudo


मुझे एक एसएसएच-सुरंग लंबी अवधि को बनाए रखने की आवश्यकता है। मेरा समाधान एक लिनक्स सर्वर से चल रहा था, और यह सिर्फ एक छोटा सी प्रोग्राम है जो कुंजी-आधारित प्रमाणीकरण का उपयोग करके एसएसएच को राहत देता है।

मुझे फांसी के बारे में निश्चित नहीं है, लेकिन टाइमआउट के कारण मुझे सुरंगों की मौत हो गई है।

मुझे respawner के लिए कोड प्रदान करना अच्छा लगेगा, लेकिन मुझे अभी यह प्रतीत नहीं होता है।


1
2017-09-08 13:17





जबकि autossh जैसे टूल्स हैं जो एसएसएच सत्र को पुनरारंभ करने में मदद करते हैं ... मुझे 'स्क्रीन' कमांड चलाने के लिए वास्तव में उपयोगी लगता है। यह आपको डिस्कनेक्ट करने के बाद भी अपने एसएसएच सत्रों को फिर से शुरू करने की अनुमति देता है। विशेष रूप से उपयोगी यदि आपका कनेक्शन उतना विश्वसनीय नहीं है जितना होना चाहिए।

... यह चिह्नित करने के लिए मत भूलना यह सही है अगर यह आपको मदद करता है! ;-)


1
2017-09-08 14:09



... लेकिन सवाल यह था कि एसएसएच सुरंगों को कैसे खोलें, केवल एक टर्मिनल सत्र नहीं। स्क्रीन हालांकि महान है! - akent
मैं पहले से ही स्क्रीन का उपयोग करता हूं, लेकिन यह मेरी समस्या का समाधान नहीं करता है: - / हालांकि, आपके उत्तर के लिए धन्यवाद। - Peltier