Những tùy chọn nào `ServerAliveInterval` và` ClientAliveInterval` trong sshd_config chính xác làm gì?


161

Tôi đã tìm thấy câu hỏi này , nhưng tôi xin lỗi tôi không hiểu lắm về cài đặt trên hai biến ServerAliveIntervalClientAliveIntervalđược đề cập trong phản hồi được chấp nhận. Nếu máy chủ cục bộ của tôi hết thời gian, tôi có nên đặt giá trị này thành 0 không? Nó sẽ không bao giờ hết thời gian? Thay vào đó tôi nên đặt nó thành 300 giây hay gì đó?

Câu hỏi của tôi chỉ đơn giản là, một số kết nối của tôi đã hết thời gian khi tôi tạm dừng và sau đó bỏ qua máy tính xách tay của tôi với câu trả lời Write failed: Broken pipevà một số thì không. Làm cách nào tôi có thể định cấu hình chính xác một sshd cục bộ để chúng không bị hỏng với đường ống bị hỏng?

Câu trả lời:


202

ServerAliveInterval : số giây mà máy khách sẽ đợi trước khi gửi gói null đến máy chủ (để giữ cho kết nối tồn tại).

ClientAliveInterval : số giây mà máy chủ sẽ đợi trước khi gửi gói null đến máy khách (để giữ cho kết nối tồn tại).

Đặt giá trị 0 (mặc định) sẽ vô hiệu hóa các tính năng này để kết nối của bạn có thể bị rớt nếu không hoạt động quá lâu.

ServerAliveInterval dường như là chiến lược phổ biến nhất để duy trì kết nối. Để ngăn sự cố đường ống bị hỏng, đây là cấu hình ssh tôi sử dụng trong tệp .ssh / config của mình:

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

Cài đặt ở trên sẽ hoạt động theo cách sau,

  1. Máy khách sẽ chờ trong 60 giây (thời gian ServerAliveInterval) và gửi "gói null no-op" đến máy chủ và mong đợi phản hồi. Nếu không có phản hồi nào, thì nó sẽ tiếp tục thử quá trình trên cho đến 10 (ServerAliveCountMax) lần (600 giây). Nếu máy chủ vẫn không phản hồi, thì máy khách sẽ ngắt kết nối ssh.

ClientAliveCountMax ở phía máy chủ cũng có thể giúp ích. Đây là giới hạn thời gian khách hàng được phép không phản hồi trước khi bị ngắt kết nối. Giá trị mặc định là 3, như trong ba ClientAliveInterval.


Ok, vì vậy tôi sẽ giải thích 0 giây để ngụ ý "không tiếp tục sống", đó là lý do tại sao nó không thăm dò ý kiến ​​khách hàng / máy chủ?
M. Tibbits

3
yup 0 = không gửi gói null. Một điều khác biệt là ServerAliveInterval được đặt trong cấu hình máy khách trong khi ClientAliveI Internalal được đặt trong cấu hình máy chủ.
Barthelemy

8
Đây có vẻ là lời khuyên tốt để ngăn chặn tình trạng nhàn rỗi gây ra thời gian chờ, nhưng tôi không hiểu làm thế nào nó liên quan đến câu hỏi của OP về việc ngăn chặn đường ống bị vỡ khi khách hàng tạm ngưng. Khi ngủ, khách hàng sẽ không thể gửi gói null, vì vậy chắc chắn cài đặt này là không?
Sparhawk

Phần ServerAlive là, chắc chắn. ClientAliveInterval / ClientAliveCountMax là những gì sẽ giúp đỡ ở đây.
javawizard

1
Nhìn lại câu trả lời cũ này, tôi tin rằng đã trả lời câu hỏi trong tiêu đề và không phải câu hỏi trong đoạn thứ hai, do đó các ý kiến ​​về ServerAliveI Internalal không hữu ích cho việc đình chỉ, mà tôi đồng ý. @JonasWielicki ClientAliveInterval có thể xấu trong trường hợp tạm dừng vì máy khách bị treo sẽ không trả lời máy chủ và cuối cùng máy chủ sẽ ngắt kết nối máy khách sau ClientAliveCountMax.
Barthelemy

18

Điều này được giải thích trong sshd_confighướng dẫn ( man sshd_config):

ClientAliveInterval

Đặt khoảng thời gian chờ tính bằng giây sau đó nếu không nhận được dữ liệu từ máy khách, sshd sẽ gửi tin nhắn qua kênh được mã hóa để yêu cầu phản hồi từ máy khách. Mặc định là 0, cho biết rằng những tin nhắn này sẽ không được gửi đến máy khách. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

ClientAliveCountMax

Giá trị mặc định là 3. Nếu ClientAliveInterval(xem bên dưới) được đặt thành 15 và ClientAliveCountMaxđược để ở mặc định, các máy khách SSH không phản hồi sẽ bị ngắt kết nối sau khoảng 45 giây. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

Đối với các tùy chọn máy khách, xem giải thích trong man ssh_config:

ServerAliveInterval

Đặt khoảng thời gian chờ tính bằng giây sau đó nếu không nhận được dữ liệu từ máy chủ, sshsẽ gửi tin nhắn qua kênh được mã hóa để yêu cầu phản hồi từ máy chủ. Mặc định là 0, cho biết những tin nhắn này sẽ không được gửi đến máy chủ. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

ServerAliveCountMax

Giá trị mặc định là 3. Ví dụ: nếu ServerAliveIntervalđược đặt thành 15 và ServerAliveCountMaxđược đặt ở mặc định, nếu máy chủ không phản hồi, sshsẽ ngắt kết nối sau khoảng 45 giây. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

Dựa trên, 0 có nghĩa là nó bị vô hiệu hóa. Do đó, bạn nên đặt các giá trị này đủ cao để tránh lỗi đường ống bị hỏng .


Bài viết hữu ích. Nhưng tôi rất thất vọng vì điều này. Tôi đang đặt khoảng thời gian lớn ở mọi nơi và kết nối của tôi vẫn bị hỏng chỉ sau vài phút. (sử dụng openssh trên Ubuntu, không chắc điều đó có liên quan không)
Sridhar Sarnobat

1
@ user7000 Định cấu hình cả hai, máy khách (ssh) và máy chủ (sshd). Điều này có thể giúp: Cách khắc phục sự cố với 'Kết nối SSH bị đóng đột ngột bởi đầu từ xa' .
kenorb

Tôi nghĩ rằng tôi đang nhận được ở đâu đó. Có thể là tôi đã không đặt một khoảng trắng trước đó ServerAliveIntervalvào tệp cấu hình của mình.
Sridhar Sarnobat

16

Câu trả lời từ Barthelemy rất tuyệt nhưng không thực sự đi đến gốc rễ của vấn đề. Bạn tạm ngưng máy của mình và muốn phiên SSH vẫn còn hoạt động khi bạn khởi động máy tính.

Không có cấu hình như vậy cho ssh sẽ giữ kết nối sống như vậy. SSH sử dụng TCP, để bắt đầu, bạn cần bắt tay ba cách và sau đó tiếp tục sống sau một thời gian nhàn rỗi. Khi bạn tắt / ngủ đông, tất cả các kết nối TCP của bạn được đóng bằng FIN. Không có cách nào để vượt qua điều đó.

Đối với một cách giải quyết bẩn, bạn có thể sử dụng VPS hoặc hộp trực tuyến khác có màn hình để giữ kết nối. Lời khuyên của tôi không làm điều đó vì lý do bảo mật.


1
Đây thực tế là câu trả lời duy nhất và duy nhất cho câu hỏi.
Calimo

1
Đây thực sự là một giải pháp bảo mật khủng khiếp, không bao giờ làm điều đó.
jahrichie

14

Vì bạn không thể đảm bảo rằng kết nối SSH (là TCP) sẽ vẫn tồn tại khi một đầu dừng gửi ACK đến các gói đã nhận, cá nhân tôi sử dụng http://www.hending.motd.ca/autossh/ để khởi động lại tất cả các kết nối SSH của tôi gần như ngay khi tôi không nghi ngờ

Vì GNU Screen sẽ được sử dụng ở phía máy chủ, việc đính kèm lại đưa tôi đến nơi tôi đã ở trước đó.

Bạn có thể nghe nó trên các cổng bổ sung để nó liên tục kiểm tra các kết nối vẫn còn tồn tại, nhưng cá nhân tôi thấy nó hoạt động đủ tốt với thiết bị bị vô hiệu hóa đó và chỉ dựa vào ServerAliveInterval/ của riêng SSH ServerAliveCountMax.

Một tùy chọn khác là http://mosh.mit.edu/ sử dụng UDP và phục hồi hoàn toàn từ sự thiếu kết nối lâu dài.


5

Bạn cũng có thể chạy các lệnh nohupnếu bạn muốn chúng chạy bất kể kết nối SSH của bạn.

ví dụ

$ nohup tar -xzf some_huge.tar.gz &

Các &nghĩa là, tôi nghĩ rằng, không cần thiết, nhưng nó là thuận tiện vì nó làm cho quá trình chạy ở chế độ nền nên bạn có thể làm những thứ khác.

Tôi luôn sử dụng nohup cho bất kỳ quá trình nào mất một lúc, để tôi không phải bắt đầu lại nếu tôi mất kết nối vì bất kỳ lý do gì - mất điện (tại địa điểm xa của tôi, không phải tại máy chủ), mất điện, bất cứ điều gì.


Lưu ý nohup trên zsh không hoạt động đúng!
Sridhar Sarnobat

@ user7000 có gì không đúng về nó?
Butussy Butkus

Tôi không nhớ, tôi nghĩ về cơ bản nó đã không duy trì quá trình chạy sau khi máy khách bị ngắt kết nối. Đó là một vài năm trước và tôi đã ngừng sử dụng nohup và sử dụng từ chối thay thế.
Sridhar Sarnobat

2
Tôi đoán zshngười dùng nên gắn bó disown -hthay vì nohup, trừ khi vấn đề đã được khắc phục kể từ đó.
Butussy Butkus

0

Đặt phiên chạy dài của bạn bên trong màn hình Xem màn hình -h để biết chi tiết

Bằng cách đó, bạn có thể kết nối lại với máy bằng ssh và gắn lại vào phiên màn hình


Tôi tự hỏi bao nhiêu phần trăm những người đề nghị màn hình thực sự sử dụng nó.
Sridhar Sarnobat

Tôi nghĩ rằng tmux là đề xuất tốt hơn, hãy kiểm tra ngày sửa đổi mã github.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib
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.