Skip to content

Cisco Discovery Protocol

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

  1. LCF wrote:

    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

    Tuesday, May 13, 2008 at 12:46 am | Permalink
  2. dosiu wrote:

    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. ;)

    Tuesday, May 13, 2008 at 12:56 am | Permalink
  3. carstein wrote:

    Akurat CDP (jak i JDP) zalecam zawsze wyłączać ze względów bezpieczeństwa.

    Tuesday, May 13, 2008 at 10:15 am | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*

Captcha
Enter the letters you see above.