web-dev-qa-db-fra.com

Comment surveiller l'adresse IP louée par DHCP

J'ai le serveur Ubuntu 12.10 en tant que DRBL et CloneZilla. Comment savoir combien d'adresses IP ont été attribuées aux clients. Comment contrôler/surveiller le service démon DHCP (arrêt/démarrage/état)?

6
Kevin Liao

Toutes les réponses ci-dessus sont partielles. Et pour être honnête, il n'y a pas de solution simple. 1) Vous pouvez analyser le fichier de base de données dhcpd.leases et obtenir des informations sur les baux en cours, mais

  • vous ne recevrez aucune information sur les adresses FIXED (assignées par une ligne comme celle-ci:

    Host switch1      { hardware ethernet a1:b2:c3:d7:2f:bc ; fixed-address switch1.mydomain.com; }
    
  • et cela ne donne pas non plus d'informations sur la date de la dernière transmission d'un ack dhcp à la machine.

2) D'autre part, vous pouvez analyser le fichier dhcpd.log pour rechercher des lignes d'ack (elles ressemblent à ceci):

2017-03-12T08:44:52.421174+01:00, Linuxx, info, dhcpd: DHCPACK on 10.0.0.63 to 68:ab:35:59:9c:a1 via 10.0.0.1

Ce qui vous donne des informations sur les demandes et les réponses DHCPD, mais il n’ya pas d’informations sur les baux réels (durée, statut).

Ce que vous devriez vraiment faire est de faire les deux. Commencez par analyser le fichier journal, puis mettez à jour le fichier avec les informations obtenues à partir du fichier dhcpd.leases avec la base de données pour les informations manquantes telles que bail début-fin, etc.

Maintenant: j'ai joué à environ 2 jours de travail complet jusqu'à ce que je crée une solution qui crée un tableau HTML avec TOUS les baux actifs, FIXES et dynamiques. Voici le code que vous pouvez placer dans votre dossier cgi-bin ou ailleurs.

#!/usr/bin/Perl
#####################################################################################
# list dhcpd active leases 
#   - both "fixed" addresses which are normally not placed into leases database
#   - and dynamically given leases which are present in leases DB
# working for isc-dhcpd-server service but should also work for other compatible
# dhcpd servers. 
# produces HTML or CSV list of leases
#
# written by Marcin Gosiewski, BV Grupa s.c. Poland <[email protected]> http://www.bvsystemy.pl/ 
# based on portions of code by Jason Antman <[email protected]> 
#
# to make it work change the $logfilename and $leasedbname below and modify
# the regexp in second part of code (see below) to match your log lines format
# also you can optionally turn off reverse dns lookup (see below) which speeds up the process 
# of table creation and is useless unless you have reverse dns populated for 
# your fixed or dynamic leases
#
# CHANGELOG:
#     2017-03-13: initial version
use Socket;
use strict;
use warnings;
no warnings 'uninitialized';

# adjust this to match your files location: both log file and leases
# database. We use 2 last log files from logrotate, but you can add as many as you want
my @logfilenames = ( "/var/log/LOCALAPP.dhcpd.log.1", "/var/log/LOCALAPP.dhcpd.log" );
my $leasedbname = "/var/lib/dhcp/dhcpd.leases";
my %data = ();
# optional, can be modified to produce local time
use Time::Local;
use POSIX 'strftime';
my $now = time();
# local variables, lease information stored here
my $ip=""; 
my $status=""; 
my $interface=""; 
my $sdate="";         # beginning of lease
my $stime=""; 
my $edate="";         # end of lease
my $etime=""; 
my $adate="";         # last update (ACK) sent to requesting server
my $atime="";
my $mac=""; 
my $hostname="";
my $dnsname="";       # reverse dns lookup for Host

#######################################################################
# first gather data from logfile for all ACK actions
#######################################################################

# collect all lines from log files into memory...
my @lines = (); my @loglines=(); 
foreach my $logfilename (@logfilenames)
{
  open LOGFILE, '<', $logfilename;
  chomp(@loglines = <LOGFILE>);
  #printf "LINES1: " . scalar @loglines . " in " .$logfilename . "\n";
  Push(@lines, @loglines);
  close(LOGFILE);
}
@loglines=();
#printf "TOTAL LINES: " . scalar @lines . "\n";
foreach my $line (@lines)
{
  if ( $line !~ m/dhcpd: DHCPACK/) { next;}
  #printf "LINE: $line\n";

  ###############################
  # Modify the following line to make regexp capture 6 groups from log line:
  # 1 - date
  # 2 - time
  # 3 - ip 
  # 4 - mac
  # 5 - hostname if available
  # 6 - interface
  #$line =~ m/(^.{10})T(.{8}).+,\ dhcpd: DHCPACK on (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) to ((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}.*) via (.+)/;
  $line =~m/(^.{10})T(.{8}).+,\ dhcpd: DHCPACK on (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) to ((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}) (.*)via (.+)/;
  # process the input
  $adate="$1";
  $atime="$2";
  $ip="$3";
  $mac="$4";
  $hostname="$5";
  $interface="$6";
  #add some 'known' facts:
  $status="ACK";
  $sdate="";    #"FOREVER";
  $stime="";
  $edate="";
  $etime="";

  #create/update record for this mac_addr
  #you can add extra check here if the IP address is not duplicated within
  #ack history and choose only the newer one. 

  $data{"$mac"}->{'ip'} = "$ip";
  $data{"$mac"}->{'status'} = "$status";
  $data{"$mac"}->{'interface'} = "$interface";
  $data{"$mac"}->{'adate'} = "$adate";
  $data{"$mac"}->{'atime'} = "$atime";
  $data{"$mac"}->{'sdate'} = "$sdate";
  $data{"$mac"}->{'stime'} = "$stime";
  $data{"$mac"}->{'edate'} = "$edate";
  $data{"$mac"}->{'etime'} = "$etime";
  $data{"$mac"}->{'mac'} = "$mac";
  $data{"$mac"}->{'hostname'} = "$hostname";
}
#close(LOGFILE);

#######################################################################
# gather data from lease database for dynamic addresses
# update the records (for existing) or add new records
#######################################################################

my $isdata = 0;
my $type = "";

#this information is not present in leases database so we just set
#it to default values
$interface="dhcpd";
$status="ACTIVE";
$adate="-";
$atime="";

open LEASEDB, $leasedbname or die $!;
foreach my $line (<LEASEDB>) 
{
  chomp($line);
  $isdata = 1 if $line =~ /^lease /;
  $isdata = 0 if $line =~ /^}/;

  if ($isdata) 
  {
    if ($line =~ /^lease/) 
    {
      $ip = (split(" ", $line))[1];
    } 
    elsif ($line =~ /^  starts/) 
    {
      ($sdate, $stime) = (split(" ", $line))[2,3];
      $sdate =~ s/\//-/g;
      $stime =~ s/;//;
    } 
    elsif ($line =~ /^  ends/) 
    {
      ($type, $edate, $etime) = (split(" ", $line))[1,2,3];
      if($type eq "never;")
      {
        $edate="forever";
        $etime=" ";
      }
      else
      {
        $edate =~ s/\//-/g;
        $etime =~ s/;//;
      }
    } 
    elsif ($line =~ /^  hardware ethernet/) 
    {
            $mac = (split(" ", $line))[2];
            $mac =~ s/;//;
    } 
    elsif ($line =~ /^  client-hostname/) 
    {
            $hostname = (split(/\"/, $line))[1];
    }
    elsif($mac ne "") 
    {
        #we have parsed the whole record, no more matching entries
        #data is collected to variables. now Push the record.

        #now let's decide if we are updating the record or creating
        #new record

        # check against lease date, do not add expired leases
        # convert lease end time to local time/date and compare with $now
        my $y=0; my $m=0; my $d=0; my $H=0; my $M=0; my $S=0;
        my $edatetime = $now;
        ($y, $m, $d) = split("-", $edate);
        ($H, $M, $S) = split(":", $etime);
        $edatetime = timelocal($S,$M,$H,$d,$m-1,$y);
        if($edatetime >= $now)
        {
          # now check if record exists
          if(!defined($data{"$mac"}->{'mac'}))
          {
            #record does not exist, fill up default data
            $data{"$mac"}->{'mac'} = "$mac";
            $data{"$mac"}->{'interface'} = "$interface";
            $data{"$mac"}->{'ip'} = "$ip";
            $data{"$mac"}->{'hostname'} = "$hostname";
          }
          # record exists, let's check if we should update
          $data{"$mac"}->{'status'} = "$status";
          $data{"$mac"}->{'sdate'} = "$sdate";
          $data{"$mac"}->{'stime'} = "$stime";
          $data{"$mac"}->{'edate'} = "$edate";
          $data{"$mac"}->{'etime'} = "$etime";
          $data{"$mac"}->{'hostname'} = "$hostname";
          #we do NOT update ACK time because we do not have it
          #do NOT uncomment below
          #$data{"$mac"}->{'adate'} = "$adate";
          #$data{"$mac"}->{'atime'} = "$atime";

        }
    }
  }
}
close(LEASEDB);

#######################################################################
# sort data
#######################################################################

#we sort by IP but you can sort by anything.
my @sorted = sort { ($data{$a}{'ip'}) cmp ($data{$b}{'ip'}) } %data;

#######################################################################
# Print out everything to the HTML table
#######################################################################

my $hostnamelong="";

printf "Content-type: text/html\n\n";
printf "<html><head><title>Aktywne dzierzawy DHCP</title></head>\n";
printf "<style> table, th, td { border: 1px solid lightgray; border-collapse: collapse; padding: 3px; } ";
printf "tr:nth-child(even) { background-color: #dddddd; } ";
printf "</style>\n";
printf "<body>\n";
printf "<table border='1' cellpadding='6'>\n";
printf "<tr><th>IP</th><th>Status</th><th>Interface</th><th>Lease time</th><th>ACK time</th><th>Mac</th><th>Host</th></tr>\n";
foreach my $key (@sorted) {
    if($data{$key}{'mac'} eq "") { next ; }

    # BEGIN reverse dns lookup
    # can optionally turn off reverse dns lookup (comment out below lines) which speeds up the process 
    # of table creation and is useless unless you have reverse dns populated for 
    # your fixed or dynamic leases uncomment single line below instead:
    #
    # version without reverse dns lookup:
    # $hostnamelong = $data{$key}{'hostname'};
    #
    # version with reverse dns lookup: 
    # BEGIN
    $dnsname = gethostbyaddr(inet_aton($data{$key}{'ip'}), AF_INET);
    if($data{$key}{'hostname'} ne "")
    {
      $hostnamelong = $data{$key}{'hostname'} . " | " . $dnsname;
    }
    else
    {
      $hostnamelong = $dnsname;
    }
    $dnsname = "";
    # END

    printf "<tr>";
    printf "<td>" . $data{$key}{'ip'} ."</td>";
    printf "<td>" . $data{$key}{'status'} ."</td>";
    printf "<td>" . $data{$key}{'interface'} ."</td>";
    printf "<td>" . $data{$key}{'sdate'} . " " . $data{$key}{'stime'} ." - ";
    printf $data{$key}{'edate'} . " " . $data{$key}{'etime'} ."</td>";
    printf "<td>" . $data{$key}{'adate'} . " " . $data{$key}{'atime'} . "</td>";
    printf "<td>" . $data{$key}{'mac'} ."</td>";
    printf "<td>" . $hostnamelong ."</td>";
    printf "</tr>\n";
}

printf "</table>\n";
printf "</body></html>\n";

# END of programm

Veuillez noter que:

1) le script ci-dessus nécessite une légère modification avant de s'exécuter dans VOTRE environnement, vous devez modifier les emplacements des fichiers et une expression régulière en fonction du format de votre fichier journal. Voir le commentaire dans le script.

2) le script ci-dessus ne vérifie pas si l'adresse IP n'est pas répétée dans la table ACK, si 2 machines différentes ont reçu la même adresse au cours des derniers jours. Ceci est voulu par la conception (ce dont j'avais personnellement besoin pour voir chaque adresse mac présente dans mon réseau ces derniers jours) - vous pouvez facilement la modifier, il existe une section prête pour cela dans le code, ajoutez simplement une condition.

J'espère que vous aimez.

4
Marcin Gosiewski

Pour surveiller les baux Dhcp, il suffit de taper le terminal:

gedit /var/lib/dhcp/dhcpd.leases 
4
nux

Le script utilisé pour contrôler le démon DHCP dépend de celui que vous utilisez. Je suppose isc-dhcp-server. Alors ce serait:

service isc-dhcp-server stop
service isc-dhcp-server start
service isc-dhcp-server status

Si cela ne fonctionne pas, cherchez dans /etc/init un fichier de configuration nommé d'après dhcp, et utilisez-le. Supposons que votre fichier de configuration s'appelle dhcpd3.conf, puis vous devriez remplacer isc-dhcp-server dans les commandes ci-dessus par dhcpd3.

Pour voir "combien d'adresses IP ont été attribuées aux clients", ce qui correspond à votre demande d'origine, procédez comme suit:

grep "^lease" /var/lib/isc-dhcp-server/dhcpd.leases |sort |uniq |wc -l

Cela vous donnera clairement le nombre d'adresses attribuées.

Encore une fois, si vous obtenez une erreur indiquant que /var/lib/isc-dhcp-server n'est pas trouvé, cherchez dans /var/lib et remplacez-le par quelque chose qui suggère un serveur DHCP, généralement dhcpou dhcp3

Notez que, comme mentionné dans une autre réponse, il manquera la distinction entre les adresses assignées et actives (c'est-à-dire avec un système les utilisant actuellement). En outre, si un client est arrêté de force et ne libère pas le bail, vous obtiendrez également les adresses inutilisées signalées comme attribuées.

1
roadmr

Vous pouvez utiliser namp pour répertorier toutes les adresses IP de clients actives. Il peut également vous répertorier les clients DHCP et statiques.

vous pouvez installer Namp sur votre PC avec

Sudo apt-get install nmap

Ensuite, pour lister tous les clients actifs que vous pouvez faire comme,

 nmap -v -sP 192.168.0.0/255

ici, les adresses IP de 0 à 255 seront scannées et les adresses IP actives seront affichées.

Le meilleur moniteur de réseau sur lequel je peux me trouver est nethogs. vous pouvez l'obtenir en installant avec

Sudo apt-get install nethogs

Alors simplement

Sudo nethogs <connection_name>

Peut montrer le moniteur de trafic dans votre terminal.

j'espère que cela peut vous aider.

0
rɑːdʒɑ

Si vous utilisez isc-dhcp-server sur le serveur sans tête UBUNTU 14.04

Pour contrôler le isc-dhcp-server

service isc-dhcp-server stop
service isc-dhcp-server start
service isc-dhcp-server status

Pour surveiller le isc-dhcp-server

Cette méthode fonctionnera sur un serveur sans tête (non graphique) pour "baux DHCP attribués uniquement", connectez-vous, entrez la commande suivante à partir du terminal

cat /var/lib/dhcp/dhcpd.leases

Si NMAP a été installé, entrez cette commande à partir du terminal.

nmap -v -sP 192.168.0.0/24

Cette méthode fonctionnera sur ce sous-réseau et analysera 256 adresses, ainsi que les adresses IP et MAC en sortie. Cela répondra si l'hôte est en panne avec une adresse IP qui n'a pas d'attribution et répondra avec MAC et adresse IP si l'hôte est en place.

Selon que le commutateur ou le routeur se trouve ou non entre le PC et le réseau et que le routeur ou le commutateur "couche réseau 2/3/4" fonctionne.

tail -f /var/log/syslog générera les adresses DHCP activement attribuées.

tcpdump -i eth0 port 67 or port 68 -e -n va capturer les paquets DHCP sur les ports 67 et 68 sur l'interface réseau eth0

Si DHCPDUMP a été installé, entrez cette commande à partir du terminal.

dhcpdump -i eth0 DUMP "comme cela implique" les informations DHCP du serveur au client.

0
Off Grid