Phần lớn lời khuyên giữ phiên SSH sống chỉ dừng ở «thêm ServerAliveInterval 30» và bỏ sót những phần hữu ích. Từ khóa là một bộ hẹn giờ phía máy khách chỉ kích hoạt khi kênh đã im lặng, nó đếm các lần dò không được đáp thay vì đếm giây, và nó sống trong một tệp nơi giá trị khớp đầu tiên thắng. Hiểu sai ba thuộc tính đó và một phiên VPN khỏe mạnh vẫn rớt, trong khi phiên đã chết lại treo lơ lửng.

Hai hướng thuộc về hai daemon khác nhau

ServerAliveInterval do máy khách ssh của bạn đọc. ClientAliveInterval do sshd ở phía bên kia đọc và dò theo hướng ngược lại, từ máy chủ tới máy khách. Chúng không phải bí danh và không phối hợp với nhau, nên đặt cái này không ảnh hưởng tới hành vi của đầu kia. Nhầm lẫn hai cái là lý do thường gặp khiến một bản sửa có vẻ chạy được trên máy này mà không trên máy kế tiếp.

Cả hai đều chấp nhận số không. Ở mức không, máy khách không gửi gì cả, và ở phía máy chủ, ClientAliveCountMax bằng không sẽ tắt việc ngắt kết nối mà nếu không sẽ đến sau các lần kiểm tra không được đáp.

Gói dò chứng minh điều gì và không chứng minh điều gì

Khi khoảng thời gian đã đặt trôi qua mà không có dữ liệu nào đến từ máy chủ, máy khách gửi một yêu cầu nhỏ qua kênh mã hóa sẵn có và chờ phản hồi. ServerAliveCountMax quy định bao nhiêu trong số đó được phép không được đáp trước khi phiên bị đóng. Với khoảng 60 và số đếm 3, máy khách bỏ cuộc sau khoảng ba phút im lặng, và con số đó là thuộc tính của cấu hình bạn, không phải chuẩn mạng. Để khoảng thời gian ở giá trị mặc định 0 thì không gói dò nào được gửi, vì vậy một máy khách tiêu chuẩn có thể ngồi trên kết nối chết vô hạn.

Vì trao đổi diễn ra bên trong tầng vận chuyển SSH, một phản hồi chứng minh rằng tiến trình SSH của phía kia vẫn đang đọc và ghi. Nó không nói gì về chương trình bạn đã khởi chạy trong phiên đó: một máy khách cơ sở dữ liệu, một cổng được chuyển tiếp hay một script chạy lâu đều có thể bị kẹt trong khi tầng vận chuyển vui vẻ trả lời các gói dò.

TCPKeepAlive là một cơ chế riêng ở tầng thấp hơn. Nhân hệ điều hành xử lý nó, nó không được mã hóa, và một đầu bên kia có daemon SSH bị kẹt vẫn có thể thỏa mãn nó. Vì vậy gói dò ở mức SSH là tín hiệu có ý nghĩa hơn khi bạn quan tâm tới phiên chứ không phải socket.

Thứ tự quyết định giá trị nào sống sót

OpenSSH áp dụng giá trị đầu tiên nó lấy được cho mỗi tham số, nên một khối Host cụ thể phải xuất hiện trước bất kỳ khối rộng hơn nào cũng sẽ khớp. Đặt các giá trị mặc định có ký tự đại diện ở cuối tệp, không phải ở đầu, và nhớ rằng một khối Match ở dưới không thể ghi đè giá trị đã được đặt. Tài liệu tham chiếu cấu hình máy khách OpenSSH nêu trực tiếp quy tắc giá trị đầu tiên, và đáng đọc một lần trước khi tổ chức lại một cấu hình dùng chung.

Tùy chọn trên dòng lệnh thắng tệp, điều này làm cho một thử nghiệm tạm thời trở nên rẻ:

ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=4 office-shell

Để xem máy khách thực sự đã giải quyết điều gì thay vì điều bạn nghĩ mình đã viết, hãy yêu cầu nó kết xuất cấu hình hiệu lực. Kết quả chứa các giá trị đã hợp nhất cho tên máy đó và là cách nhanh nhất để bắt được một khối trước đó bị lạc:

ssh -G office-shell | grep -i alive

Keepalive làm gì qua một đường hầm

Lưu lượng định kỳ ngăn ánh xạ NAT hoặc tường lửa có trạng thái hết hạn, đây là lợi ích thật trên một VPN có cổng vào loại bỏ các luồng không hoạt động sau vài phút. Các gói dò đến mỗi 60 giây làm mới ánh xạ đó mà không mang theo dữ liệu ứng dụng nào.

Chúng không thể dựng lại một đường đã mất. Khi giao diện đường hầm biến mất, các gói dò cũng thất bại như mọi thứ khác, và phiên kết thúc khi số đếm cạn. Phát hiện sự sống và khôi phục đường đi là hai vấn đề khác nhau, và chỉ cái đầu tiên là cấu hình được trong ssh_config. Điều mà khoảng thời gian và số đếm thực sự mua cho bạn là mức độ nhanh chóng máy khách nhận ra, và đó là phần mà người dùng trải nghiệm như một lần treo.

Kết nối đa hợp thêm một nếp gấp. Khi có ControlMaster, các gói dò thuộc về kết nối chính, và một phiên mới trên kết nối chính sẵn có thừa hưởng những gì kết nối chính đó đã thương lượng. Nếu kết nối chính của mux bị kẹt, mở một cửa sổ khác sẽ không kiểm tra lại đường đi.

Xác nhận cấu hình từ đầu đến cuối

Trên máy chủ, hãy kết xuất cấu hình daemon hiệu lực thay vì đọc tệp và đoán xem include nào đã thắng:

sshd -T | grep -i clientalive

Sau đó quan sát một phiên thực với đầu ra gỡ lỗi được bật. Máy khách in một dòng hết thời gian khi số đếm cạn, và các dấu thời gian xung quanh cho thấy sự im lặng là liên tục hay các gói dò chưa từng được gửi. Một phiên chết mà không có lưu lượng dò thường giữ từ khóa trong một khối chưa bao giờ khớp.

Đáng thêm hai lần kiểm tra cho bất kỳ máy nào bạn chỉ đến được qua đường hầm: xác nhận rằng khoảng thời gian đã giải quyết đúng là khoảng bạn định, và xác nhận rằng khoảng đó nhân với số đếm ngắn hơn thời gian chờ không hoạt động trên cổng VPN. Khi số thứ hai lớn hơn, cổng sẽ âm thầm bỏ luồng trước và gói dò SSH không bao giờ có cơ hội báo cáo điều gì.

Bài viết liên quan