Jak zwolnić porty na serwerze SSH, gdy odwrotny tunel ssh rozłącza się nagle / nieczysto?

19

Mamy trochę sprzętu, który instalujemy w lokalizacjach naszych klientów, który łączy się z naszym serwerem ssh i ustanawia tunel zwrotny ssh, abyśmy mogli uzyskać dostęp do kilku systemów klienckich w celach monitorowania.

Wszystko działa dobrze, dopóki nie nastąpi nieczyste rozłączenie sesji SSH.

Kiedy tak się dzieje, na naszym serwerze SSH porty, które były używane przez tunel zwrotny, utknęły w trybie SŁUCHANIA, a kiedy nasz zdalny sprzęt w końcu próbuje automatycznie połączyć się ponownie i ponownie ustanowić swoje tunele, kończy się to błędem

Ostrzeżenie: nie można przekazać zdalnego portu dla portu nasłuchiwania XXXX

Testowałem, czy wystąpił problem z naszym serwerem lub klientem SSH, próbując czystego rozłączenia i kursu, który uwalnia porty w porządku. Kiedy symuluję awarię połączenia (na przykład odłącz port Ethernet sprzętu klienta), mamy ten sam problem, który opisałem powyżej.

Jaki jest właściwy sposób radzenia sobie z tą sytuacją? Pamiętaj, że są to odwrócone tunele, więc wszystko, co się stanie, musi zostać wykonane na serwerze SSH. Idealnie potrzebuję serwera ssh, aby natychmiast zorientować się, że sesja SSH hostująca tunele jest wyłączona i zwolnić porty, których używała. Wydaje mi się, że rozwiązaniem może być zabicie danego procesu SSH, ale muszę być ostrożny, ponieważ mamy wielu klientów łączących się z tym samym serwerem ssh i nie chciałbym ich wyrzucać do trybu offline.

Będąc tak dojrzałym, jestem pewien, że SSHD ma jakąś wbudowaną funkcję do obsługi tego, ale po prostu nie mogę tego rozgryźć.

Radzę, więc nie muszę wracać do administrowania skrzynkami Windows ...

FYI: Używam tego w dystrybucji opartej na Debianie.

TCZ
źródło

Odpowiedzi:

18

Musisz użyć ClientAliveIntervalw swoim sshd_config.

ClientAliveInterval 15

Patrz: man sshd_config

ClientAliveCountMax
         Sets the number of client alive messages (see below) which may be
         sent without sshd(8) receiving any messages back from the client.
         If this threshold is reached while client alive messages are
         being sent, sshd will disconnect the client, terminating the
         session.  It is important to note that the use of client alive
         messages is very different from TCPKeepAlive (below).  The client
         alive messages are sent through the encrypted channel and
         therefore will not be spoofable.  The TCP keepalive option
         enabled by TCPKeepAlive is spoofable.  The client alive mechanism
         is valuable when the client or server depend on knowing when a
         connection has become inactive.

         The default value is 3.  If ClientAliveInterval (see below) is
         set to 15, and ClientAliveCountMax is left at the default,
         unresponsive SSH clients will be disconnected after approximately
         45 seconds.  This option applies to protocol version 2 only.

 ClientAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the client, sshd(8) will send a message
         through the encrypted channel to request a response from the
         client.  The default is 0, indicating that these messages will
         not be sent to the client.  This option applies to protocol
         version 2 only.
łaskawy
źródło
Dziękuję Clement. Zajmę się konfiguracją tego na naszym serwerze.
TCZ
Wykonane i przetestowane, działa pięknie. Dziękuję Ci bardzo.
TCZ