Identify hosts by MAC address

Gyakran szükségem van arra, hogy a több helyen dinamikus IP címmel kapcsolódó notebook-oknak és más klienseknek be tudjam azonosítani az IP címüket ha nincs mód statikus beállításra, és így be tudjak lépni SSH-val, vagy VNC vagy akármivel, mert én is mindig máshol kapcsolódok a notimmal. Tegyük fel reverse kapcsolatra sincs praktikus lehetőség.

Írtam egy script-et, amely nmap-pel le-scan-neli a hálót, majd az arp táblából beazonosítja a MAC címekhez tartozó host neveket. Az nmap csak broadcast ping-et küld, tehát nem csinál port scan-t.

A kimenet egy normál 'arp -n' parancs kimenet, elején az IP címmel, a végén zárójelben a MAC-hez tartozó host névvel. Nem kell root jogosultság a futtatáshoz. A listát pedig bővítem folyamatosan a script elején.

Ha van rá már kész parancs vagy megoldás, akkor nem veszem zokon ha megosztjátok :)
--------------


#!/bin/sh
# IDENTIFY HOSTS BY MAC ADDRESSES ON LAN

MAC=$( mktemp )
chmod 0600 "$MAC"
trap "{ rm -f "$MAC"; exit; }" 0 1 2 3 5 15


# mac cím lista, kisbetűs hexa kóddal
echo "00:1f:aa:e4:56:fe  nagy.natalia"	>> "$MAC"
echo "00:22:43:67:23:55  besenyo.i"	>> "$MAC"
echo "00:20:34:5a:c3:45  pandacsoki.b"	>> "$MAC"


IFCONFIG="/sbin/ifconfig"
NMAP="/usr/bin/nmap"
ARP="/usr/sbin/arp"
COLOR="\E[30;47m"
BOLD="\033[1m"
NORMAL="\033[0m"

# arp tábla létrehozása nmap scan-nel
$IFCONFIG | grep -iEo "inet addr:[0-9.]*" | grep -iEo "[0-9.]*" | \
	grep -v "^127\." | sed -r s/"[0-9]*$"/"1-254"/ | \
	while read NUM; do
		$NMAP -sP "$NUM" 1>/dev/null 2>/dev/null
	done

# arp tábla kiírása a végén a host névvel
$ARP -n | head -n1 | tr -d "\n"; echo "  Hostname"
$ARP -n | grep -v "incomplete" | tail -n+2 | \
	while read TEXT; do
		if [ -z $FLAG ]; then echo -en "$BOLD"; FLAG=1; \
                        else echo -en "$NORMAL"; FLAG=""; fi
		M=$( echo "$TEXT" | tr -s " " "\t" | cut -f3 )
		echo -n "$TEXT"
		if N=$( grep -m1 "$M" "$MAC" ); then
			HOST=$( echo "$N" | tr -s " " "\t" | cut -f2 )
			echo "  ($HOST)"
		else
			echo
		fi
		echo -en "$NORMAL"
	done

rm -f "$MAC"

Hozzászólások

[margóra]
A SIGKILL (9) nem trap-pelhető, helyette én pl. a SIGQUIT (3) signal-t is el szoktam "kapni"
[/margóra]

--
A gyors gondolat többet ér, mint a gyors mozdulat.

javítva, köszi!

szerk.: mégegyet javítottam, hogy ne csak az ismert MAC címeket írja ki, hanem a többi megtaláltat is.

szerk.: beletettem még a soronként felváltott kövér / normál kimemelést, mert hosszúak a sorok, és így olvashatóbb hogy melyik hostnév-hez melyik IP tartozik. $BOLD helyett még jó szerintem a $COLOR használata.

Ez igazán hasznos, köszi! :)

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."

A BSD-s arp csak -a kapcsoloval eszi. Illetve az ifconfig-nak is lehet egy -a kapcsolot adni, ahol nincs fenn a iface, ott ugysincs inet addr (altalaban)
--


Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

arping?
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

nézem, ez is jónak tűnik az IP címekhez történő MAC címek felderítésére, olyan 17 sec alatt fut le, viszont sajna csak root joggal megy, és ahogy nézem kell a 10 ms a -w kapcsolónak, pl:


time for i in {1..254}; do arping -i wlan0 -c1 -w10 192.168.2.$i; done

viszont nmap ezért jobb imho, automatikusabb, mivel itt arping-nél nekem kell timeout időt saccolnom, és az meg kétes ugye. a broadcast ping nem ment nálam arping-gel.

szerk.: ja meg persze a sima ping is megfelelő akkor már, mert ott is megérkezik a MAC cím az arp request-re, csak az nmap ott is működik, ahol tiltva van az icmp echo. ezt teszteltem.

Nem nagyon látom értelmét a broadcast teljes végigjárásnak, ha alapból is ismerjük a beengedett gépek MAC címét és host nevét. Tekintve, hogy a DHCP lekéréskor az új IP is regisztrálódik az ARP táblában, így azt kell mondjam, hogy az IP-t ismerjük is, az arpinget ráengedve meg akár a MAC címét is. Mondjuk nem tudom mennyi értelme van ilyen szinten a MAC szűrésnek, amikor a hostname alapján is lehetne dolgozni ( fentebbi példában pl "besenyo.i" ). Bár szó se róla, a timeout és a root jogkör problémája valós az arping esetén.
Amúgy meg csak kérdeztem, hogy nem e használható számodra ez a megoldás is, nem célom kioktatni senkit, szóval félreértés ne essék :))
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

Ne menjünk bele ilyen nyelvészkedési dolgokba pls :) Nem állítom, hogy bármilyen nyelven jól tudnék beszélni (se magyarul, se angolul ), de azért igyekszem megértetni magam :D
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

egyáltalán nem vettem kioktatásnak, sőt, köszi az ötletet. sokat tanulok belőle. igazad van, hogy ha csak az ismert host-okat keressük, akkor valóban gyorsabb lehet közvetlenül rákérdezni. ez megint egy olyan dolog, amire nem gondoltam. :)

speciel nekem azért jó látnom az összes csatlakoztatott host-ot, mert amelyik hiányzik a listából, azt akkor fel tudom venni, illetve hogy mit keres ott.

amit szintén mindig köszönök, ha valaki kijavítja a shell kódomat, mert abból megint sokat szoktam tanulni.

Az tök mind1 honnan indítod a kérést, ha tudod a host nevét. Mivel az IP kéréskor a DHCP szerver már tudni fogja az adott gép MAC-jét is (illetve bizonyos szempontból a hálózatban lévő gépek is (max nem regisztrálják) hála a broadcast DHCP requestnek ), így a DHPC ARP cache-ébe belekerül a megfelelő érték ( tekintsünk most el az ARP spoofing, vagy ARP flooding technikáktól, mert azok tényleg bekavarhatnak ). Innentől meg csak annyi a dolgod, hogy a megfelelő DHCP szervert megkérdezve (valszeg ugyan azt amire te is csatalkoztál ) lekéred a hosthoz tartozó IP-t, amivel már megkapod az ARP bejegyzést is kapásból.
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

hogy a több helyen dinamikus IP címmel kapcsolódó
Én ebből indultam ki :) Ahol meg nem DHCP van, ott fel se merül, hogy az IP-ket kelljen koslatni, mert mindenkinek statikusan megvan az IP-je, aztán vagy connected, vagy sem :D Ez esetben meg DHCP szerver helyett megteszi egy karbantartott /etc/hosts file is :)
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

Nem.. Én még mindig ott tartok, hogy véges kliens ven ( és nem a full subnet ) amelyek hostnevei ismertek. Tekintve, hogy a domain suffixet a DNS adja, illetve, hogy tudod a host neveket, így szimplán ping/arping/nmon/whateva' programmal indított lekérés a hostname-re a DHCP szervernél fog kikötni, ami meg örömmel visszaadja neked az aktuális IP-t, és a hozzá tartozó ARP bejegyzést is. Nem érzem szükségességét annak, hogy az összes ARP adatot nyomban elkérjem egy ilyen feladat esetén a DHCP szervertől, főleg ha a hostok száma alacsony ( eléggé overkill megoldás az összes kliens ARP címét elkérni 1-2 host miatt )
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

mint feljebb írtam, én mindenképpen abból indulok ki, hogy a teljes arp táblára kíváncsi vagyok, éppen azért, mert én vagyok az admin, és látni akarom ki van csatlakozva, vagy milyen új eszköz jelent meg. :)

viszont ha akár abból indulok ki, hogy inkább a felvett MAC-eket akarnám arping-elni végig, lehet ez esetben is ez a hosszabb út, mivel lehet hogy több mint 256 címem lesz. nem írtam, de nyilván nem 4-5 címet fogok letárolni. és a címeket egybe terveztem tenni több alhálózatból.

(szerk.: itt persze már érdemes külön fájlban tárolni, és nem szórakozni az echo-val, így már nem is kell temp fájl.)

tehát ezek miatt még mindig az nmap-ot tartom gyorsabbnak, majd azt követve annak a kimenetéből összefésült eredményt :)

illetve még annyi, hogy ha nem kér címet a DHCP szervertől mert valami miatt statikus maradt, így akkoris fennakad a "hálómon", habár igaz hogy nem reális eset, de a teljesség miatt mérvadó. szerk.: ez így a hiba kizárás miatt is még egy plusz.

a te elképzelésed is tetszik, mert egy egész, már kész arp táblában gondolkodsz. viszont nem látom a megoldást arra, hogyan lehetne az eredeti igényeimmel összepárosítani.

Azt hiszem egy ponton félresiklott a beszélgetés :) Én fentebb beláttam, hogy a te megoldásod jobb, mint az általam kínált megoldás, így onnantól már csak elméleti diskurzus folyt az altémákról :)
Viszont akkor hogy legyen valami építő jellegű javaslatom is: Akkor meg miért nem mész be tényleg kulcsal a DHCP szerverhez, és onnan kéred ki kapásból mindent ami ott van ( IP, ARP, hostname ) nmapolás nélkül? ( jó, a statikusan felvett hostok ellen tény, hogy nem véd )
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

ez elfogadható. akár lehet egy másik script, ami a szerverről fut, vagy lekérem az arp-ot kulccsal, mindegy, és akkor nmap nélkül azonnal megkapható a kliens lista.

ezt megfogom csinálni.

egyébként eredetileg azért indultam ki a MAC alapon azonosításból, mert ugye IP és host név változhat, akár lehet egyforma host név (akár hibázásból). nekem meg ami fontos a munkámhoz, hogy fizikailag be tudjam pontosan azonosítani a hálón lógó eszközöket.

lényeg hogy ez mindenképp egy jó ötlet tőled, mert ilyen szempontból -mint írtam- nem gondoltam arra, hogy egybe elkérni az arp táblát a DHCP-s szervertől. :)

ez nekem is szimpatikusabb, szebb megoldás lenne összességében is, ha teljesen találkozik az igényemmel.

köszi.

Majd postold ki kérlek azt a megoldást is, ha nem nagy kérés :)
*btw - csak én hiányolom az ehhez hasonló szakmai beszélgetéseket a portálról? Ne válaszoljatok, költői kérdés volt..
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

tehát ha a szerverről futtatom, akkor ennyi a diff a másik script-hez képest:


@@ -56,13 +56,6 @@
 BOLD="\033[1m"
 NORMAL="\033[0m"
 
-# arp tábla létrehozása nmap scan-nel
-$IFCONFIG | grep -iEo "inet addr:[0-9.]*" | grep -iEo "[0-9.]*" | \
-       grep -v "^127\." | sed -r s/"[0-9]*$"/"1-254"/ | \
-       while read NUM; do
-               $NMAP -sP "$NUM" 1>/dev/null 2>/dev/null
-       done
-
 # arp tábla kiírása a végén a host névvel
 $ARP -n | head -n1 | tr -d "\n"; echo "  Hostname"
 $ARP -n | grep -v "incomplete" | tail -n+2 | \

'DHCP szervernél fog kikötni, ami meg örömmel visszaadja neked az aktuális IP-t, és a hozzá tartozó ARP bejegyzést is.'
Ize, tudtommal a DHCP szerver nem szokott onmagaban dns szervert jatszani, ahhoz kell egy dns szerver is. De fixme.
--


Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

Mi köze van a DNS-nek az ARP-hez? ( DNS => címfordítás az IP és a hálózati cím között ; ARP => MAC address és IP cím közötti "címfordítás" )
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

Nem egészen. A DHCP szerver tárolja a DHCP-n keresztül kiosztott címek listáját, így ő is tud az IP-kről. Tekintve, hogy az IP-kről csak úgy szerezhet tudomást, ha a local ARP cache-ébe felveszi az adott ARP entry-t ( nem azt se a DNS szervertől fogja elkérni ), így ő tudni fog róla. Ha te viszont tudod a gép hostnevét, akkor a DHCP-t megkérdezve megtudhatod az IP-jét (még mindig nincs DNS szerver sehol ), és ezzel együtt a hozzá tartozó ARP bejegyzést is. DNS szerver max akkor kell, ha több DHCP, több domainjét akarod összefogni, vagy ha olyan gép IP-jét szeretnéd megtudni, ami nincs a DHCP-s zónán belül ( ez esetben viszont ARP-hez megint nem sok közöd van, mert NAT-on belül közöd nem lesz a távoli gép ARP címéhez )
A DNS szerver sehol nem foglalkozik MAC címekkel vagy ARP bejegyzésekkel, mivel az csupán címfordításra van, illetve a többi zónában lévő további DNS szerverek közötti szinkron fenntartására.
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

"Ha te viszont tudod a gép hostnevét, akkor a DHCP-t megkérdezve megtudhatod az IP-jét"
Nekem ezzel a mozzanattal van bajom. Hogyan kered el a DHCP szervertol tetszoleges gep hostnevehez az IP-t? Tekintve, hogy a ping a /etc/resolv.conf -ban tarolt nevszervereket hasznalja, meg a /etc/hosts file-t, az egyetlen megoldasnak a ssh dhcpserver 'grep hostnev /var/lib/dhcp/dhcp.leases' tunik,
--


Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

Nem tudom emlékszel e arra a jópofa tulajdonságra, hogy a DHCP szervertől kapott IP cím egyben tartalmazza a subnet, netmask, és domain adatokat is. Ez pedig autó felül is vágja neked a resolv.conf-ot is ( hacsak nem rendelkezel külön a dhcpd beállításaiban ). Az mondjuk tény, hogy ezzel meg is kapod a DNS szerver(ek) elérhetőségét is, amihez meg majd fordulhatsz a hostnév feloldáskor.
Mondjuk ezen gondolatmenet után rájöttem hol van/volt a kommunikációs probléma: Én fejeztem ki magam rosszul. Ott valóban kell a DNS szerver ( engem az zavart be, hogy a MAC-et, meg az ARP-t ide keverted, vagy én értettem csak így ) a címfordításhoz.
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

találtam egy érdekes progit, hivatalos debian tárolóban benne van: arpwatch

"Arpwatch maintains a database of Ethernet MAC addresses seen on the network, with their associated IP pairs. Alerts the system administrator via e-mail if any change happens, such as new station/activity, flip-flops, changed and re-used old addresses."

hasonlít kicsit az én célomhoz is, hogy fel tudjam deríteni a MAC címek és IP-k változásait, viszont a lényeg amit a progim csinál azt nem tudja, hogy a listában átírja a MAC címeket nekem nevekre. viszont syslog-ba dobálja az értesítéseket, és fel lehet programozni a conf fájlt, hogy milyen változásnál küldjön pl. e-mailt az admin-nak.

akár a syslog-ban lévő MAC címeket is le lehetne egy script-tel cseréltetni a megtekintéshez, és akkor már egy komplett megoldás, csak név feloldással egészítjük ki. pl. a cat /var/log/syslog | grep arpwatch kimenetében sed-del kicserélni az összes MAC-et.