ProxyCommand condicional em ~ / .ssh / config?


14

Eu tenho o meu ~/.ssh/configconfigurado com vários hosts acessíveis na VPN da empresa ou por meio de um servidor proxy SSH.

No momento eu só tenho

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

No entanto, se estou na rede interna, posso acessar diretamente o ip interno; portanto, o proxy através do servidor externo adiciona um atraso na conexão.

Existe uma maneira que eu possa fazer proxy provisoriamente se o ip interno não estiver acessível e conectar-se diretamente caso contrário?

Respostas:


8

Eu costumo configurar algo parecido com isto. Ele assume que o host intermediário poderá resolver o nome.

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

Então eu gostaria de me conectar ssh blah%homeproxy.


Meu google-fu está falhando comigo. Você pode explicar isso mais? Eu nunca vi essa sintaxe *% antes.
precisa saber é o seguinte

3
Não há nada de especial no %personagem. Você poderia usar qualquer coisa realmente. A porcentagem é usada, pois não é válida em um nome de host ou nome de usuário. O cutcomando dentro do ProxyCommand usa o %como um delimitador para retirar o nome do host.
Zoredache

1
Isso é bom, no entanto, significa que eu tenho que especificar o nome completo do host em vez do apelido ssh.
alt

@mobiusnz Na verdade, significa simplesmente que você precisa de um nome diferente para cada meio de conexão. No meu caso, por exemplo, se estou em casa, uso ssh targetH, ou seja, destino de casa . Se em uma rede local para segmentar, simplesmente ssh target. Teria sido bom ter isso declarado de maneira mais direta na resposta.
Rubens

4

Eu uso um método diferente usando Match. No meu caso, quero usar um proxy local se estiver em execução ou não, se não estiver. A diretiva a seguir realiza isso muito bem:

Match Exec "nc -z 127.0.0.1 1086"
    ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p

Ele corresponde a todas as tentativas ssh e executa uma verificação rápida usando ncpara ver se meu proxy está instalado e em execução no 1086 (nesse caso, ncsai sem erro). Se isso acontecer, ele define o ProxyCommand.


2

Uma década atrás eu escrevi um comando proxy para esse tipo de cenário. No seu caso de uso, meu comando proxy poderia 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 em admitir que ele não lida com IPv6 e que apenas tentará um único endereço IP por nome de host. Além disso, ele 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.


2

Obrigado por resposta do @ till , isso me inspirou muito.

Descobri que você pode redirecionar à força sua conexão com ProxyCommand nc dst dst-port.

Por exemplo, você se conectará de fato B.comse usar

ssh A.com -o ProxyCommand="nc B.com 22"

Mas UserKnownHostsFileainda vai gravar comoA.com

Então você pode adicionar um domínio "automático" 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'

Eu substituí nc -w 1 %h %ppor(timeout 0.1 nc -z %h %p) && nc %h %p , será mais rápido se você atingir o servidor interno a menos de 100 ms.

Ou você pode substituir por ping, mas isso pode indicar informações incorretas se você usar um proxy baseado em TCP proxychains, ou 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ê possui vários IPs candidatos, você pode usar o seguinte:

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á se conectar 1.1.1.1, se falhar, tente se conectar 2.2.2.2e, em seguida 3.3.3.3.


0

Isso funciona um pouco mais automaticamente, 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"

0

Eu normalmente criaria outra entrada, algo como isto -

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

Host myVM-np
    User ubuntu

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.