Làm thế nào để tcp-keepalive hoạt động trong ssh?


85

Tôi đang cố gắng viết mã shell-script sử dụng kết nối ssh để thực hiện "nhịp tim". Tôi muốn chấm dứt phía máy khách và phía máy chủ của kết nối đó sau một khoảng thời gian chờ nhất định (sau khi kết nối bị ngắt).

Những gì tôi tìm thấy cho đến nay:

  • TCPKeepAlive có / không cho sshsshd
  • ClientAliveCountMax cho sshd
  • ClientAliveInterval cho sshd
  • ServerAliveCountMax cho ssh
  • ServerAliveInterval cho ssh

Để thay đổi "ClientAliveCountMax" tôi sẽ phải sửa đổi sshd_config trên mỗi máy đích (tùy chọn này bị tắt theo mặc định).

Vì vậy, câu hỏi của tôi là - tôi có thể sử dụng "TCPKeepAlive" cho mục đích của mình không (mà không thay đổi bất cứ điều gì khác trên các máy nguồn / đích)?

Hệ điều hành mục tiêu là SLES11 SP2 - nhưng tôi không nghĩ rằng điều đó có liên quan ở đây.


Các tham số đó đều có nghĩa cho các tình huống trong đó tường lửa hoặc thiết bị trung gian dọc theo kết nối sẽ chấm dứt kết nối. Các tham số này là để gửi dữ liệu định kỳ để duy trì kết nối và cũng để tắt kết nối khi có X trả lời nổi bật. Bạn có thể cung cấp thêm một chút chi tiết về những gì bạn đang làm? Bạn đang sử dụng ControlMastertùy chọn và sử dụng kết nối nô lệ?
Patrick

Tôi chỉ muốn xây dựng một phương tiện để xác định, nếu một nút khác "xuống" bằng cách sử dụng một số kết nối mạng ssh với một số dòng vật lý. Tôi làm điều này bằng cách chỉ mở một phiên ssh (mà ít nhiều có một vòng lặp vô tận). Tôi muốn phiên đó chấm dứt nếu các kết nối bị hỏng. Tôi đang tự hỏi khoảng / đếm cho TCPKeepalive là gì.
Nils

Câu trả lời:


104

Bạn có thể muốn sử dụng cài đặt ServerAlive cho việc này. Họ không yêu cầu bất kỳ cấu hình nào trên máy chủ và có thể được đặt trên dòng lệnh nếu bạn muốn.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Điều này sẽ gửi một tin nhắn giữ ssh cứ sau 5 giây và nếu đến lúc phải gửi một tin nhắn khác, nhưng phản hồi cho tin nhắn cuối cùng không nhận được thì kết nối sẽ bị chấm dứt.

Sự khác biệt quan trọng giữa ServerAliveIntervalTCPKeepAlivelà lớp họ hoạt động.

  • TCPKeepAlivehoạt động trên lớp TCP. Nó sẽ gửi một gói TCP ACK trống. Tường lửa có thể được cấu hình để bỏ qua các gói này, vì vậy nếu bạn đi qua tường lửa làm giảm các kết nối nhàn rỗi, chúng có thể không giữ kết nối được.
  • ServerAliveIntervalhoạt động trên lớp ssh. Nó thực sự sẽ gửi dữ liệu qua ssh, vì vậy gói TCP có dữ liệu được mã hóa và tường lửa không thể biết đó là gói giữ hay gói hợp pháp, vì vậy các gói này hoạt động tốt hơn.

1
Tôi nghĩ rằng đây là hướng đi đúng đắn. Các thử nghiệm ban đầu đã chỉ ra rằng điều này sẽ hoạt động - nó sẽ chấm dứt việc gửi và nhận các quy trình con ssh / sshd sau 5 giây sau khi kết nối bị ngắt. Tôi nói rằng TCPKeepalive chỉ đơn giản là sử dụng mặc định TCP-stack-mặc định - vì vậy cũng khó cấu hình hơn.
Nils

Điều này cũng giải quyết vấn đề người dùng ma. Tôi tin rằng điều này cũng có thể được thực hiện trong cài đặt PuTTY , thay đổi Seconds between keepalivesthành 1800 trong Cài đặt | Kết nối.
Bob Stein

7

Các TCPKeepAlivetùy chọn thực sự là một phương pháp rất khác nhau của việc giữ kết nối sống từ tùy chọn ClientAlive-like hoặc ServerAlive-như thế nào.

Trên mỗi trang hướng dẫn sử dụng BSD SSH , chúng tôi có thể đọc rằng:

Các thông điệp còn sống của khách hàng được gửi qua kênh được mã hóa và do đó sẽ không thể giả mạo được. Tùy chọn giữ lại TCP được kích hoạt bởi TCPKeepAlivecó thể giả mạo. Cơ chế sống của máy khách có giá trị khi máy khách hoặc máy chủ phụ thuộc vào việc biết khi nào kết nối không hoạt động.

Việc TCPKeepAliveđảm bảo hệ thống có nên gửi các thông điệp cố định TCP sang phía bên kia hay không. Tùy chọn mặc định luôn được bật.

Nếu bạn đang sử dụng ClientAliveInterval, bạn có thể vô hiệu hóa TCPKeepAlive. Tùy chọn này 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, vì vậy không có tin nhắn nào được gửi đến máy khách) và ClientAliveCountMaxđặt số lượng tin nhắn còn sống của khách hàng trước khi sshd sẽ ngắt kết nối máy khách, bằng cách chấm dứt phiên.

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.