Ssh में tcp-keepalive कैसे काम करता है?


84

मैं एक शेल-स्क्रिप्ट को कोड करने की कोशिश कर रहा हूं जो "दिल की धड़कन" करने के लिए एक ssh-कनेक्शन का उपयोग करता है। मैं उस कनेक्शन के क्लाइंट- और सर्वर-साइड को एक निश्चित समय समाप्त होने के बाद (कनेक्शन ड्रॉप होने के बाद) समाप्त करना चाहता हूं।

मुझे अब तक क्या मिला:

  • TCPKeepAlive हाँ / नहीं ssh और sshd के लिए
  • ClientAliveCountMax के लिए sshd
  • ClientAliveInterval के लिए sshd
  • ServerAliveCountMax के लिए ssh
  • ServerAliveInterval के लिए ssh

"ClientAliveCountMax" को बदलने के लिए मुझे प्रत्येक लक्ष्य मशीन पर sshd_config को संशोधित करना होगा (यह विकल्प डिफ़ॉल्ट रूप से अक्षम है)।

तो मेरा सवाल है - क्या मैं अपने उद्देश्यों के लिए "TCPKeepAlive" का उपयोग कर सकता हूं, वह भी (स्रोत / लक्ष्य पर कुछ और बदले बिना)?

लक्ष्य ऑपरेटिंग सिस्टम SLES11 SP2 है - लेकिन मुझे नहीं लगता कि यह यहां प्रासंगिक है।


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

मैं सिर्फ यह निर्धारित करने के लिए एक साधन का निर्माण करना चाहता हूं, अगर एक और नोड कई भौतिक लाइनों के साथ ssh-network कनेक्शन का उपयोग करके "डाउन" है। मैं इसे केवल ssh-session (यानी कमोबेश अंतहीन लूप) खोलकर करता हूं। मैं चाहता हूं कि अगर कनेक्शन टूटता है तो वह सत्र समाप्त हो जाए। मैं सोच रहा हूँ कि TCPKeepalive के लिए अंतराल / गणना क्या है।
निल्स

जवाबों:


103

आप शायद इसके लिए ServerAlive सेटिंग्स का उपयोग करना चाहते हैं। उन्हें सर्वर पर किसी भी कॉन्फ़िगरेशन की आवश्यकता नहीं है, और यदि आप चाहें तो कमांड लाइन पर सेट किया जा सकता है।

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

यह हर 5 सेकंड में एक ssh कीपैलिव मैसेज भेजेगा, और अगर यह समय है कि एक और कीपैलिव भेजा जाए, लेकिन पिछले एक का जवाब नहीं मिला, तो कनेक्शन समाप्त हो गया है।

के बीच महत्वपूर्ण अंतर ServerAliveIntervalऔर TCPKeepAliveवह परत है जो वे काम करते हैं।

  • TCPKeepAliveTCP लेयर पर काम करता है। यह एक खाली TCP ACK पैकेट भेजता है। इन पैकेटों को नजरअंदाज करने के लिए फायरवॉल को कॉन्फ़िगर किया जा सकता है, इसलिए यदि आप एक फ़ायरवॉल से गुजरते हैं जो निष्क्रिय कनेक्शन को छोड़ देता है, तो यह कनेक्शन को जीवित नहीं रख सकता है।
  • ServerAliveIntervalssh लेयर पर काम करता है। यह वास्तव में ssh के माध्यम से डेटा भेजेगा, इसलिए टीसीपी पैकेट ने डेटा को एन्क्रिप्ट किया है और फ़ायरवॉल यह नहीं बता सकता है कि क्या यह एक मुख्य या वैध पैकेट है, इसलिए ये बेहतर काम करते हैं।

1
मुझे लगता है कि यह सही दिशा है। प्रारंभिक परीक्षणों से पता चला है कि यह काम करेगा - यह कनेक्शन ड्रॉप होने के बाद ssh / sshd सबप्रोसेस को नवीनतम 5 सेकंड भेजने और प्राप्त करने को समाप्त करेगा। मुझे लगता है कि TCPKeepalive बस टीसीपी-स्टैक-चूक का उपयोग करता है - इसलिए इसे कॉन्फ़िगर करना कठिन है, भी।
निल्स

यह भी भूत-उपयोगकर्ता की समस्या को हल करता है। मेरा मानना ​​है कि यह PuTTY सेटिंग्स में भी किया जा सकता है , Seconds between keepalivesसेटिंग्स के तहत 1800 में बदल रहा है | कनेक्शन।
बॉब स्टीन

7

TCPKeepAliveविकल्प वास्तव में ClientAlive की तरह या ServerAlive की तरह विकल्पों में से जिंदा कनेक्शन रखने का एक बहुत अलग तरीका है।

प्रति BSD SSH मैनुअल पेज हैं , हम इसे पढ़ सकते हैं:

क्लाइंट जिंदा संदेश एन्क्रिप्टेड चैनल के माध्यम से भेजे जाते हैं और इसलिए यह खराब नहीं होंगे। इसके द्वारा सक्षम टीसीपी रखने का विकल्प TCPKeepAliveखराब है। जब क्लाइंट या सर्वर किसी कनेक्शन के निष्क्रिय हो जाने पर निर्भर करते हैं, तो क्लाइंट ज़िंदा तंत्र मूल्यवान होता है।

यह TCPKeepAliveसुनिश्चित करें कि क्या सिस्टम को दूसरी तरफ टीसीपी रखने के संदेश भेजने चाहिए। डिफ़ॉल्ट विकल्प हमेशा सक्षम होता है।

यदि आप उपयोग कर रहे हैं ClientAliveInterval, तो आप अक्षम कर सकते हैं TCPKeepAlive। यह विकल्प एन्क्रिप्ट किए गए चैनल के माध्यम से ग्राहक से प्रतिक्रिया का अनुरोध करने के लिए एक संदेश भेजेगा (डिफ़ॉल्ट 0 है, इसलिए ग्राहक को कोई संदेश नहीं भेजा जाता है) और ClientAliveCountMaxक्लाइंट के संदेशों की संख्या निर्धारित करता है इससे पहले कि sshd क्लाइंट को डिस्कनेक्ट कर देगा, एप्लिकेशन को समाप्त कर देगा सत्र।

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