MikroTik i Cisco Discovery Protocol

Posted on nie 16 styczeń 2011 in MikroTik

CDP jest protokołem zaprojektowanym przez firmę Cisco. Działa w warstwie drugiej i korzysta z adresu multicast 01-00-0c-cc-cc-cc. No dobra, ale po co to? CDP umożliwia wymianę pomiędzy sąsiadami (urządzeniami bezpośrednio ze sobą połączonymi), informacji takich jak wersja systemu operacyjnego czy numery IP interfejsów. Bywa to niezwykle przydatne narzędzie w sytuacji gdy z jakichś powodów nie dysponujemy schematem sieci a chcemy zbadać jej topologię. CDP działa na większości urządzeń Cisco (i domyślnie jest włączony). Ramka CDP wysyłana jest standardowo co 60 sekund. Wpis wygasa po 180 sekundach. Oczywiście te wartości są konfigurowalne.

Poniżej kilka przykładów:

R2#show cdp neighbors 
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
R1                  Ser 0/1            161        R S I      2801      Ser 0/1/0
R2#

Na listingu powyżej widać, że wykryte zostało jedno urządzenie. Interfejs lokalny, do którego jest podłączony R1 to Serial 0/1, interfejs zdalny to Serial 0/1/0. Możemy też odczytać model routera i jego możliwości. Poniżej bardziej szczegółowy wynik:

R2#show cdp neighbors detail 
-------------------------
Device ID: R1
Entry address(es): 
  IP address: 172.16.1.1
Platform: Cisco 2801,  Capabilities: Router Switch IGMP 
Interface: Serial0/1,  Port ID (outgoing port): Serial0/1/0
Holdtime : 172 sec

Version :
Cisco IOS Software, 2801 Software (C2801-IPBASEK9-M), Version 15.0(1)M3, RELEASE SOFTWARE (fc2)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2010 by Cisco Systems, Inc.
Compiled Sun 18-Jul-10 02:54 by prod_rel_team

advertisement version: 2
VTP Management Domain: ''

R2#

Najistotniejszą informacją jaka została dodana jest adres IP sąsiada. Poza tym widzimy jeszcze informacje o wersji oprogramowania.

Urządzenia MikroTik dla odmiany korzystają ze swojego własnego protokołu o podobnej funkcjonalności - MNDP - MikroTik Neighbor Discovery Protocol. Tu dla odmiany wykorzystywany jest protokół UDP na porcie 5678. Mało kto jednak wie, że RouterOS wspiera także CDP (choć w bardzo okrojonej formie, jednak wystarczającej w większości sytuacji). Poniżej Router Cisco gadający z RouterOS:

#show cdp neighbors
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
rb450g-1         Fas 0/0            118           R       MikroTik  
R2               Ser 0/1/0          125         R S I     2651XM    Ser 0/1
R1#show cdp en
R1#show cdp entry rb450g-1
-------------------------
Device ID: rb450g-1
Entry address(es): 
  IP address: 10.0.0.2
Platform: MikroTik,  Capabilities: Router 
Interface: FastEthernet0/0,  Port ID (outgoing port): 
Holdtime : 101 sec

Version :
4.6

advertisement version: 1

Krótko mówiąc - jeśli znamy adres IP sąsiada wystarczy zalogować się na niego i badać dalej. Żmudne ale skuteczne ;)

OK. Ale w pewnych sytuacjach wolelibyśmy nie rozpowiadać wszem i wobec co za urządzenia w naszej sieci się "gnieżdżą" ;)

[bdr@stargate] > ip neighbor discovery print
 # NAME                                   DISCOVER
 0 ether1                                  no
 1 ether2                                  yes
 2 ether3                                  yes
 3 wlan1                                   no
 4 wlan2                                   no
[bdr@stargate] >ip neighbor discovery set 1 discover=no

Wyświetla listę interfejsów i wskazuje na których z nich uruchomione jest CDP (i MNDP). Domyślnie wyłączone są interwejsy wlan. Ale tu niespodzianka - jeśli dodamy interfejs wlan jako port do interfejsu bridge (co jest dość częstym zjawiskiem) to bridge już się rozgłasza. Pamiętajmy o tym.

Analogiczne polecenie w urządzenia Cisco to:

Router(config-if)#no cdp enable

Komenda wyłącza CDP na danym interfejsie. Możemy także wyłączyć CDP globalnie dla całego urządzenia:

Router(config)#no cdp run

CDP i inne systemy operacyjne

Jak się okazuje CDP to nie tylko domena urządzeń (i systemów operacyjnych) strikte sieciowych. Odpowiednie narzędzia dostępne są także na inne, mniej sieciowe, platformy. W naszym przykładzie przyjrzymy się NetBSD (bo tak) jednak analogicznie można skonfigurować jakikolwiek *BSD, Linux czy nawet Windows. W tym artykule skupię się na dwóch aplikacjach scdp oraz cdpr - jeśli chodzi o pierwszą - to umożliwia ona wysyłanie ramek CDP, natomiast cdpr służy (nie tylko) do odczytywania informacji CDP przychodzących na dany interfejs. Zakładam, że oba narzędzia są już zainstalowane.

[bdr@moria(pts/0)] sudo cdpr -d vr0
cdpr - Cisco Discovery Protocol Reporter
Version 2.3
Copyright (c) 2002-2008 - MonkeyMental.com

Using Device: vr0
Waiting for CDP advertisement:
(default config is to transmit CDP packets every 60 seconds)
Device ID
  value:  stargate
Addresses
  value:  10.0.0.193
[bdr@moria(pts/0)]

Po wydaniu polecenia z argumentem w postaci odpowiedniego interfejsu (niestety z uprawnieniami root) program "zawiesza się" w oczekiwaniu na nadejście ramki CDP. Po odebraniu je wyświetla kilka podstawowych informacji. Niewiele, ale opcją -v możemy zwiększyć szczegółowość ałtputu:

[bdr@moria(pts/0)] sudo cdpr -v -d vr0
cdpr - Cisco Discovery Protocol Reporter
Version 2.3
Copyright (c) 2002-2008 - MonkeyMental.com

Using Device: vr0
Waiting for CDP advertisement:
(default config is to transmit CDP packets every 60 seconds)
Received a CDP packet, header length: 85

cdp type/len/val:
  type:   0001 - Device ID
  length: 000c
Device ID
  value:  stargate

cdp type/len/val:
  type:   0002 - Addresses
  length: 0011
Addresses
  number: 1
  protocol: 01
  protocol len: 01
  protocol val: CC
  address len: 04
  address val: 10.0.0.193

cdp type/len/val:
  type:   0004 - Capabilities
  length: 0008
Capabilities
  value:  00000001
          Performs level 3 routing for at least one network layer protocol.

cdp type/len/val:
  type:   0005 - Software version
  length: 000a
Software version
  value:  5.0rc6

cdp type/len/val:
  type:   0006 - Platform
  length: 000c
Platform
  value:  MikroTik
[bdr@moria(pts/0)]

Nice!

No ok. To teraz spróbujmy zmusić naszą maszynę o wysyłania komunikatów CDP. W tym celu skorzystamy z innej aplikacji - scdp. scdp jest wysoce konfigurowalny i w zasadzie każdy element informacyjny cdp możemy nadpisać własną wartością (i udawać np. router Cisco). Pozostaniemy przy standardowych wartościach. Jedyną opcją, którą musimy "ruszyć" jest interfejs na jakim program ma działać. To do roboty:

[bdr@moria(pts/0)] sudo scdp -i vr0
[bdr@moria(pts/0)]

Co się stało? To co powinno - program zadziałał - raz :) W skrętkę poszła jedna ramka cdp. Po 180s wpis na sąsiedzie wygaśnie. Żeby zmusić program do ciągłej pracy użyjemy crona. Wpis powinien wyglądać tak:

*/1     *       *       *       *       /usr/pkg/bin/scdp -i vr0

Od tego momentu program będzie uruchamiany co minutę (czyli zgodnie z oczekiwaniami ;)). Rzecz jasna nic nie stoi na przeszkodzie by użyć opcji i dostosować wysyłane informację do własnych potrzeb. Wszystkie dostępne są po wydaniu polecenia scdp -h

Zajrzyjmy jeszcze na naszą maszynę MikroTik:

[admin@MikroTik] > ip neighbor print detail
  0 interface=ether2 address=10.0.0.194 mac-address=00:0D:B9:1A:ED:B8 identity="moria" platform="i386"
   version="NetBSD 5.0.2_PATCH NetBSD 5.0.2_PATCH (RTR-ALIX) #4: Sun May 16 16:21:13 CEST 2010
        root@coruscant:/import/src-stable/src/sys/arch/i386/compile/RTR-ALIX"
   unpack=none age=42s

Wszystko gra :)