Merci pour la réponse de @ till , cela m'a beaucoup inspiré.
J'ai trouvé que vous pouvez forcer la redirection de votre connexion avec ProxyCommand nc dst dst-port.
Par exemple, vous vous connecterez en fait B.comsi vous utilisez
ssh A.com -o ProxyCommand="nc B.com 22"
Mais UserKnownHostsFileenregistrera toujoursA.com
Vous pouvez donc ajouter un domaine "auto" à votre ssh_config
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'
Je l'ai remplacé nc -w 1 %h %ppar (timeout 0.1 nc -z %h %p) && nc %h %p, ce sera plus rapide si vous pouviez atteindre le serveur interne en moins de 100 ms.
Ou vous pouvez le remplacer par ping, mais cela peut indiquer de mauvaises informations si vous utilisez un proxy basé sur TCP comme proxychains, ou si le serveur n'autorise pas l'écho ICMP.
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'
Vous pouvez remplacer (timeout 0.1 nc -z %h %p)par tout ce qui détecte si vous êtes sur un serveur interne.
Si vous avez plusieurs adresses IP candidates, même vous pouvez utiliser ceci:
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'
Il essaiera de se connecter 1.1.1.1, en cas d'échec, essayez de vous connecter 2.2.2.2, puis 3.3.3.3.