Дякую за відповідь @ 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
.