Como você pode usar o SSH para um nome de host desconhecido com uma chave conhecida?

4

Eu tenho uma máquina que se conecta a uma rede corporativa por VPN. Quando me conecto à VPN, sempre me fornece um nome de host e um endereço IP diferentes. O nome do host é sempre remoto [último octeto do endereço IP]. Sempre que eu quero SSH em minha máquina, primeiro tenho que executar "hostname -A" para ver qual é o nome do host. O problema é que nem sempre sei qual é o nome do meu host quando preciso acessar o computador. (Se eu for para onde o computador está fisicamente localizado para encontrar o nome do host, ele vai acabar com minha necessidade de SSH.)

Posso usar o SSH e tentar cada nome de host / ip na sub-rede até encontrar um que corresponda ao arquivo de chave correto?

Estou usando um laptop com windows (também conectado via vpn) com cygwin para ssh em uma máquina Ubuntu 12.04. Não tenho certeza por que recebo um hostname diferente quando me conecto à vpn, mas é uma rede corporativa, então eles fazem o que quiserem.

    
por user229010 04.06.2013 / 19:44

5 respostas

2

Isto não é o portscan

Aqui, usaremos apenas os utilitários básicos ssh ssh-keyscan e ssh-keygen para conexões de rede / conversão de chaves.

Se você conhece a impressão digital do servidor

e quer procurá-lo, então você pode fazer:

for x in {1..254}; do ssh-keyscan 10.0.0.$x > /tmp/ssh-scan.log 2> /dev/null; cat /tmp/ssh-scan.log; ssh-keygen -lf /tmp/ssh-scan.log | grep -v 'not a public key file' ; done

e imprimirá impressões digitais de todos os hosts encontrados. A linha acima vai de 10.0.0.1 a 10.0.0.254, tenta obter chaves públicas de cada host e, finalmente, converte a chave pública em impressão digital e a exibe. As mensagens de erro mais comuns são redirecionadas para o buraco negro encontrado em /dev .

Ou talvez pesquise por chave pública

Então, a mesma coisa sem o conversor de impressões digitais, exibe chaves públicas para todos os hosts entre 10.0.0.0 e 10.0.0.255:

for x in {1..254}; do ssh-keyscan 10.0.0.$x 2> /dev/null; done

Resposta final, script ssh seek'n'connect

Originalmente postado por user229010 como comentário, eu apenas limpei: -)

for i in {1..255}; do 
    echo trying remote-$i
    ping -w 1 -c 1 remote-$i > /dev/null
    if [ $? -eq 0 ]; then
        # this is a live ip
        echo remote-$i is up
        if ssh-keyscan remote-ca$i | grep $expected_key -m1 -c > /dev/null; then
            # this is my machine
            ssh remote-$i
            exit 0
        fi
    fi
done
    
por 05.06.2013 / 00:43
4

Você tem algumas opções aqui, listadas do mais simples ao mais complicado. Não é novidade que isso vai bem, melhor, melhor.

  1. Use um crontab para atualizar um arquivo em um sistema remoto com seu nome de host em algum intervalo.
    Criar / Editar Crontab: crontab -e < em> Adicionar entrada de Crontab: Para criar um trabalho que atualiza um arquivo a cada hora durante o dia de trabalho apenas nos fins de semana, use este exemplo:

    00 09-18 * * 1-5 ssh [email protected] "echo $(hostname -A) > ubuntuhost.name"
  2. Use um crontab para enviar seu nome de host por email para você mesmo em algum intervalo.
    Instale Mailutils: sudo apt-get update && sudo apt-get install mailutils Nota: escolha 'conexão de internet' se proposto por mailutils install, deve ser a primeira opção.
    Criar / Editar Crontab: crontab -e
    Adicionar Entrada do Crontab: Para criar um trabalho que envia e-mails a cada hora durante o dia de trabalho apenas nos finais de semana, com uma linha de assunto do nome do host, use este exemplo:

    00 09-18 * * 1-5 mail -s "Ubuntu $(hostname -A)" [email protected] < /dev/null 
  3. Use o Dispatcher NetworkManager para enviar por e-mail seu nome de host atual sempre que a conexão for alterada.
    Coloque este script em /etc/NetworkManager/dispatcher.d, nomeie-o como "50emailhostname"

#!/bin/sh -e
#make sure I'm executable (chmod 775)

echo "interface: $1, action: $2" >> /tmp/interface.log #debug

if [ "$1" = "eth0" ] && [ "$2" = "up" ]
then
  mail -s "Ubuntu $(hostname -A)" [email protected] > /tmp/interface.log #debug
else
  echo "false" >> /tmp/interface.log #debug
fi

exit

Notas:

  • Talvez seja necessário alterar "eth0" no script para "vpn0" ou algo assim dependendo do seu cliente
  • Talvez seja necessário alterar "up" para "vpn-up"
  • Use as instruções de depuração para obter o comportamento desejado!
  • tail -f /tmp/interfaces.log em uma janela separada para ver o que está fazendo
  • Reinicie o serviço de rede, conforme necessário, com o reinício do gerenciador de rede do serviço
  • Comente as instruções de depuração quando terminar
  • Você pode obter o endereço IP em vez do nome do host com algo como $(ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}')
por 04.06.2013 / 23:30
1

Seria muito mais sensato ter a máquina remota relatando seu IP em algum lugar. Por exemplo, ao executar um crontab thaat, ele se conecta à sua máquina local por meio do ssh e grava o nome do host em um arquivo. Se você atualizar sua pergunta com mais detalhes (qual SO? Sua máquina local está acessível através da rede?) Eu posso lhe dizer como fazer isso.

De qualquer forma, para testar todos os IPs na sub-rede, supondo que você tenha arp instalado, você pode fazer algo assim:

for ip in 'arp | grep -v Add | awk '{print $1}''; do ssh $ip; done
    
por 04.06.2013 / 20:07
0

Você pode acelerar o processo expondo algum serviço que é facilmente consultado e que nenhuma outra máquina provavelmente terá (obviamente o SSH também fará, mas a verificação com ssh é mais longa e o portscanning para ssh é compreensivelmente mal visto ).

Use um scanner de porta configurável para escanear toda a sub-rede procurando por aquele serviço. A máquina que tem esse serviço é a que você está procurando.

No entanto, a melhor solução seria conversar com os administradores de rede e atualizar o DNS na conexão VPN.

    
por 04.06.2013 / 23:56
0

Se você gosta de bruteforce qual IP é usado pela sua máquina ubuntu, o OpenSSH tem uma ferramenta chamada ssh-keyscan para procurar na rede por chaves de host ssh:

for ((a=0;a<255;a++)); do echo 198.51.100.$a; done | ssh-keyscan -f -H > ssh_id_list

Você só precisa saber qual é o seu servidor. Você pode obtê-lo diretamente de seu servidor, ou você pode usar o fato de que seu cliente os armazena na primeira vez que ele se conecta, em ~ / .ssh / known_hosts:

ssh-keygen -F last_ip_you_used_to_connect -l

Em seguida, apenas grep ssh-keyscan com ele.

Outra possibilidade é usar o mDNS: Esta é uma solução DNS distribuída que funciona bem sob a condição de que a VPN permita o tráfego multicast. Isso é instalado por padrão nos desktops do Ubuntu (se hostname -A exibir yourhostname.local , é bom). Se por acaso, o iTunes (ou qualquer outro software da Apple que instale o Bonjour) estiver instalado no Windows, você pode simplesmente se conectar ao yourhostname.local e ele funcionará imediatamente. Caso contrário, se você tiver outra máquina Ubuntu instalada com um endereço IP conhecido e um respondedor mDNS instalado, basta conectar-se a ela e pedir que ela resolva ou execute o ping de yourhostname.local

    
por 05.06.2013 / 00:48