Comprobar si un servidor DHCP existente en mi red usando bash


23

usando CentOS con IP estática, ¿hay alguna forma de determinar si un servidor DHCP se ejecuta en la red usando bash?

Respuestas:


44

nmap hace esto fácilmente:

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

1
Aunque las respuestas existentes eran bastante buenas, ¡prefiero su solución!
Julie Pelletier

1
Buen comando, pero vale la pena señalar que esto solo genera el primer servidor DHCP que responde. Si existen varios servidores DHCP, este comando no los encontrará.
meter

6

Si está disponible en el repositorio hay dhcpdump

de la página del 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.

5

Si tiene a su tcpdumpdisposición, invocar el programa como root con los siguientes parámetros podría ayudarlo a encontrar el servidor:

tcpdump -i [id de interfaz] -nev udp puerto 68

Desafortunadamente, debido al diseño de mi red, no puedo capturar un apretón de manos DHCP completo de inmediato. Sin embargo, veo una solicitud de DHCP desde mi 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"

Después de dejar que 'tcpdump' se ejecute durante la noche, eventualmente vi 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

Si al ejecutar ese tcpdumpcomando, y ve una Oferta BOOTP / DHCP o Ack (Nack), eso será de un servidor DHCP, y la dirección MAC del servidor estará justo después de la marca de tiempo en la primera línea.

Entonces, el servidor DHCP (válido) aquí tiene la dirección MAC a8: 39: 44: 96: fa: b8`.

Usando una de las muchas herramientas de búsqueda de direcciones MAC en la web , veo que este MAC pertenece a A8:39:44 Actiontec Electronics, Inccuál es mi enrutador.

Para atrapar paquetes de servidores DHCP falsos a medida que ocurren, tendría que dejar este tcpdumpproceso ejecutándose en la ventana de terminal:

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

Esto solo me mostrará las respuestas del servidor DHCP de otros hosts que no sean mi servidor DHCP válido, siempre que el proceso se ejecute en su propia ventana.

El siguiente comando se ejecutará en segundo plano hasta que se capturen 100 paquetes, agregando cualquier mensaje de servidor DHCP falso al archivo /tmp/rogue. Nuevamente, la dirección MAC de su servidor DHCP válido debe usarse en el lugar apropiado, así como el descriptor de interfaz en su 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 &

``


+1 solía usar esto todo el tiempo en las redes VoIP de los clientes para ayudarlos a detectar servidores DHCP corruptos que estaban arruinando su servicio.
MaQleod

Sí, tuve que usarlo para encontrar servidores DHCP falsos en implementaciones tempranas de redes de cable módem hasta que descubrimos cómo filtrar el puerto UDP 67 saliente en cada tipo de cable módems pre-DOCSIS en nuestra red. Incluso después de identificar al pícaro, no siempre fue posible identificar qué módem estaba detrás. En casos severos, tuvimos que apagar cada nodo hasta que el pícaro se detuvo, y luego aislar qué amplificador en ese nodo para reducir el número de carretillas que haría el MSO. Tiempos divertidos. Larga vida a DOCSIS.
Nevin Williams

cualquier solución simple, porque quiero verificar con frecuencia con bash
Steve

Si deja este tcpdumpcomando en ejecución, mostrará los paquetes del servidor DHCP enviados por una dirección MAC que es diferente a la de su servidor DHCP. Por supuesto, deberá proporcionar la dirección en el lugar indicado ... La colocaré en mi respuesta en este momento, para obtener un mejor formato.
Nevin Williams

0

Dado el tiempo suficiente, podría ser posible realizar la detección pasivamente: recuerde que un cliente inicializador envía una transmisión DHCPDISCOVER. Si hay un servidor dhcpserver disponible, obtendrá una oferta y luego emitirá (¡nuevamente como transmisión!) Un DHCPREQUEST. Así

  • si recibe una transmisión DHCPREQUEST, hay un servidor dhcp
  • si recibe DHCPDISCOVER, pero no DHCPREQUEST en un segundo o dos (para tener en cuenta los servidores dhcp remotos a través de dhcp relay), no hay servidor dhcp
  • si ni siquiera recibe DHCPDISCOVER, debe esperar más tiempo o tratar de encontrar activamente un servidor dhcp (por ejemplo, según el método de Kenned)

El éxito de los primeros dos puntos depende del número de otros hosts recién conectados / arrancados a la red y también de los tiempos de arrendamiento.


0

Puede intentar crear un dispositivo de alias y usar un cliente dhcp en modo de prueba, donde imprime cualquier respuesta, sin volver a configurar la interfaz:

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

Solo tengo acceso a un cuadro de debian, por lo que si tiene otra implementación de dhcp, la opción de ejecución en seco puede ser diferente, como para dhcpcd:

dhcpcd -T eth0:1

Solía ​​ejecutar un script cron con algo como esto, que alertaría al administrador (¡yo!) Sobre servidores dhcp falsos.


1
cuando llame a ifconfig eth0:1 upla salidaSIOCSIFFLAGS: Cannot assign requested address
Steve
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.