Спасибо за ответ @ till , это меня очень вдохновило.
Я обнаружил, что вы можете принудительно перенаправить ваше соединение с ProxyCommand nc dst dst-port.
Например, B.comесли вы используете
ssh A.com -o ProxyCommand="nc B.com 22"
Но UserKnownHostsFileвсе равно будет записывать какA.com
Таким образом, вы можете добавить домен «авто» к вашему 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'
Я заменил nc -w 1 %h %pна (timeout 0.1 nc -z %h %p) && nc %h %p, это будет быстрее, если вы сможете достичь внутреннего сервера менее чем за 100 мс.
Или вы можете заменить на ping, но это может указывать на неверную информацию, если вы используете прокси на основе TCP, например proxychains, или сервер не допускает эхо 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'
Вы можете заменить (timeout 0.1 nc -z %h %p)на что-либо, что определяет, находитесь ли вы на внутреннем сервере.
Если у вас есть несколько IP-адресов кандидатов, даже вы можете использовать это:
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'
Он попытается подключиться 1.1.1.1, если не удается подключиться 2.2.2.2, а затем 3.3.3.3.