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 :)