C'est le cas derrière tout CG-NAT : une connexion inactive libère les ressources. Votre IP privée ne change pas, mais lors de la reprise du trafic, l'IP publique peut être différente, ce qui casse la connexion SSH.
Pour éviter de changer d'IP publique derrière un CG-Nat, il faut forcer un échanger régulier de paquet pour laisser la connexion ouverte. De nombreuses applications font ça par défaut, mais pas OpenSSH.
Il est recommandé de mettre ce type de lignes à la fin d'un /etc/ssh/sshd_config sur un serveur :
# Forcer un échange toutes les 14sec pour éviter la déconnexion (NAT) ou changement IP publique (CG-NAT)
ClientAliveInterval 14
ClientAliveCountMax 22
Si vous ne pouvez pas modifier la conf d'OpenSSH coté serveur, vous pouvez le faire coté client, cela marche aussi.
Éditez /etc/ssh/ssh_config (ou si vous souhaitez que la modification ne concerne que vous, créer ~/.ssh/config)
# Forcer un échange toutes les 14sec pour éviter la déconnexion (NAT) ou changement IP publique (CG-NAT)
ServerAliveInterval 14
ServerAliveCountMax 22
Sous Windows, avec le client Putty, c'est dans session properties, Connection et Sending of null packets to keep session active, mettre Seconds between keepalives à 14 (0 pour désactiver)