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.com
si vous utilisez
ssh A.com -o ProxyCommand="nc B.com 22"
Mais UserKnownHostsFile
enregistrera 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 %p
par (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
.