Como usar o mesmo alias SSH com múltiplos endereços de host / ports / etc.?

4

Aqui está o problema: Estou tentando o SSH em um sistema acessível de pelo menos três redes diferentes - às vezes diretamente, às vezes por meio de um proxy - em momentos diferentes.

Conectar-se diretamente é muito mais rápido e confiável do que conectar-se através de um host intermediário, que é novamente muito mais rápido e confiável do que conectar-se à Internet em geral. Por isso, gostaria que o SSH tentasse se conectar de três maneiras diferentes. , escolhendo o primeiro que tenha sucesso.

Eles são todos da mesma máquina, obviamente, então não quero continuar tendo que escolher manualmente entre três aliases diferentes, dependendo de onde estou me conectando.

No entanto, não consigo encontrar nenhum mecanismo para resolver isso. É possível fazer isso ou não?

Se não, o que as pessoas geralmente fazem em tal situação?

    
por Mehrdad 16.08.2017 / 22:06

4 respostas

5

Não use aliases para ssh conexões! Use um ssh_config adequado em ~/.ssh/config . Tem alguns recursos verdadeiramente poderosos.

Digamos que você possa identificar em qual rede você está. Por exemplo, usando seu IP, que pode ser obtido, por exemplo, usando hostname -I . Então, vamos escrever alguma configuração:

# in network1 I am getting ip from "10.168.*.*" and I need to connect through proxy
Match Host myalias Exec hostname -I | grep 10\.168\.
  Hostname real-host-IP
  ProxyCommand ssh -W %h:%p proxy-server

# in network2 I am getting IP from "192.168.*.*" and I do not need a proxy
Match Host myalias Exec hostname -I | grep 192\.168\.
  Hostname real-host-IP

# in network3 I am getting something else

Eu acredito que você entendeu o assunto ...

    
por 17.08.2017 / 11:48
3

Você pode armazenar um alias de shell ou uma função no seu .bashrc ou qualquer outra coisa que seja o arquivo de configuração do seu shell. Por exemplo, para um alias de Bash:

alias my_ssh="
ssh mehrdad@"IP1 ||
ssh tomas@IP2 ||
ssh tomas@IP3
"

Em seguida, chame o alias:

 my_ssh

E se o IP1 falhar, || executará o segundo comando. E assim vai de novo, agora com o IP3.

Eu não testei isso, mas deve estar ok. Ou pelo menos mostra um caminho.

Para opções de SSH como proxies, consulte man ssh .

    
por 16.08.2017 / 22:17
1

Pode haver várias soluções, algumas melhores que outras e ignorando implicações de segurança ou limitações de infra-estrutura (desconhecida):

  • fazendo um túnel reverso do SSH (um hack feio);
  • configurando o anycast com a ajuda do OSPF ou BGP e enviando para um anycast VIP;
  • a máquina remota que estabelece um túnel IPsec - sem o proxy;
  • comunicando-se via Tor
  • atualizando um site / página / Redis / servidor MySQL com o endereço atual e seu script ssh buscando-o;
  • usando o HAProxy;
  • DNS dinâmico.
por 16.08.2017 / 22:55
1

Esta função pode funcionar, mas se o alias de Tomas funcionar, acho que é uma solução melhor.

autossh () {

  publicip="11.11.11.11"
  privateip="10.10.10.100"
  proxyhost="10.10.10.10"
  proxyport="9001"
  ssh -o ConnectTimeout=10 $1@$privateip 2> /dev/null && exit 0
  if [ $? -ge 1 ]; then
    ssh -o ConnectTimeout=10 $1@$publicip -o "ProxyCommand=nc -X connect -x $proxyhost:$proxyport %h %p" 2> /dev/null && exit 0
    if [ $? -ge 1 ]; then
      ssh -o ConnectTimeout=10 $1@$publicip 2> /dev/null && exit 0
      if [ $? -ge 1 ]; then
        echo "I think your node is down"
      fi
    fi
  fi

}
    
por 16.08.2017 / 22:21