Wygląda mi na to, że wszyscy źle interpretujecie ServerAliveCountMax. Jak rozumiem w dokumentach, jest to liczba wiadomości server alive, które mogą pozostać bez odpowiedzi bez zerwania połączenia. Więc w przypadkach takich jak omawiamy tutaj, ustawienie go na wysoką wartość zapewni tylko, że zawieszone połączenie nie zostanie wykryte i zakończone!
Po prostu ustawienie ServerAliveInterval powinno wystarczyć do rozwiązania problemu z firewallem zapominającym o połączeniu, a pozostawienie ServerAliveCountMax na niskim poziomie pozwoli na to, aby kończący połączenie zauważył niepowodzenie i zakończył je, jeśli połączenie i tak się nie powiedzie.
To, czego chcesz, to 1) aby połączenie pozostawało otwarte na stałe w normalnych okolicznościach, 2) aby awaria połączenia była wykrywana i aby strona inicjująca kończyła pracę przy niepowodzeniu, oraz 3) aby polecenie ssh było wydawane ponownie za każdym razem, gdy kończy pracę (jak to zrobić, zależy od platformy, skrypt “while true” sugerowany przez Jawa jest jednym ze sposobów, na OS X faktycznie ustawiłem element launchd).