Mi sembra che stiate tutti interpretando male ServerAliveCountMax. Da quanto ho capito dai documenti, è il numero di messaggi server alive che possono rimanere senza risposta senza che la connessione venga terminata. Quindi, in casi come quello di cui stiamo discutendo qui, impostarlo ad un valore alto assicurerà solo che una connessione bloccata non venga rilevata e terminata!
Impostare semplicemente ServerAliveInterval dovrebbe essere sufficiente a risolvere il problema di un firewall che si dimentica della connessione, e lasciare ServerAliveCountMax basso permetterà all'estremità originaria di notare il fallimento e terminare se la connessione fallisce comunque.
Quello che volete è, 1) che la connessione rimanga aperta permanentemente in circostanze normali, 2) che il fallimento della connessione venga rilevato e la parte originaria esca in caso di fallimento, e 3) che il comando ssh venga riemesso ogni volta che esce (come lo fate dipende molto dalla piattaforma, lo script “while true” suggerito da Jawa è un modo, su OS X ho effettivamente impostato un elemento launchd).