Spotkała Was kiedyś taka sytuacja, że chcecie coś zrobić z konkretnym serwerem pod kątem sieciowym (na przykład zmienić VLAN na switchu), ale okazuje się, że choć kabelki do niego są podłączone, to w gąszczu pozostałych ciężko jest znaleźć, gdzie on tak naprawdę jest wpięty? A na dokładkę w międzyczasie serwer służył piętnastu innym celom i nikt nie zatroszczył się o poprawienie opisu portu na switchu, więc tym bardziej ciężko odtworzyć informację… W takiej sytuacji z pomocą może przyjść na przykład CDP (Cisco Discovery Protocol).
Co to takiego? Protokół warstwy drugiej (łącza danych), wymyślony przez Cisco, który w najprostszym ujęciu służy do informowania innych urządzeń bezpośrednio podłączonych o swojej obecności. W standardowym pakiecie zazwyczaj jest informacja o nazwie i modelu urządzenia, nazwa hosta, adres IP, nazwa portu, numer VLAN, domenie VTP i kilka innych mniej bądź bardziej użytecznych informacji. CDP domyślnie jest włączone na wszystkich urządzeniach sieciowych Cisco (ze standardowymi parametrami – częstotliwość rozgłaszania: 60 sekund, czas wygasania informacji: 180 sekund).
Co to nam daje? A z naszego punktu widzenia to, że wystarczy na hoście z podniesionym linkiem odpalić na czas do 60 sekund jakiegoś tcpdumpa czy snoopa, a uzyskamy od switcha informację o jego nazwie i porcie, gdzie jesteśmy wpięci:
root@ant:~# tcpdump -i eth0 -s 1500 -v -c 1 'ether [20:2] = 0x2000'
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
21:53:10.844569 CDPv2, ttl: 180s, checksum: 692 (unverified), length 471
Device-ID (0x01), length: 19 bytes: 'sw4k-0.xxxxxxxxxxxxxx'
/.../
Port-ID (0x03), length: 19 bytes: 'GigabitEthernet4/48'
/.../
Pod Linuksem sprawa jest względnie prosta – tcpdump rozumie pakiety CDP i jeśli tylko odpowiedni przechwycimy, to wyświetli nam wszystkie potrzebne zazwyczaj informacje. Trochę gorzej jest pod Solarisem – chociaż snoop jest potężnym narzędziem, to akurat pakietów CDP nie rozumie. Pozostaje nam posłużyć się jakimś zewnętrznym narzędziem. Powodzenia w szukaniu – mi udało się znaleźć tylko coś takiego.
Z racji, że fajnie byłoby mieć takie polecenie w systemie, które nie wymaga uczenia się magicznej składni polecenia do sniffowania ruchu, wziąłem powyższy skrypt, poprzerabiałem go trochę (autor twierdzi, że działa pod Solarisem – nie wiem jakim cudem, mi OOTB nie chciał) i niniejszym powstała moja wersja tegoż skryptu:
root@ant:~# uname -a Linux ant 2.6.24-16-386 #1 Thu Apr 10 12:50:06 UTC 2008 i686 GNU/Linux root@ant:~# ./cdpinfo.pl -i eth0 Switch: sw4k-0.xxxxxxxxxxxxxx Port: GigabitEthernet4/48 VLAN: 527
server2.netinstall.srv:root ~ > uname -a SunOS server2.netinstall.srv 5.10 Generic_127112-10 i86pc i386 i86pc server2.netinstall.srv:root ~ > ./cdpinfo.pl -i nge0 Switch: sw6k5.adm.xxxxxxxxxxxxxx Port: GigabitEthernet9/22 VLAN: 66
Nie jest on całkiem idiotoodporny, nie jest najpiękniejszy i mocno wierzy w inteligencję ewentualnego użytkownika. Ale pomimo tego: SOA#1. U mnie wylądowało wśród pomocnych skryptów instalowanych domyślnie z Jumpstartu/Kickstartu. Może komuś się jeszcze przyda (o ja, naiwny…). Jakby ktoś jednak miał jakieś uwagi, pomysły, pretensje, cokolwiek – wie, gdzie mnie szukać.
3 Comments
CDP już wypadło z gry, przynajmniej tak uważa HP po tym jak LLDP zostało zatwierdzone jako standard IEEE. W sumie to LLDP jakoś bardziej gadatliwe jest:
LLDP Remote Devices Information
LocalPort | ChassisId PortId PortDescr SysName
——— + ————————- —— ——— ———————-
1 | pollux eth0
3 | pollux eth…
3 | pollux eth…
3 | pollux eth…
13 | 00 13 21 de 13 80 1 1 ds5-hp poziom 100 .52
14 | 00 14 38 7a a2 80 1 1 ds5-hp poziom 100 .51
19 | 00 15 60 40 17 80 1 1 ds5-hp poziom 300 .53
20 | 00 30 6e d6 a6 80 48 48 ds5-hp poziom 200 .54
22 | 00 16 35 b5 60 80 48 48 ds5-hp poziom 400 .57
30 | 00 0a 57 f1 1c c0 8 8 ds11-hp0
44 | 00 11 0a a7 a8 00 48 48 ds10-hp1
45 | 00 16 b9 0e c9 c0 48 48 ds8-hp1
46 | 00 17 a4 7f 77 40 1 1 ds6-hp0 poziom 500 .60
47 | 00 0a 57 9e 81 80 8 8 ds7-hp
Możliwe, nie przeczę. Chociaż akurat w moim otoczeniu urządzeń używających LLDP jest zdecydowana mniejszość (i domyślnie mają to wyłączone), za to wszystkie używają CDP. Dlatego skrypt mi się przyda. ;)
Akurat CDP (jak i JDP) zalecam zawsze wyłączać ze względów bezpieczeństwa.
Post a Comment