Portál AbcLinuxu, 12. května 2025 13:04
Záleží, co od toho přesně chceš. Nejjednodušší varianta (s ohledem na zátěž serveru a potřebné zásahy) je využít log DHCP serveru. Tj. budeš tam mít kdy si jaký klient žádal o adresu, kdy mu byla která přidělena a kdy ji uvolnil. Samozřejmě je to důvěryhodné natolik, nakolik lze věřit klientům, že se řídí DHCPkem. Navíc ti tam může chybět zpráva o uvolnění adresy pokud jej klient při vypnutí nepošle (pád systému apod.). Ale přinejmenším při příštím přiřazení téhle IP se to pořeší.
Další možností je prostě logovat si ARP cache. (příkazy arp, resp. ip ne; pokud by ti nestačila velikost cache jádra, tak třeba arpd). Výhodou je opět zcela pasivní chování a navíc dost dobrá spolehlivost. Nevidíš tím sice zapnuté počítače, které aktuálně nekomunikují, ale otázkou je, jestli jsou takové vůbec zajímavé.
Ping – no pokud už chceš pingat, tak pokud možno přes ARP ping (umí třeba nmap, pokud je spuštěný s root právy). Výhodou je, že ARP nemůže blokovat žádný firewall, pokud má počítač rozumně fungovat (resp. jo, může mít fixní ARP tabulku, ale to už je trochu mimo normální situace).
#!/bin/bash # tento skript je delan na to aby ho spustel cron po nejakych # rozumnych intervalech napr. 15 min # vkladejte adresy oddelene novym radkem viz. dale ip_range=" 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5" nmap -sP $ip_range -oG IP_temp &> /dev/null ### !!! pokud budete chtit casem pridat adresu do rozsahu pridejte ji do ### !!! promenne $ip_range i do souboru lastping # zkontroluje jestli existuje soubor lastping # pokud ne vytvori se a ulozi se do nej adresy z ip_range if [ ! -f lastping ]; then touch lastping declare -a ip ip=(`echo $ip_range | tr ' ' ' '`) for each in ${ip[@]}; do echo "$each" >> lastping done fi # rozparsuje vystup z nmapu a vybere z nej uspesne pingnute ip adresy while read line; do echo $line | egrep "Status: Up" | egrep -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" >> IP_temp2 done < IP_temp # funkce vraci informaci o poslednim pingu # pracuje ze souborem lastping # jeden parametr ip adresa function getLastPing() { hlp=0 while read line; do if [ "$line" = "$1" ]; then hlp=1 fi done < lastping if [ $hlp == 1 ]; then echo "1" return 0 fi echo "0" return 0 } # nacteme promenne s casem min=`date +%M` hour=`date +%H` day=`date +%d` month=`date +%m` year=`date +%Y` # pro kazdou uspesne pingnutou ip ulozi do souboru pojmenovaneho podle ip # bud cas pokud minuly ping selhal nebo hvezdicku pokud v pingoovani pokracujeme while read ip; do # zjistime info o poslednim pingu lastping=`getLastPing $ip` # pokud soubor s ip neexistuje if [ ! -f $ip ]; then # vytvorime ho touch $ip # a na prvni radek pridame info o zacatku testovani # a info o last pingu nas asi moc nezajima, takze ulozime cas echo -n "$day.$month.$year $hour:$min " >> $ip # pokud existuje soubor s ip else # zkontrolujeme jestli nezacina novy den if [ `tail -1 $ip | egrep -c "$day.$month.$year"` == 0 ]; then # zacal novy den # porovname lastping if [ $lastping == 1 ]; then # pokracujeme takze dame hvezdicku echo -n "$day.$month.$year *" >> $ip else # nepokracujeme takze dame cas echo -n "$day.$month.$year $hour:$min " >> $ip fi else # novy den nezacal if [ $lastping == 1 ]; then # pokracujeme takze dame hvezdicku echo -n "*" >> $ip else # nepokracujeme dame cas echo -n " $hour:$min " >> $ip fi fi fi done < IP_temp2 # uklada info o uspesne pinglych adresach do lastping touch hlpfile while read line; do hlp=0 pureIP=`echo "$line" | egrep -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"` while read ip; do if [ "$pureIP" = "$ip" ]; then hlp=1 fi done < IP_temp2 if [ $hlp == 1 ]; then echo $pureIP >> hlpfile else echo "$pureIP !" >> hlpfile fi done < lastping ## uklid ## mv hlpfile lastping rm IP_temp IP_temp2
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.