Encontre um IP do servidor na LAN a partir de um script

0

Estou procurando uma maneira de ter um script em uma máquina cliente que encontre automaticamente o IP dos servidores na mesma rede.

Eu tenho vários clientes de extensão de mídia executando o Ubuntu 14.04.1 e um servidor executando o mesmo em uma única LAN. Eu quero que os clientes na inicialização pesquisem na rede pelo servidor. Definir um IP estático NÃO é uma solução que eu possa utilizar do servidor ou dhcp.

A pesquisa por hostname pode ser útil, mas eu realmente gostaria que houvesse algo no servidor que transmitisse e permitisse que os clientes o encontrassem dessa maneira, caso dois dispositivos tivessem o mesmo nome de host (improvável, mas possível) ou o hostname alterar. Além disso, a LAN pode nem sempre ser o mesmo éter. (por exemplo, 192.168.1. , 10.0.0. , etc)

Os clientes estão procurando o servidor mysql rodando no servidor, mas eu realmente preciso apenas do IP para que o script possa configurar o software para usar o banco de dados no servidor.

Agradecemos antecipadamente por qualquer ajuda.

EDIT: Programas de terceiros estão bem. Os clientes podem se conectar a qualquer servidor em qualquer sub-rede a qualquer momento. Quando eu tiver algo para encontrar o servidor provavelmente usarei um keepalive de algum som para reiniciar a busca uma vez que a conexão com o servidor for perdida. Manter uma lista de MACs ou outros identificadores de hardware não é uma opção.

    
por JpaytonWPD 17.02.2015 / 15:38

4 respostas

3

De seus requisitos, acho que é exatamente para isso que o Multicast DNS (i.e. Bonjour) foi definido. Se você estiver usando sistemas Ubuntu, é provável que você já tenha o Avahi instalado o servidor avahi-daemon e o cliente avahi-discover

Basicamente você configuraria da seguinte forma:

  • Se você quiser um nome sofisticado para o seu servidor (em vez de seu nome de host, que é o padrão), você só precisa ter seu nome configurado corretamente no daemon do Avahi. Essa configuração pode ser feita através da área de trabalho ou modificando o arquivo de configuração /etc/avahi/avahi-daemon.conf e garantindo que ele tenha o seguinte definido:

    [server]
    host-name=database
    domain-name=local
    


  • O cliente precisaria apenas resolver o endereço IP do nome database.local para obter o endereço IP. Por exemplo, executando ping database.local ou usando as ferramentas Avahi: avahi-resolve -4 -n database.local

Isso funciona porque o domínio DNS local é definido como um domínio de multidifusão. O cliente enviará uma consulta multicast para a LAN, que atingirá todos os sistemas conectados. O daemon Avahi no servidor responderá a essa consulta fornecendo seu endereço IP.

Você poderá encontrar mais informações em como configurar o ZeroConf aqui .

Se você gostaria de mexer com mDNS , você também pode instalar tanto mzclient , avahi-utils e mdns-scan . O primeiro pode ser usado para anunciar um serviço e os outros para encontrar esse serviço na rede. Por exemplo:

Para executar no servidor um serviço para registrar um novo nome associado ao banco de dados MySQL:

    $ mzclient -p "_sql._tcp 3306 database"
    *** Registering name = 'database', type = '_sql._tcp', domain = 'local.'
    *** Registered name = 'database'
    (...)

Para tentar encontrar o serviço usando Avahi em um único tiro:

$ avahi-browse -t _sql._tcp 
+   eth0 IPv4 database    _sql._tcp            local

Ou examinando continuamente a rede tentando encontrar serviços de mDNs disponíveis:

    $ mdns-scan 
    + server [xx:xx:xx:xx:xx:xx]._workstation._tcp.local
    + database._sql._tcp.local
    Browsing ... \           
[ interrupt with Ctrl+Z]


Observe que nesta configuração você não está usando um servidor DNS central, não é necessário. Todas as consultas são feitas na LAN local usando o tráfego multicast.

    
por 18.02.2015 / 04:41
1

Eu acho que o MAC do servidor não vai chage, pelo menos não com freqüência, então eu usaria isso para identificar o IP do servidor. Eu usaria algo como arpwatch para monitorar a rede até que o par IP / MAC do servidor fosse identificado, tendo assim o IP do servidor.

    
por 17.02.2015 / 16:34
1

Uma varredura de rede com o nmap deve funcionar. Um primeiro passo muito mais fácil é executar o comando arp -a , que pode fornecer todos os mac e IP da sua rede de transmissão (se as solicitações ICMP não estiverem bloqueadas).

Em seguida, tente o ping do endereço de broadcast em que você está (requer solicitações de ICMP não bloqueadas). Por exemplo, se seu servidor for 192.168.1.10 e a máscara de rede for 255.255.255.0, então ping -b 192.168.1.255 (no Windows, seria ping -a 192.168.1.255 ) deve invocar respostas de todos os outros dispositivos (servidores, roteadores, thin clients, etc) na sua rede.

Naturalmente, isso só oferece dispositivos dentro da sua sub-rede. Se sua "rede" tiver mais sub-redes, você poderá executar ping para o endereço de difusão dessas outras redes e gerar uma lista semelhante de dispositivos de cada uma delas.

    
por 17.02.2015 / 19:29
1

Editar 2 (por nossa conversa):

Veja se isso funciona melhor para você (com mais informações):

  nmap -p 22 --open -sV 192.168.1.0/24

Como antes, adicione o awk se você quiser apenas o IP:

  nmap -p 22 --open -sV 192.168.1.0/24 | 
        awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'

onde:

nmap : the executable name
-p 22 : specifies the port to test
--open : suppress output for clients that are not listening
-sV : display the version string reported by the scanned server

Editar:

Se você está tentando obter o ipaddress em uma rede com a qual a máquina local pode potencialmente conversar, tente nmap :

nmap -sP -PA21,22,25,3389 192.168.1.1-254 | 
    awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'

Eu tento atingir um intervalo de portas personalizado para testar se os servidores estão em -PA21,22,25,3389 (na rede de difusão 192.168.1.1-254 ) você pode alterar isso se tiver uma porta específica que talvez saiba que está tentando atingir. Você pode remover o awk se quiser mais do que apenas os ipaddresses, ele também imprimirá o nome do host e tal.

Se você quiser apenas os endereços IP de um servidor em ifconfig , basta executar:

ifconfig | awk '/inet addr/{print substr($2,6)}'
[OR]
/sbin/ifconfig | awk '/inet addr/{print substr($2,6)}'

Isso imprimirá resultados como:

10.0.0.XX1
10.0.0.XX2
10.0.0.XX3
127.0.0.1

Para remover localhost - 127.0.0.1 dos resultados, use:

ifconfig | awk '/inet addr/{print substr($2,6)}' | awk '!/127.0.0.1/'

Result:
192.168.1.XXX

Você poderia colocar essa linha em um script como está e executá-la em máquinas locais para obter os endereços IP, ou você também pode colocar em um shell script para obter endereços remotos via ssh da seguinte forma:

#!/bin/sh
#getremoteips.sh
#chmod 700 getremoteips.sh ##Root should only be running this

ssh $1 "/sbin/ifconfig |
awk '/inet addr/{print substr(\,6)}' |
awk '!/127.0.0.1/'"

E para executar o script: ./getremoteips.sh <enter hostname or ip>

    
por 17.02.2015 / 17:31