ฉันจะป้องกันไม่ให้เซสชัน SSH ของฉันหยุดนิ่งได้อย่างไร


66

ฉันมีServerAliveIntervalและในกรณีที่มีเครื่องไม่กี่เครื่องที่ClientAliveIntervalตั้งค่าเป็น 540 ในไฟล์การกำหนดค่าไคลเอนต์ / เซิร์ฟเวอร์ SSH (ฉันคิดว่าการตั้งค่าเป็นมากกว่านั้นจะไม่ใช่ความคิดที่ดี) ฉันทำงานกับเซสชัน SSH จำนวนมากซึ่งปัจจุบันหยุดทำงานหลังจากไม่กี่นาที

ฉันจะแก้ไขได้อย่างไร สิ่งที่ฉันต้องการคือการมีเซสชั่นที่จะไม่หยุดเลยดังนั้นถ้าฉันเปิดเซสชั่นที่ 8 และไม่ใช้มันเป็นเวลา 4 ชั่วโมงตัวอย่างเช่นยังคงใช้อีกครั้งที่ 12 โดยไม่ต้องเข้าสู่ระบบอีกครั้ง .


คุณสามารถอยู่ในระบบได้นานเท่าไร (สมมติว่านี่ไม่ได้เกิดจากการขาดการเชื่อมต่อเครือข่าย)? TCPKeepAlive yes?
iyrin

ฉันไม่แน่ใจ แต่ 10 นาที ที่มากที่สุด. สำหรับTCPKeepAlive yes- ขึ้นอยู่กับเครื่อง
syntagma

11
เพียงแค่ใช้ร็อก ?
วิ

1
หรือคุณสามารถใช้autossh...
ThoriumBR

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

คำตอบ:


80

การเปลี่ยนแปลงที่คุณทำ/etc/ssh/ssh_configและ/etc/ssh/sshd_configถูกต้อง แต่จะยังไม่มีผลใด ๆ

ในการทำให้การกำหนดค่าของคุณใช้งานได้ให้ทำการเปลี่ยนแปลงการกำหนดค่าเหล่านี้บนไคลเอนต์:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

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

NULL แพ็คเก็ต ถูกส่งโดยเซิร์ฟเวอร์ไปยังลูกค้า แพคเก็ตเดียวกันถูกส่งโดยไคลเอนต์ไปยังเซิร์ฟเวอร์ แพคเก็ต TCP NULL ไม่มีการตั้งค่าสถานะการควบคุมใด ๆ เช่น SYN, ACK, FIN เป็นต้นเนื่องจากเซิร์ฟเวอร์ไม่ต้องการการตอบกลับจากไคลเอนต์ แพ็คเก็ต NULL อธิบายไว้ที่นี่: https://tools.ietf.org/html/rfc6592

จากนั้นกำหนดค่าส่วน sshd บนเซิร์ฟเวอร์

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

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

TCPKeepAliveมีไว้เพื่อให้แน่ใจว่าไฟร์วอลล์บางตัวไม่ปล่อยการเชื่อมต่อที่ไม่ได้ใช้งาน

ClientAliveCountMax Server จะส่งข้อความสดไปยังลูกค้าแม้ว่าจะไม่ได้รับข้อความใด ๆ กลับมาจากลูกค้า

ในที่สุดก็เริ่มต้นใหม่ ssh server

service ssh restart หรือ service sshd restartขึ้นอยู่กับระบบที่คุณใช้


ฉันคิดว่าServerAliveCountMaxจำเป็นต้องมีค่าสูงเพื่อให้สิ่งนี้เชื่อถือได้มากที่สุด และถ้าทั้งสองServerAliveIntervalและมีการตั้งค่าต่ำพอที่ผมไม่คิดว่าจะมีความจำเป็นสำหรับการใดClientAliveIntervalTCPKeepAliveนอกจากนี้หากมีมิดเดิลแวร์ใด ๆ พวกเขาจะยังคงอยู่ในสถานะที่แม้ว่าการตั้งค่าทั้งหมดที่กล่าวถึงก่อนหน้านี้ได้กำหนดค่าไว้ถูกต้อง มันอาจช่วยในการใช้ MPTCP (ถ้าทั้งไคลเอนต์และเซิร์ฟเวอร์สนับสนุน)
kasperd

ไม่ชัดเจนในตอนเริ่มต้นว่าคุณหมายถึงการกำหนดค่าที่ฝั่งไคลเอ็นต์หรือฝั่งเซิร์ฟเวอร์ (ในที่สุดฉันก็สรุปได้ว่าฝั่งไคลเอ็นต์) จากนั้นที่คำอธิบายServerAliveIntervalคุณพูดว่า "ไคลเอนต์จะส่ง ... ไปยังเซิร์ฟเวอร์" แต่ในย่อหน้าถัดไป " แพ็กเก็ต NULLถูกส่งโดยเซิร์ฟเวอร์ไปยังไคลเอนต์" ฉันพบว่ามันสับสนเล็กน้อย
Craig McQueen

1
หลังจากเพิ่มเซิร์ฟเวอร์ฉันได้รับ: / etc / ssh / ssh_config: line 57: ตัวเลือกการกำหนดค่าไม่ดี: clientaliveinterval / etc / ssh / ssh_config: บรรทัด 59: ตัวเลือกการกำหนดค่าไม่ดี: clientalivecountmax
Anders

2
@Anders คุณจะได้รับข้อผิดพลาดเพราะClientAliveIntervalและClientAliveCountMaxเป็นตัวเลือกเซิร์ฟเวอร์ ssh ดังนั้นจึงมีความหมายสำหรับsshd_configและไม่ssh_config
Valentin Bajrami

1
@chandresh คุณไม่จำเป็นต้อง หลังจากแก้ไขssh_configเซสชันใหม่จะอ่านไฟล์นั้น /etc/environmentไฟล์เป็นสิ่งที่แตกต่างกันซึ่งมีรูปแบบของการVAR="value" ไม่มีช่องว่างจึงVAR = "value"จะไม่ถูกต้อง การหาแหล่ง/etc/ssh/ssh_configที่จะอ่านคือ: Port 22หรือHost * ซึ่งจะถือเป็นคำสั่ง
Valentin Bajrami

13

ข้อเสนอแนะส่วนบุคคล: ใช้screenบนโฮสต์ระยะไกล; มันจะจัดการเพื่อให้การเชื่อมต่อของคุณยังคงมีชีวิตอยู่ตราบเท่าที่มันยังคงใช้งานอยู่ในสถานี

นี่คือสิ่งที่ฉันมักจะเพิ่มเพื่อ/etc/screenrcระบุตัวตนอย่างรวดเร็วของเซสชันหน้าจอของฉัน:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

แก้ไข:คำแนะนำ

hardstatusสตริงจะแสดงด้านล่างบรรทัดสถานะเช่นนี้: ตัวอย่างเซสชันหน้าจอที่มีสามแท็บเปิด

บัฟเฟอร์การเลื่อนกลับถูกขยายไปยัง 8192 บรรทัดแทน 1000-1500 ปกติ (ขึ้นอยู่กับการแจกแจง)


ขอบคุณสองคำถาม: 1. คุณช่วยอธิบายตัวเลือกต่าง ๆ ในscreenrcไฟล์ของคุณได้ไหม? ฉันจะกำหนดค่าระบบในหน้าจอเรียกใช้งาน / tmux หลังจากที่ฉันเข้าสู่ระบบได้อย่างไร?
syntagma

8
เพียงเพื่อชี้แจงscreenไม่ได้เชื่อมต่อ SSH ของคุณยังมีชีวิตอยู่ มันรันกระบวนการในเทอร์มินัลเสมือนโดยอิสระจากเทอร์มินัลผู้ใช้ที่คุณเชื่อมต่อผ่านsshดังนั้นกระบวนการไม่พึ่งพาการเชื่อมต่อของคุณ คุณจะยังคงสูญเสียsshการเชื่อมต่อจนกว่าจะได้รับการแก้ไข
iyrin

1
โดย " รักษาการเชื่อมต่อยังมีชีวิตอยู่ " โดยพื้นฐานแล้วฉันหมายถึง " ป้องกันการเชื่อมต่อไม่ได้ทำงาน " ซึ่งมีผลเหมือนกัน หากไม่มีการป้อนข้อมูลเป็นเวลา 4 ชั่วโมง SSH จะไม่ทำงานและปิดการเชื่อมต่อในที่สุดกระบวนการลูกทั้งหมดก็หายไปเช่นกัน

2
เท่าที่ฉันรักผมแนะนำให้ผู้ใช้ใหม่จะเริ่มต้นด้วยscreen tmux
dotancohen

2

ด้วย OpenSSH:

คุณต้องเปิดใช้งาน

TCPKeepAlive yes

ทั้งในไคลเอ็นต์ ssh_config (เช่น/etc/ssh/ssh_configหรือใน~/.ssh/config) และเซิร์ฟเวอร์ SSH ปลายทางของคุณใช้ OpenSSH (เช่น / etc / ssh / sshd_config)

ดังนั้นทุกครั้งที่ไม่มีการเชื่อมต่อ OpenSSH จะส่งแพ็กเก็ตจำลองไปยังโฮสต์ปลายทางของคุณ ...


สิ่งนี้ยังสามารถทำให้การเชื่อมต่อลดลงThe default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. linux.die.net/man/5/sshd_config
iyrin

สุจริต แต่"[…] network goes down […] client host crashes […] route is down […]"เป็นข้อผิดพลาดที่รุนแรงไม่มีการกำหนดค่า SSH ที่สามารถตรวจจับได้ ปัญหาหลักของที่นี่คือเซสชัน SSH ที่ไม่ทำงานไม่ใช่ความล้มเหลวของเครือข่าย ดังนั้นเพื่อสรุป: - เปิดใช้งานTCPKeepAlive yesทั้งในเซิร์ฟเวอร์และลูกค้า - ตั้งClientAliveInterval บนเซิร์ฟเวอร์ - ตั้งIdleTimeoutบนเซิร์ฟเวอร์ - ตั้งClientAliveCountMax ที่ควรทำเคล็ดลับ ...
มาร์ติน Allert

2

หากปัญหาคือแล็ปท็อปที่จำศีลหรือการเชื่อมต่อเครือข่ายน้อยกว่า prefect ฉันขอแนะนำให้ใช้moshสิ่งที่ทำงานมากกว่าsshและอนุญาตให้เชื่อมต่อใหม่โดยอัตโนมัติ

จากเว็บไซต์ :

Mosh (เชลล์มือถือ)

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

Mosh แทน SSH มันแข็งแกร่งและตอบสนองได้ดียิ่งขึ้นโดยเฉพาะผ่าน Wi-Fi, เซลลูล่าร์และลิงค์ทางไกล

Mosh เป็นซอฟต์แวร์ฟรีสำหรับ GNU / Linux, BSD, macOS, Solaris, Android, Chrome และ iOS

เมื่อใช้ร่วมกับtmux(หรือรุ่นเก่ากว่าscreen) สิ่งนี้ทำให้ฉันสามารถเชื่อมต่อผ่านsshไปยังเซิร์ฟเวอร์จากแล็ปท็อปของฉันและเชื่อมต่อตลอดเวลาแม้จะเปลี่ยนการเชื่อมต่อ wifi และการตกหล่นของข้อมูลมือถือ


นี่คือลิงค์ไปยังmosh.orgและเพื่อmosh บน Github
joeytwiddle

1

ตรวจสอบการตั้งค่า sshd ของคุณบนเครื่องโฮสต์/etc/sshd_configสำหรับการตั้งค่า IdleTimeout

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.