Controlla se un server DHCP esiste nella mia rete usando bash


23

utilizzando CentOS con IP statico, c'è un modo per determinare se un server DHCP in esecuzione sulla rete usando bash?

Risposte:


44

nmap lo fa facilmente:

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

mostrerò:

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
Sebbene le risposte esistenti fossero abbastanza buone, preferisco di gran lunga la tua soluzione!
Julie Pelletier,

1
Buon comando ma vale la pena notare che questo emette solo il primo server DHCP che risponde. Se esistono più server DHCP, questo comando non li troverà.
colpì l'

6

Se disponibile nel repository c'è dhcpdump

dalla pagina man:

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

Se hai a tcpdumpdisposizione, invocare il programma come root con i seguenti parametri potrebbe aiutarti a trovare il server:

tcpdump -i [id interfaccia] -nev porta udp 68

Sfortunatamente, a causa del layout della mia rete, non riesco a catturare subito una stretta di mano DHCP completa. Tuttavia, vedo una richiesta DHCP dal mio 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"

Dopo aver lasciato correre `tcpdump 'durante la notte, alla fine ho visto questo 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 quando si esegue quel tcpdumpcomando e si vede un'offerta BOOTP / DHCP o Ack (Nack), questo verrà da un server DHCP e l'indirizzo MAC del server sarà subito dopo il timestamp sulla prima riga.

Quindi il server DHCP (valido) qui ha l'indirizzo MAC a8: 39: 44: 96: fa: b8`.

Utilizzando uno dei tanti strumenti di ricerca di indirizzi MAC sul Web, vedo che questo MAC appartiene al A8:39:44 Actiontec Electronics, Incmio router.

Per catturare i pacchetti di server DHCP non autorizzati mentre si verificano, dovrei lasciare questo tcpdumpprocesso in esecuzione nella finestra del terminale:

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

Questo mi mostrerà solo le risposte del server DHCP da host diversi dal mio server DHCP valido, purché il processo sia in esecuzione nella sua finestra.

Il comando seguente verrà eseguito in background fino a quando non vengono acquisiti 100 pacchetti, aggiungendo al file eventuali messaggi del server DHCP non validi /tmp/rogue. Ancora una volta, l'indirizzo MAC del server DHCP valido deve essere utilizzato nella posizione appropriata, così come il descrittore di interfaccia sul 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 lo usava sempre sulle reti VoIP dei clienti per aiutarli a individuare server DHCP non autorizzati che stavano rovinando il loro servizio.
MaQleod,

Sì, ho dovuto usarlo per trovare server DHCP non autorizzati nelle prime distribuzioni di reti modem via cavo fino a quando non abbiamo capito come filtrare la porta UDP 67 in uscita su ogni tipo di modem via cavo pre-DOCSIS sulla nostra rete. Anche dopo aver identificato il ladro, non è stato sempre possibile identificare quale modem fosse dietro. Nei casi più gravi, abbiamo dovuto chiudere ogni nodo fino a quando la canaglia si è fermata, e quindi isolare quale amplificatore su quel nodo per restringere il numero di rotoli di camion che MSO avrebbe fatto. Momenti divertenti. Lunga vita a DOCSIS.
Nevin Williams,

qualsiasi soluzione semplice, perché voglio controllare spesso con bash
Steve

Se si lascia questo tcpdumpcomando in esecuzione, verranno visualizzati i pacchetti del server DHCP inviati da un indirizzo MAC diverso da quello del proprio server DHCP. Certo, dovrai fornire l'indirizzo nel posto indicato ... Lo inserirò nella mia risposta al momento, per ottenere una migliore formattazione.
Nevin Williams,

0

Dato il tempo sufficiente, potrebbe essere possibile eseguire il rilevamento passivamente: ricordare che un client di inizializzazione invia una trasmissione DHCPDISCOVER. Se un dhcpserver è disponibile, otterrà un'offerta e quindi emetterà (di nuovo come trasmissione!) Una RICHIESTA DHCP. così

  • se si riceve una trasmissione DHCPREQUEST, è presente un server DHCP
  • se ricevi DHCPDISCOVER, ma nessuna DHCPREQUEST entro uno o due secondi (per tenere conto dei server dhcp remoti tramite relè dhcp), non esiste un server dhcp
  • se non ricevi nemmeno DHCPDISCOVER, devi aspettare più a lungo - o provare a trovare attivamente un server dhcp (ad esempio secondo il metodo Kenned)

Il successo dei primi due punti dipende dal numero di altri host appena collegati / avviati alla rete e anche dai tempi di leasing.


0

Puoi provare a creare un dispositivo alias e utilizzare un client DHCP in modalità test, dove stampa qualsiasi risposta, senza riconfigurare effettivamente l'interfaccia:

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

Ho solo accesso a una casella debian, quindi se hai un'altra implementazione di dhcp, l'opzione di esecuzione a secco potrebbe essere diversa, come per dhcpcd:

dhcpcd -T eth0:1

Avevo uno script cron eseguito con qualcosa del genere, che avvisava l'amministratore (me!) Dei server rhdp dhcp.


1
quando chiama ifconfig eth0:1 upl'outputSIOCSIFFLAGS: Cannot assign requested address
Steve
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.