ตัวเลือก 'ServerAliveInterval` และ' ClientAliveInterval` ใน sshd_config ทำอะไรได้บ้าง


161

ฉันพบคำถามนี้แต่ฉันขอโทษฉันไม่ค่อยเข้าใจการตั้งค่าของตัวแปรสองตัวServerAliveIntervalและClientAliveIntervalกล่าวถึงในการตอบรับที่ยอมรับ หากเซิร์ฟเวอร์ภายในของฉันหมดเวลาฉันควรตั้งค่านี้เป็นศูนย์หรือไม่ มันจะไม่หมดเวลาหรือไม่? ฉันควรตั้งไว้ที่ 300 วินาทีหรืออะไรซักอย่างแทน?

คำถามของฉันเป็นเพียงการเชื่อมต่อของฉันบางครั้งหมดเวลาเมื่อฉันระงับแล้วยกเลิกการระงับแล็ปท็อปของฉันด้วยการตอบสนองWrite failed: Broken pipeและบางคนไม่ได้ ฉันจะกำหนดค่า sshd ในพื้นที่ให้ถูกต้องได้อย่างไรเพื่อที่จะไม่ล้มเหลวด้วยไปป์ที่ขาด

คำตอบ:


202

ServerAliveInterval : จำนวนวินาทีที่ไคลเอ็นต์จะรอก่อนส่งแพ็กเก็ต null ไปยังเซิร์ฟเวอร์ (เพื่อให้การเชื่อมต่อมีชีวิตชีวา)

ClientAliveInterval : จำนวนวินาทีที่เซิร์ฟเวอร์จะรอก่อนที่จะส่งแพ็กเก็ต null ไปยังไคลเอ็นต์ (เพื่อให้การเชื่อมต่อยังคงอยู่)

การตั้งค่า 0 (ค่าเริ่มต้น) จะปิดใช้งานคุณสมบัติเหล่านี้เพื่อให้การเชื่อมต่อของคุณอาจลดลงหากไม่ได้ใช้งานนานเกินไป

ServerAliveInterval น่าจะเป็นกลยุทธ์ที่ใช้กันทั่วไปในการเชื่อมต่อ เพื่อป้องกันปัญหาท่อแตก, นี่คือ ssh config ที่ฉันใช้ในไฟล์. ssh / config ของฉัน:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

การตั้งค่าข้างต้นจะทำงานในวิธีดังต่อไปนี้

  1. ไคลเอนต์จะรอไม่ได้ใช้งานเป็นเวลา 60 วินาที (เวลา ServerAliveInterval) และส่ง "no-op null packet" ไปยังเซิร์ฟเวอร์และคาดหวังการตอบสนอง หากไม่มีการตอบสนองก็จะพยายามทำตามขั้นตอนข้างต้นจนถึง 10 (ServerAliveCountMax) ครั้ง (600 วินาที) หากเซิร์ฟเวอร์ยังคงไม่ตอบสนองไคลเอ็นต์จะยกเลิกการเชื่อมต่อ ssh

ClientAliveCountMax ทางฝั่งเซิร์ฟเวอร์อาจช่วยได้เช่นกัน นี่เป็นขีด จำกัด ว่าลูกค้าจะได้รับอนุญาตให้ตอบสนองก่อนที่จะถูกตัดการเชื่อมต่อ ค่าเริ่มต้นคือ 3 เช่นเดียวกับสาม ClientAliveInterval


ตกลงดังนั้นฉันจะตีความศูนย์วินาทีเพื่อบ่งบอกว่า "อย่าทำให้มีชีวิต" ซึ่งเป็นสาเหตุที่ไม่สำรวจความคิดเห็นของลูกค้า / เซิร์ฟเวอร์
M. Tibbits

3
yup 0 = อย่าส่งแพ็กเก็ตว่าง ที่แตกต่างกันก็คือ ServerAliveInterval ตั้งอยู่ในการกำหนดค่าไคลเอนต์ในขณะที่ ClientAliveInternal ตั้งอยู่ในการกำหนดค่าเซิร์ฟเวอร์
บาร์เธเลมี

8
ดูเหมือนว่าคำแนะนำที่ดีในการป้องกันความเกียจคร้านทำให้หมดเวลา แต่ฉันไม่เข้าใจว่าเกี่ยวข้องกับคำถาม OP ของการป้องกันท่อแตกเมื่อลูกค้าหยุดพัก เมื่อหลับลูกค้าจะไม่สามารถส่งแพ็คเก็ตที่เป็นโมฆะดังนั้นการตั้งค่านี้จะเป็นที่สงสัย?
Sparhawk

ส่วน ServerAlive นั้นแน่นอน ClientAliveInterval / ClientAliveCountMax เป็นสิ่งที่จะช่วยได้ที่นี่
javawizard

1
เมื่อมองย้อนกลับไปที่คำตอบเก่านี้ฉันเชื่อว่าตอบคำถามในชื่อและไม่ใช่คำถามในวรรคสองดังนั้นความคิดเห็นเกี่ยวกับ ServerAliveInternal จะไม่เป็นประโยชน์สำหรับการระงับซึ่งฉันเห็นด้วย @JonasWielicki ClientAliveInterval อาจไม่ดีในกรณีที่ถูกระงับเนื่องจากไคลเอ็นต์ที่ถูกระงับจะไม่ตอบเซิร์ฟเวอร์และในที่สุดเซิร์ฟเวอร์จะยกเลิกการเชื่อมต่อไคลเอ็นต์หลังจาก ClientAliveCountMax
บาร์เธเลมี

18

นี่คือคำอธิบายในsshd_configคู่มือ ( man sshd_config):

ClientAliveInterval

ตั้งค่าช่วงเวลาหมดเวลาเป็นวินาทีหลังจากนั้นหากไม่ได้รับข้อมูลจากลูกค้า sshd จะส่งข้อความผ่านแชนเนลที่เข้ารหัสเพื่อร้องขอการตอบกลับจากลูกค้า ค่าเริ่มต้นคือ 0 ระบุว่าข้อความเหล่านี้จะไม่ถูกส่งไปยังลูกค้า ตัวเลือกนี้ใช้กับโปรโตคอลรุ่น 2 เท่านั้น

ClientAliveCountMax

ค่าเริ่มต้นคือ 3 หากClientAliveInterval(ดูด้านล่าง) ตั้งไว้ที่ 15 และClientAliveCountMaxปล่อยไว้ที่ค่าเริ่มต้นไคลเอ็นต์ SSH ที่ไม่ตอบสนองจะถูกยกเลิกการเชื่อมต่อหลังจากผ่านไปประมาณ 45 วินาที ตัวเลือกนี้ใช้กับโปรโตคอลรุ่น 2 เท่านั้น

สำหรับตัวเลือกไคลเอนต์ดูคำอธิบายในman ssh_config:

ServerAliveInterval

ตั้งค่าช่วงเวลาหมดเวลาเป็นวินาทีหลังจากนั้นหากไม่ได้รับข้อมูลจากเซิร์ฟเวอร์sshจะส่งข้อความผ่านแชนเนลที่เข้ารหัสเพื่อร้องขอการตอบกลับจากเซิร์ฟเวอร์ ค่าเริ่มต้นคือ 0 ระบุว่าข้อความเหล่านี้จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ ตัวเลือกนี้ใช้กับโปรโตคอลรุ่น 2 เท่านั้น

ServerAliveCountMax

ค่าเริ่มต้นคือ 3 ถ้าเช่นServerAliveIntervalตั้งเป็น 15 และServerAliveCountMaxปล่อยไว้ที่ค่าเริ่มต้นหากเซิร์ฟเวอร์ไม่ตอบสนองsshจะตัดการเชื่อมต่อหลังจากประมาณ 45 วินาที ตัวเลือกนี้ใช้กับโปรโตคอลรุ่น 2 เท่านั้น

จากด้านบน 0 หมายถึงมันถูกปิดการใช้งาน ดังนั้นคุณควรตั้งค่าเหล่านี้ให้สูงพอที่จะหลีกเลี่ยงข้อผิดพลาดของPipe


โพสต์ที่เป็นประโยชน์ แต่ฉันรู้สึกผิดหวังกับสิ่งนี้ ฉันกำลังกำหนดช่วงเวลาขนาดใหญ่ทั่วสถานที่และการเชื่อมต่อของฉันยังคงได้รับการทำลายหลังจากเพียงไม่กี่นาที (ใช้ openssh บน Ubuntu ไม่แน่ใจว่าเกี่ยวข้องหรือไม่)
Sridhar Sarnobat

1
@ user7000 กำหนดค่าทั้งไคลเอ็นต์ (ssh) และเซิร์ฟเวอร์ (sshd) นี้อาจช่วยให้: วิธีการแก้ไขปัญหาเกี่ยวกับ 'การเชื่อมต่อ SSH ถูกปิดโดยไม่คาดคิดโดยสิ้นสุดระยะไกล'
kenorb

ฉันคิดว่าฉันได้รับที่ไหนสักแห่ง อาจเป็นเพราะฉันไม่ได้เว้นช่องว่างไว้ก่อนหน้านี้ServerAliveIntervalในไฟล์ปรับแต่งของฉัน
Sridhar Sarnobat

15

คำตอบจากบาร์เธเลมีนั้นเจ๋ง แต่ไม่ถึงต้นตอของปัญหา คุณระงับเครื่องของคุณและต้องการให้เซสชัน SSH ยังมีชีวิตอยู่เมื่อคุณบูตเครื่องคอมพิวเตอร์

ไม่มีการกำหนดค่าดังกล่าวสำหรับ ssh ที่จะทำให้การเชื่อมต่อยังคงอยู่เหมือนเดิม SSH ใช้ TCP สำหรับการเริ่มต้นคุณต้องใช้การจับมือสามทางจากนั้นให้คงอยู่หลังจากไม่ได้ใช้งาน เมื่อคุณปิดระบบ / ไฮเบอร์เนตการเชื่อมต่อ TCP ทั้งหมดของคุณจะปิดด้วย FIN ไม่มีทางเอาชนะได้

สำหรับวิธีแก้ปัญหาสกปรกคุณสามารถใช้ VPS หรือกล่องออนไลน์อื่นที่มีหน้าจอเพื่อรักษาการเชื่อมต่อ คำแนะนำของฉันไม่ได้ทำเพื่อความปลอดภัย


1
อันที่จริงนี่เป็นคำตอบเดียวเท่านั้น
Calimo

1
นี่เป็นวิธีแก้ปัญหาความปลอดภัยที่น่ากลัวไม่เคยทำเช่นนั้น
jahrichie

14

เนื่องจากคุณไม่สามารถรับประกันได้ว่าการเชื่อมต่อ SSH (เป็น TCP) จะยังคงมีอยู่เมื่อปลายด้านหนึ่งหยุดส่ง ACK ไปยังแพ็กเก็ตที่ได้รับฉันจึงใช้http://www.harding.motd.ca/autossh/เป็นการส่วนตัวเพื่อเริ่มการเชื่อมต่อ SSH ทั้งหมดของฉัน เกือบจะทันทีที่ฉันยกเลิกการระงับ

เนื่องจากหน้าจอ GNU จะถูกใช้งานในฝั่งเซิร์ฟเวอร์การติดตั้งใหม่จะพาฉันไปยังที่ที่ฉันเคยเป็นมาก่อน

คุณสามารถมีได้ฟังบนพอร์ตพิเศษเพื่อที่จะตรวจสอบอย่างต่อเนื่องการเชื่อมต่อยังมีชีวิตอยู่ แต่ส่วนตัวผมพบว่ามันทำงานได้ดีพอกับคนพิการและเพียงแค่อาศัย SSH ของตัวเอง/ServerAliveIntervalServerAliveCountMax

ตัวเลือกอื่นคือhttp://mosh.mit.edu/ซึ่งใช้ UDP และกู้คืนอย่างราบรื่นจากการขาดการเชื่อมต่อในระยะยาว


5

คุณยังสามารถเรียกใช้คำสั่งด้วยnohupหากคุณต้องการให้พวกเขาทำงานโดยไม่คำนึงถึงการเชื่อมต่อ SSH ของคุณ

เช่น

$ nohup tar -xzf some_huge.tar.gz &

&มีที่ผมคิดว่าไม่จำเป็น แต่จะสะดวกเพราะมันทำให้กระบวนการทำงานในพื้นหลังเพื่อให้คุณสามารถทำสิ่งอื่น ๆ

ฉันมักจะใช้ nohup สำหรับกระบวนการใด ๆ ที่ใช้เวลาสักครู่ดังนั้นฉันจึงไม่ต้องเริ่มต้นใหม่หากฉันขาดการเชื่อมต่อไม่ว่าจะด้วยเหตุผลใด - ไฟดับ (ที่ตำแหน่งระยะไกลของฉัน


หมายเหตุ nohup บน zsh ทำงานไม่ถูกต้อง!
Sridhar Sarnobat

@ user7000 สิ่งที่ไม่เหมาะสมเกี่ยวกับเรื่องนี้?
Buttle Butkus

ฉันจำไม่ได้ฉันคิดว่าโดยทั่วไปแล้วจะไม่ทำให้กระบวนการทำงานหลังจากลูกค้าถูกตัดการเชื่อมต่อ ไม่กี่ปีที่ผ่านมาและฉันหยุดใช้ nohup และใช้การปฏิเสธแทน
Sridhar Sarnobat

2
ฉันเดาว่าzshผู้ใช้ควรติดกับdisown -hแทนnohupเว้นแต่จะได้รับการแก้ไขปัญหาตั้งแต่นั้นมา
Buttle Butkus

0

ใส่เซสชั่นที่ยาวนานของคุณเข้าสู่หน้าจอดูรายละเอียดที่หน้าจอ -h

ด้วยวิธีนี้คุณสามารถเชื่อมต่อกับเครื่องใหม่โดยใช้ ssh และใส่กลับเข้าไปที่เซสชันหน้าจออีกครั้ง


ฉันสงสัยว่าร้อยละของผู้ที่แนะนำหน้าจอใช้งานจริงด้วยตนเอง
Sridhar Sarnobat

ฉันคิดว่า tmux เป็นคำแนะนำที่ดีกว่าตรวจสอบวันที่แก้ไขรหัสgithub.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.