tcp-keepalive ทำงานอย่างไรใน ssh


84

ฉันพยายามรหัสเชลล์สคริปต์ที่ใช้การเชื่อมต่อ ssh สำหรับทำ "heartbeats" ฉันต้องการยุติฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ของการเชื่อมต่อหลังจากหมดเวลาที่แน่นอน (หลังจากการเชื่อมต่อลดลง)

สิ่งที่ฉันพบ:

  • TCPKeepAliveใช่ / ไม่ใช่สำหรับsshและsshd
  • ClientAliveCountMaxสำหรับsshd
  • ClientAliveIntervalสำหรับsshd
  • ServerAliveCountMaxสำหรับssh
  • ServerAliveIntervalสำหรับssh

ในการเปลี่ยน "ClientAliveCountMax" ฉันจะต้องแก้ไข sshd_config บนเครื่องเป้าหมายแต่ละเครื่อง (ตัวเลือกนี้ถูกปิดใช้งานตามค่าเริ่มต้น)

ดังนั้นคำถามของฉันคือ - ฉันสามารถใช้ "TCPKeepAlive" เพื่อจุดประสงค์ของฉันได้เช่นกัน (โดยไม่เปลี่ยนแปลงสิ่งอื่นบนเครื่องต้นทาง / ปลายทาง)?

ระบบปฏิบัติการเป้าหมายคือ SLES11 SP2 - แต่ฉันไม่คิดว่าจะเกี่ยวข้องกับที่นี่


พารามิเตอร์เหล่านั้นมีไว้สำหรับสถานการณ์ที่ไฟร์วอลล์หรืออุปกรณ์ตัวกลางพร้อมการเชื่อมต่อจะยุติการเชื่อมต่อ พารามิเตอร์เหล่านั้นใช้สำหรับส่งข้อมูลเป็นระยะเพื่อให้การเชื่อมต่อยังมีชีวิตอยู่และสำหรับการปิดการเชื่อมต่อเมื่อมีการตอบกลับ X ค้างอยู่ คุณช่วยให้รายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่คุณกำลังทำอยู่ได้หรือไม่? คุณใช้ControlMasterตัวเลือกและใช้การเชื่อมต่อแบบทาสหรือไม่?
แพทริค

ฉันแค่ต้องการสร้างวิธีการเพื่อตรวจสอบว่าโหนดอื่น "ลง" โดยใช้การเชื่อมต่อเครือข่ายหลาย ssh กับหลายสายทางกายภาพ ฉันทำสิ่งนี้โดยเพียงแค่เปิดเซสชัน ssh (ที่วนซ้ำไม่มากก็น้อย) ฉันต้องการให้เซสชันนั้นยุติหากการเชื่อมต่อหยุดลง ฉันสงสัยว่าช่วงเวลา / นับสำหรับ TCPKeepalive คืออะไร
นิลส์

คำตอบ:


103

คุณอาจต้องการใช้การตั้งค่า ServerAlive สำหรับสิ่งนี้ พวกเขาไม่ต้องการกำหนดค่าใด ๆ บนเซิร์ฟเวอร์และสามารถตั้งค่าในบรรทัดคำสั่งหากคุณต้องการ

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

นี่จะส่งข้อความ keepalive ssh ทุก 5 วินาทีและถ้าถึงเวลาที่จะส่ง keepalive อื่น แต่การตอบกลับไปยังข้อความล่าสุดไม่ได้รับการเชื่อมต่อจะถูกยกเลิก

ความแตกต่างที่สำคัญระหว่างServerAliveIntervalและTCPKeepAliveคือเลเยอร์ที่ใช้งาน

  • TCPKeepAliveทำงานบนเลเยอร์ TCP ส่งแพ็กเก็ต TCP ACK ที่ว่างเปล่า ไฟร์วอลล์สามารถกำหนดค่าให้เพิกเฉยต่อแพ็กเก็ตเหล่านี้ได้ดังนั้นหากคุณผ่านไฟร์วอลล์ที่หยุดการเชื่อมต่อที่ไม่ได้ใช้งานสิ่งเหล่านี้อาจไม่ทำให้การเชื่อมต่อยังคงอยู่
  • ServerAliveIntervalทำงานบนเลเยอร์ ssh มันจะส่งข้อมูลผ่าน ssh ดังนั้นแพ็กเก็ต TCP มีการเข้ารหัสข้อมูลและไฟร์วอลล์ไม่สามารถบอกได้ว่าเป็นแพ็คเก็ตที่รักษาไว้หรือแพ็กเก็ตที่ถูกกฎหมายดังนั้นสิ่งเหล่านี้จะทำงานได้ดีขึ้น

1
ฉันคิดว่านี่เป็นทิศทางที่ถูกต้อง การทดสอบเบื้องต้นแสดงให้เห็นว่าสิ่งนี้ใช้ได้ผล - มันจะยุติการส่งและรับกระบวนการย่อย ssh / sshd ล่าสุด 5 วินาทีหลังจากการเชื่อมต่อลดลง ฉันเข้าใจว่า TCPKeepalive ใช้เพียง TCP-stack-defaults - ดังนั้นจึงยากที่จะกำหนดค่าเช่นกัน
นิลส์

วิธีนี้จะช่วยแก้ปัญหาผีผู้ใช้ ฉันเชื่อว่าสิ่งนี้สามารถทำได้ในการตั้งค่า PuTTYเปลี่ยนSeconds between keepalivesเป็น 1800 ภายใต้การตั้งค่า | สัมพันธ์
Bob Stein

7

TCPKeepAliveตัวเลือกที่เป็นจริงเป็นวิธีการที่แตกต่างกันมากในการรักษาชีวิตการเชื่อมต่อจากตัวเลือก ClientAlive เหมือนหรือ ServerAlive เหมือน

เป็นหน้าคู่มือ BSD SSHเราสามารถอ่านได้ว่า:

ข้อความที่มีชีวิตของลูกค้าจะถูกส่งผ่านช่องทางเข้ารหัสดังนั้นจะไม่สามารถปลอมแปลงได้ ตัวเลือก TCP keepalive ที่เปิดใช้งานโดยTCPKeepAlivespoofable กลไกการทำงานของไคลเอนต์มีค่าเมื่อไคลเอนต์หรือเซิร์ฟเวอร์ขึ้นอยู่กับการรู้ว่าเมื่อการเชื่อมต่อไม่ทำงาน

TCPKeepAliveตรวจสอบให้แน่ใจว่าระบบจะส่งข้อความ TCP keepalive ไปด้านอื่น ๆ ตัวเลือกเริ่มต้นจะเปิดใช้งานเสมอ

หากคุณกำลังใช้คุณสามารถปิดการใช้งานClientAliveInterval TCPKeepAliveตัวเลือกนี้จะส่งข้อความผ่านแชนเนลที่เข้ารหัสเพื่อร้องขอการตอบสนองจากลูกค้า (ค่าเริ่มต้นคือ 0 ดังนั้นจึงไม่มีข้อความถูกส่งไปยังไคลเอนต์) และClientAliveCountMaxตั้งค่าจำนวนข้อความที่มีชีวิตของไคลเอ็นต์ก่อนที่ sshd จะยกเลิกการเชื่อมต่อไคลเอ็นต์ เซสชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.