Verifique se existe um servidor DHCP na minha rede usando o bash

23

usando o CentOS com IP estático, existe alguma maneira de determinar se um servidor DHCP está sendo executado na rede usando o bash?

Steve
fonte

Respostas:

44

nmap faz isso facilmente:

sudo nmap --script broadcast-dhcp-discover -e eth0

mostrará:

Starting Nmap 6.40 ( http://nmap.org ) at 2016-08-16 09:25 UTC
Pre-scan script results:
| broadcast-dhcp-discover: 
|   IP Offered: 192.168.14.67
|   DHCP Message Type: DHCPOFFER
|   Server Identifier: 192.168.14.1
|   IP Address Lease Time: 0 days, 0:05:00
|   Subnet Mask: 255.255.255.0
|   Router: 192.168.14.1
|   Domain Name Server: 193.190.127.150
|   Domain Name: maas
|   Broadcast Address: 192.168.14.255
|_  NTP Servers: 91.189.91.157, 91.189.89.199, 91.189.94.4, 91.189.89.198
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 0.27 seconds
Merlijn Sebrechts
fonte
1
Embora as respostas existentes sejam razoavelmente boas, prefiro sua solução!
Julie Pelletier
1
Bom comando, mas vale a pena notar que isso apenas gera o primeiro servidor DHCP que responde. Se existirem vários servidores DHCP, este comando não os encontrará.
poke
6

Se disponível no repositório, há dhcpdump

da página do manual:

SYNOPSIS
       dhcpdump [-h regular-expression] -i interface

DESCRIPTION
       This command parses the output of tcpdump to display the dhcp-packets for easier checking and debugging.

USAGE
       dhcpdump -i /dev/fxp0

       If you want to filter a specific Client Hardware Address (CHADDR), then you can specifiy it as a regular expressions:

       dhcpdump -i /dev/fxp0 -h ^00:c0:4f

       This will display only the packets with Client Hardware Addresses which start with 00:c0:4f.
Pol Hallen
fonte
5

Se você estiver tcpdumpdisponível, chamar o programa como root com os seguintes parâmetros pode ajudá-lo a encontrar o servidor:

tcpdump -i [identificação da interface] -nev porta udp 68

Infelizmente, devido ao layout da minha rede, não consigo capturar um handshake DHCP completo imediatamente. No entanto, vejo uma solicitação DHCP do meu iPad:

22:16:44.767371 30:10:e4:8f:02:14 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: (tos 0x0, ttl 255, id 15652, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 30:10:e4:8f:02:14, length 300, xid 0x42448eb6, Flags [none]
      Client-Ethernet-Address 30:10:e4:8f:02:14
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: Request
        Parameter-Request Option 55, length 6: 
          Subnet-Mask, Default-Gateway, Domain-Name-Server, Domain-Name
          Option 119, Option 252
        MSZ Option 57, length 2: 1500
        Client-ID Option 61, length 7: ether 30:10:e4:8f:02:14
        Requested-IP Option 50, length 4: 192.168.2.222
        Lease-Time Option 51, length 4: 7776000
        Hostname Option 12, length 15: "NevinWiamssiPad"

Depois de deixar o `tcpdump 'rodar durante a noite, acabei vendo este ACK:

07:46:40.049423 a8:39:44:96:fa:b8 > 68:a8:6d:58:5b:f3, ethertype IPv4 (0x0800), length 320: (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 306)
    192.168.2.1.67 > 192.168.2.22.68: BOOTP/DHCP, Reply, length 278, xid 0x5e7944f, Flags [none]
      Client-IP 192.168.2.22
      Your-IP 192.168.2.22
      Client-Ethernet-Address 68:a8:6d:58:5b:f3
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: ACK
        Server-ID Option 54, length 4: 192.168.2.1
        Lease-Time Option 51, length 4: 86400
        Subnet-Mask Option 1, length 4: 255.255.255.0
        Default-Gateway Option 3, length 4: 192.168.2.1
        Domain-Name-Server Option 6, length 8: 192.168.2.1,142.166.166.166

Se, ao executar esse tcpdumpcomando, você vir uma Oferta BOOTP / DHCP ou Ack (Nack), será de um servidor DHCP e o endereço MAC do servidor será logo após o registro de data e hora na primeira linha.

Portanto, o servidor DHCP (válido) aqui tem o endereço MAC a8: 39: 44: 96: fa: b8`.

Usando uma das muitas ferramentas de pesquisa de endereço MAC na Web , vejo que esse MAC pertence ao A8:39:44 Actiontec Electronics, Incqual é meu roteador.

Para capturar pacotes de servidores DHCP não autorizados à medida que ocorrem, eu precisaria deixar esse tcpdumpprocesso em execução na janela do terminal:

tcpdump -i en0 -nev udp src port 67 and not ether host a8:39:44:96:fa:b8

Isso só me mostrará respostas do servidor DHCP de hosts diferentes do meu servidor DHCP válido, desde que o processo esteja sendo executado em sua própria janela.

O comando a seguir será executado em segundo plano até que 100 pacotes sejam capturados, acrescentando ao arquivo qualquer mensagem não autorizada do servidor DHCP /tmp/rogue. Novamente, o endereço MAC do seu servidor DHCP válido deve ser usado no local apropriado, bem como o descritor de interface no seu sistema.

tcpdump -U -i en0 -c 100 -nev udp src port 67 and not ether host a8:39:44:96:fa:b8 >> /tmp/rogue 2>&1 &

`

Nevin Williams
fonte
O +1 costumava usar isso o tempo todo nas redes VoIP do cliente para ajudá-lo a detectar servidores DHCP não autorizados que estavam atrapalhando o serviço.
MaQleod
Sim, tive que usá-lo para encontrar servidores DHCP não autorizados em implantações iniciais de redes de modem a cabo até descobrirmos como filtrar a porta UDP de saída 67 em cada tipo de modem a cabo pré-DOCSIS em nossa rede. Mesmo depois de identificarmos o criminoso, nem sempre era possível identificar o modem por trás dele. Em casos graves, tivemos que desligar cada nó até que o invasor parasse e depois isolar qual amplificador naquele nó para restringir o número de rolos de caminhões que o MSO faria. Tempos divertidos. Viva DOCSIS.
Nevin Williams
qualquer solução simples, porque eu quero verificar com freqüência com o bash
Steve
Se você deixar esse tcpdumpcomando em execução, ele exibirá pacotes do servidor DHCP enviados por um endereço MAC diferente do seu servidor DHCP. Claro, você precisará fornecer o endereço no local indicado ... Vou colocá-lo na minha resposta atualmente, para obter uma melhor formatação.
Nevin Williams
0

Com tempo suficiente, pode ser possível fazer a detecção passivamente: Lembre-se de que um cliente inicializando envia uma transmissão DHCPDISCOVER. Se um dhcpserver estiver disponível, ele fará uma oferta e emitirá (novamente como transmissão!) Um DHCPREQUEST. portanto

  • se você receber uma transmissão DHCPREQUEST, haverá um servidor dhcp
  • se você receber DHCPDISCOVER, mas não houver DHCPREQUEST dentro de um ou dois segundos (para contabilizar servidores dhcp remotos via retransmissão dhcp), não haverá servidor dhcp
  • se você nem receber o DHCPDISCOVER, precisará esperar mais - ou tentar encontrar ativamente um servidor dhcp (por exemplo, conforme o método de Kenned)

O sucesso dos dois primeiros pontos depende do número de outros hosts recém-conectados / inicializados na rede e também dos tempos de concessão.

Hagen von Eitzen
fonte
0

Você pode tentar criar um dispositivo de alias e usar um cliente dhcp no modo de teste, onde ele imprime qualquer resposta, sem realmente reconfigurar a interface:

ifconfig eth0:1 up
dhclient -w -n eth0:1

Eu só tenho acesso a uma caixa debian, portanto, se você tiver outra implementação dhcp, a opção dry-run pode ser diferente, como para dhcpcd:

dhcpcd -T eth0:1

Eu costumava ter um script cron rodando com algo assim, que alertava o administrador (eu!) Sobre servidores desonestos dhcp.

Kenned
fonte
1
quando chamar ifconfig eth0:1 upa saídaSIOCSIFFLAGS: Cannot assign requested address
Steve