Làm cách nào tôi có thể giữ các phiên SSH của mình không bị đóng băng?


66

Tôi có ServerAliveIntervalvà trong trường hợp một số máy cũng ClientAliveIntervalđược đặt thành 540 trong các tệp cấu hình máy khách / máy chủ SSH (tôi cho rằng cài đặt nó thành nhiều hơn sẽ không phải là một ý tưởng hay). Tôi làm việc với nhiều phiên SSH hiện đang đóng băng sau vài phút.

Làm thế nào tôi có thể sửa chữa nó? Điều tôi muốn là có một phiên để không bị đóng băng, vì vậy nếu tôi mở một phiên lúc 8 giờ và không sử dụng nó trong 4 giờ, chẳng hạn, vẫn sử dụng lại vào lúc 12 mà không phải đăng nhập lại .


Hiện tại bạn có thể duy trì trạng thái đăng nhập bao lâu (giả sử điều này không phải do ngắt kết nối mạng)? TCPKeepAlive yes?
iyrin

Tôi không chắc nhưng 10 phút. nhất. Như cho TCPKeepAlive yes- phụ thuộc vào máy.
cú pháp

11
Chỉ cần sử dụng mosh ?
Vi.

1
Hoặc bạn có thể sử dụng autossh...
ThoriumBR

Tôi muốn nói rằng để kết nối mở trong 4 giờ là một vấn đề bảo mật và screenthay vào đó bạn nên sử dụng . Nhưng tôi vẫn nêu lên câu hỏi của bạn vì tôi đang gặp vấn đề tương tự chỉ sau một hoặc hai phút.
Dale Anderson

Câu trả lời:


80

Những thay đổi bạn đã thực hiện /etc/ssh/ssh_config/etc/ssh/sshd_configlà chính xác nhưng vẫn sẽ không có hiệu lực.

Để cấu hình của bạn hoạt động, hãy thực hiện các thay đổi cấu hình này trên máy khách:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval Máy khách sẽ gửi một gói null đến máy chủ cứ sau 100 giây để duy trì kết nối.

Gói NULL được máy chủ gửi đến máy khách. Các gói tương tự được gửi bởi máy khách đến máy chủ. Gói TCP NULL không chứa bất kỳ cờ kiểm soát nào như SYN, ACK, FIN, v.v. vì máy chủ không yêu cầu trả lời từ máy khách. Gói NULL được mô tả ở đây: https://tools.ietf.org/html/rfc6592

Sau đó cấu hình phần sshd trên máy chủ.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Máy chủ sẽ đợi 60 giây trước khi gửi gói null đến máy khách để duy trì kết nối.

TCPKeepAlive Có để đảm bảo rằng một số tường lửa nhất định không làm mất kết nối nhàn rỗi.

ClientAliveCountMax Server sẽ gửi tin nhắn trực tiếp đến máy khách mặc dù nó không nhận được bất kỳ tin nhắn nào từ máy khách.

Cuối cùng khởi động lại ssh server

service ssh restart hoặc service sshd restarttùy thuộc vào hệ thống bạn đang trên.


Tôi nghĩ rằng một mức cao ServerAliveCountMaxcũng là cần thiết để điều này là đáng tin cậy nhất có thể. Và nếu cả hai ServerAliveIntervalClientAliveIntervalđược đặt đủ thấp, tôi không nghĩ sẽ có nhu cầu TCPKeepAlive. Ngoài ra, nếu có bất kỳ hộp trung gian nào, chúng vẫn có thể mất trạng thái ngay cả với tất cả các cài đặt được đề cập trước đó được định cấu hình chính xác. Nó có thể giúp sử dụng MPTCP (nếu cả máy khách và máy chủ đều hỗ trợ nó).
kasperd

Lúc đầu, không rõ là bạn định cấu hình ở phía máy khách hay phía máy chủ (cuối cùng tôi kết luận, phía máy khách). Sau đó, tại mô tả ServerAliveInterval , bạn nói "máy khách sẽ gửi ... đến máy chủ", nhưng trong đoạn tiếp theo " gói NULL được máy chủ gửi đến máy khách". Tôi thấy những điều này một chút khó hiểu.
Craig McQueen

1
Sau khi thêm vào máy chủ, tôi nhận được: / etc / ssh / ssh_config: dòng 57: Tùy chọn cấu hình không hợp lệ: clientaliveinterval / etc / ssh / ssh_config: dòng 59: Tùy chọn cấu hình xấu: clientalivecountmax
Anders

2
@Anders Bạn gặp lỗi vì ClientAliveIntervalClientAliveCountMaxlà các tùy chọn máy chủ ssh, do đó có nghĩa là sshd_configkhông vàssh_config
Valentin Bajrami

1
@ Vendresh bạn không phải. Sau khi sửa đổi ssh_configcác phiên mới sẽ đọc tệp đó. Các /etc/environmenttập tin là một điều khác nhau có định dạng VAR="value" không có không gian do đó VAR = "value"sẽ không hợp lệ. Tìm nguồn /etc/ssh/ssh_configtheo cách đó tức là sẽ đọc: Port 22hoặc Host * sẽ coi chúng là các lệnh
Valentin Bajrami

13

Đề nghị cá nhân: sử dụng screentrên máy chủ từ xa; nó sẽ quản lý để giữ cho kết nối của bạn tồn tại miễn là nó vẫn hoạt động trong một thiết bị đầu cuối.

Đây là những gì tôi thường thêm vào /etc/screenrcđể nhận dạng nhanh các phiên màn hình của mình:

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

EDIT: Gợi ý.

Các hardstatuschuỗi sẽ hiển thị một dòng trạng thái phía dưới như thế này: Ví dụ phiên màn hình với ba tab mở

Bộ đệm cuộn lại cũng được mở rộng thành 8192 dòng thay vì 1000-1500 thông thường (tùy thuộc vào phân phối).


Cảm ơn, hai câu hỏi: 1. Bạn có thể giải thích các tùy chọn trong screenrctập tin của bạn ? Làm cách nào để định cấu hình hệ thống màn hình khởi chạy / tmux ngay sau khi tôi đăng nhập?
cú pháp

8
Chỉ cần làm rõ, screenkhông giữ kết nối ssh của bạn còn sống. Nó chạy các tiến trình trong một thiết bị đầu cuối ảo độc lập với thiết bị đầu cuối người dùng mà bạn kết nối thông qua sshđể quá trình không phụ thuộc vào kết nối của bạn. Bạn vẫn sẽ mất sshkết nối cho đến khi nó được giải quyết.
iyrin

1
Bằng cách " giữ cho kết nối tồn tại " về cơ bản, tôi có nghĩa là " ngăn chặn kết nối không hoạt động ", có kết quả tương tự. Nếu không có đầu vào trong 4 giờ, SSH sẽ không hoạt động và cuối cùng đóng kết nối, tất cả các tiến trình con cũng biến mất.

2
Nhiều như tôi yêu thích screen, tôi khuyên người dùng mới nên bắt đầu tmux.
dotancohen

2

Với OpenSSH:

Bạn cần kích hoạt

TCPKeepAlive yes

cả trong máy khách của bạn ssh_config (ví dụ /etc/ssh/ssh_confighoặc trong ~/.ssh/config) và máy chủ SSH đích của bạn đang chạy OpenSSH (ví dụ / etc / ssh / sshd_config).

Vì vậy, mỗi khi kết nối của bạn không hoạt động, OpenSSH sẽ gửi một số gói giả đến máy chủ đích của bạn ...


Điều này cũng có thể khiến kết nối bị sập 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

Thành thật mà nói, nhưng "[…] network goes down […] client host crashes […] route is down […]"là những lỗi nghiêm trọng không cấu hình SSH có thể bắt được. Vấn đề chính ở đây là các phiên SSH nhàn rỗi, không phải lỗi mạng. Do đó để tổng hợp: - kích hoạt TCPKeepAlive yestrong cả máy chủ và máy khách. - thiết lập ClientAliveInterval trên máy chủ - thiết lập IdleTimeouttrên máy chủ - thiết lập ClientAliveCountMax Điều đó nên thực hiện thủ thuật ...
Martin Allert

2

Nếu sự cố là máy tính xách tay ngủ đông hoặc kết nối mạng kém hoàn hảo, tôi khuyên bạn nên sử dụng moshđể chạy qua sshvà cho phép kết nối lại tự động.

Từ trang web :

Mosh (vỏ di động)

Ứng dụng thiết bị đầu cuối từ xa cho phép chuyển vùng, hỗ trợ kết nối không liên tục và cung cấp tiếng vang thông minh cục bộ và chỉnh sửa dòng phím của người dùng.

Mosh là một sự thay thế cho SSH. Nó mạnh mẽ và phản ứng nhanh hơn, đặc biệt là qua các liên kết Wi-Fi, di động và đường dài.

Mosh là phần mềm miễn phí, có sẵn cho GNU / Linux, BSD, macOS, Solaris, Android, Chrome và iOS.

Kết hợp với tmux(hoặc cũ hơn screen), điều này cho phép tôi kết nối qua sshmáy chủ từ máy tính xách tay của mình và duy trì kết nối trong nhiều ngày ngay cả khi thay đổi kết nối wifi và thoát khỏi tình trạng mất dữ liệu di động.


Đây là đường dẫn đến mosh.orgmosh trên Github
joeytwiddle

1

Kiểm tra cấu hình sshd của bạn trên máy chủ /etc/sshd_configđể biết IdleTimeoutcài đặt .

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.