Obrigado por @ till's Answer , isso me inspirou muito.
Descobri que você pode redirecionar sua conexão com ProxyCommand nc dst dst-port
.
Por exemplo, você se conectará de fato a B.com
se usar
ssh A.com -o ProxyCommand="nc B.com 22"
Mas UserKnownHostsFile
ainda será registrado como A.com
Você pode adicionar um domínio "auto" ao seu 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'
Substitui nc -w 1 %h %p
por (timeout 0.1 nc -z %h %p) && nc %h %p
, será mais rápido se você conseguir acessar o servidor interno a menos de 100 ms.
Ou você pode ser substituído por ping
, mas pode indicar informações incorretas se você usar um proxy baseado em TCP como proxychains
ou se o servidor não permitir um eco 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'
Você pode substituir (timeout 0.1 nc -z %h %p)
por qualquer coisa que detecte se você está no servidor interno.
Se você tiver vários IPs candidatos, até mesmo você pode usar isso:
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'
Ele tentará conectar 1.1.1.1
, se falhar, tente conectar 2.2.2.2
e, em seguida, 3.3.3.3
.