Il me semble que vous interprétez tous mal ServerAliveCountMax. Si j'ai bien compris la documentation, c'est le nombre de messages “Server alive” qui peuvent rester sans réponse sans que la connexion ne soit interrompue. Donc, dans des cas comme celui dont nous parlons ici, le régler à une valeur élevée ne fera que garantir qu'une connexion suspendue ne sera pas détectée et terminée !
Le simple fait de régler ServerAliveInterval devrait suffire à résoudre le problème d'un pare-feu qui oublie la connexion, et laisser ServerAliveCountMax à une valeur basse permettra à l'extrémité d'origine de remarquer l'échec et de mettre fin à la connexion si celle-ci échoue de toute façon.
Ce que vous voulez, c'est 1) que la connexion reste ouverte en permanence dans des circonstances normales, 2) que l'échec de la connexion soit détecté et que le côté d'origine sorte en cas d'échec, et 3) que la commande ssh soit réémise à chaque fois qu'elle sort (la façon dont vous faites cela dépend beaucoup de la plate-forme, le script “while true” suggéré par Jawa est un moyen, sous OS X, je configure en fait un élément de lancement).