ProxyCommand condicional em ~ / .ssh / config?

10

Eu tenho meu ~/.ssh/config configurado com vários hosts que podem ser acessados na VPN da nossa empresa ou por meio de um servidor proxy SSH.

No momento, só tenho

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server

No entanto, se eu estiver na rede interna, posso acessar diretamente o ip interno, então o proxy através do servidor externo apenas adiciona um atraso na conexão.

Existe uma maneira que eu possa fazer proxy provisoriamente se o ip interno não puder ser acessado, e conectar diretamente de outra forma?

    
por alt 03.09.2013 / 23:00

5 respostas

6

Eu costumo configurar algo assim. Ele supõe que o host intermediário será capaz de resolver o nome.

Host *%homeproxy
    ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

Então, eu me conectaria a ssh blah%homeproxy .

    
por 04.09.2013 / 01:17
1

Uma década atrás eu escrevi um comando de proxy para esse tipo de cenário. No seu caso de uso, meu comando proxy pode ser usado assim:

Host internal-server
    ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server

Algumas advertências: Estou um pouco envergonhado de admitir que ele não manipula o IPv6 e que ele tentará apenas um único endereço IP por nome de host. Além disso, não transferirá o banner do cliente para o servidor antes que o banner do servidor seja enviado. Mas é improvável que isso cause problemas.

    
por 06.03.2016 / 12:18
1

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 .

    
por 12.01.2018 / 15:33
0

Isso funciona um pouco mais automagicamente com um pequeno atraso adicional de 1 segundo se você não estiver atrás do firewall e o firewall não rejeitar:

Host proxyhost.example.com
ProxyCommand none

Host *.example.com
ProxyCommand sh -c "nc -w 1 %h %p || ssh -W  %h:%p proxyhost.example.com"
    
por 06.03.2016 / 10:58
0

Eu normalmente criaria outra entrada como essa -

Host myVM
    ProxyCommand ssh -W internal.ip:22 external-server
    User ubuntu

Host myVM-np
    User ubuntu

Em seguida, basta invocar o que você quer, dependendo do seu ambiente de proxy atual ..

    
por 12.11.2018 / 15:37

Tags