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)?
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.
Pour surveiller les baux Dhcp, il suffit de taper le terminal:
gedit /var/lib/dhcp/dhcpd.leases
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 dhcp
ou 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.
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.
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.