Vielen Dank für @ till's Answer , es hat mich sehr inspiriert.
Ich habe festgestellt, dass Sie Ihre Verbindung zwangsweise umleiten können ProxyCommand nc dst dst-port.
Beispielsweise stellen Sie tatsächlich eine Verbindung her, B.comwenn Sie verwenden
ssh A.com -o ProxyCommand="nc B.com 22"
Werde UserKnownHostsFileaber trotzdem aufnehmen wieA.com
So können Sie Ihrer Domain "auto" hinzufügen 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'
Ich ersetzte nc -w 1 %h %pmit (timeout 0.1 nc -z %h %p) && nc %h %p, es ist schneller, wenn Sie den internen Server weniger als 100ms erreichen könnten.
Sie können auch durch ersetzt werden ping, dies kann jedoch auf fehlerhafte Informationen hinweisen, wenn Sie einen TCP-basierten Proxy verwenden proxychainsoder der Server kein ICMP-Echo zulässt.
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'
Sie können durch (timeout 0.1 nc -z %h %p)alles ersetzen , was erkennt, ob Sie sich auf einem internen Server befinden.
Wenn Sie mehrere Kandidaten-IPs haben, können Sie dies auch verwenden:
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'
Es wird versucht, eine Verbindung herzustellen 1.1.1.1, wenn dies fehlschlägt, versuchen Sie, eine Verbindung herzustellen 2.2.2.2, und dann 3.3.3.3.