CDP во FreeBSD / LLDP во FreeBSD

Поставновка задачи звучит следующим образом: нам необходимо организовать возможность отображения информации о подключенных друг к другу устройств, по анологии с CDP. Так как во многих компаниях используется целый "зоопарк" коммутационного оборудования и операционных систем на серверах(в нашем случае - FreeBSD), то нам нужно попытаться найти универсальное решение.

Для начала предлагаем рассмотреть протоколы 2-го уровня модели OSI, специально разработанные для этих целей:

CDP

CDP (англ. Cisco Discovery Protocol) — проприетарный протокол второго уровня, разработанный компанией cisco Systems, позволяющий обнаруживать подключенное (напрямую или через устройства первого уровня) сетевое оборудование cisco, его название, версию IOS и IP-адреса. Поддерживается многими устройствами компании, почти не поддерживается сторонними производителями. Получаемая информация включает в себя типы подключенных устройств, интерфейсы маршрутизатора, к которым соседние устройства подключены, интерфейсы, использующиеся для создания соединений, а также модели устройств.

Техническое описание: Устройство посылает мультикаст анонс(advertisement) на MAC-адрес 01-00-0c-cc-cc-cc. В конфигурации по-умолчанию анонсы рассылаются каждые 60 с на порты Ethernet, Frame Relay и ATM. Каждое устройство, понимающее протокол, сохраняет полученную информацию в таблице и позволяет посмотреть её по команде show cdp neighbors. Если устройство трижды не прислало анонс (при значениях по-умолчанию — 3 минуты), оно удаляется из таблицы.

В анонсах также содержится информация о времени жизни пакета (Time To Live — TTL) или времени удержания информации (holdtime). Последний параметр определяет время, в течение которого будет храниться CDP информация, прежде чем она будет уничтожена. Протокол работает на канальном уровне и позволяет двум системам получить информацию друг о друге даже в том случае, если они используют различные протоколы сетевого уровня. Более подробную информацию можно найти на сайте Википедии CDP

LLDP

LLDP (Link Layer Discovery Protocol) - протокол канального уровня, позволяющий сетевому оборудованию оповещать локальную сеть о своем существовании и характеристиках, а также собирать такие-же оповещения, поступающие от соседнего оборудования. Протокол формально утвержден как IEEE standard 802.1AB-2005, в мае 2005 года, и является независимой от производителей сетевого оборудования заменой их патентованным протоколам, таким как Cisco Discovery Protocol, Extreme Discovery Protocol и Nortel Discovery Protocol.

Техническое описание: LLDP кадры отсылаются каждым оборудованием через все его порты через фиксированные интервалы времени. Каждый кадр содержит т.н. Link Layer Discovery Protocol Data Unit (LLDPDU), являющуюся набором TLV структур. TLV (от type-length-value) - бинарная конструкция из трех полей (тип, длина, значение), где первые два имеют фиксированный размер и задают размер для третьего, что позволяет легко кодировать/декодировать любую последовательность данных поле-значение. LLDPDU распространяется в Ethernet кадрах, где multicast MAC адрес пункта назначения - 01:80:c2:00:00:0e, а тип кадра - 0x88cc. Более подробную информацию можно найти на сайте Википедии LLDP

EDP

EDP (Extreme Discovery Protocol) — проприетарный протокол второго уровня, разработанный компанией Extreme Networks, позволяющий обнаруживать подключенное сетевое оборудование Extreme Networks. Более подробную информацию можно найти на сайте производителя http://www.extremenetworks.com/

FDP

FDP (Foundry Discovery Protocol) — проприетарный протокол второго уровня, разработанный компанией Foundry Networks, позволяющий обнаруживать подключенное сетевое оборудование Foundry Networks. В 2008 году компания "Foundry Networks" была приобретена компанией "Brocade Communications Systems". Более подробную информацию можно найти на сайте производителя http://www.brocade.com/

NDP

NDP (Nortel Discovery Protocol) — проприетарный протокол второго уровня, разработанный компанией Nortel, позволяющий обнаруживать подключенное сетевое оборудование Nortel, также известен как SONMP (SynOptics Network Management Protocol). Более подробную информацию можно найти на сайте производителя http://www.nortel.com/

Логично, что из всех вышеперечисленных протоколов нас заинтересуют только два: CDP и LLDP.

Теперь предагаем перейти к практике: существует несколько способов заставить FreeBSD рассылать и принимать анонсы CDP/LLDP, один их них - установить из портов приложения для работы с протоколами CDP и LLDP. После поиска в портах по ключевым словам "lldp" и "cdp" мы получили слудующие порты на выбор:

freebsd#cd /usr/ports/
freebsd#make search key="lldp"
Port: ladvd-0.8.5
Path: /usr/ports/net/ladvd
Info: A minimal CDP/LLDP daemon
Maint: sten@blinkenlights.nl
B-deps: libevent-1.4.12
R-deps: libevent-1.4.12
WWW: http://www.blinkenlights.nl/software/ladvd/

Port: openlldp-0.3.a_1
Path: /usr/ports/net-mgmt/openlldp
Info: Link Layer Discovery Protocol daemon
Maint: roar.pettersen@it.uib.no
B-deps:
R-deps:
WWW: http://sourceforge.net/projects/openlldp/

freebsd#cd /usr/ports/net-mgmt
freebsd#make search key="cdp"
Port: cdpd-1.0.2_4
Path: /usr/ports/net-mgmt/cdpd
Info: A daemon to send Cisco Discovery Protocol announces over ethernet
Maint: sem@FreeBSD.org
B-deps: libnet10-1.0.2a_4,1
R-deps:
WWW:

Port: cdpr-2.2.1
Path: /usr/ports/net-mgmt/cdpr
Info: Cisco Discovery Protocol Reporter
Maint: mich@FreeBSD.org
B-deps:
R-deps:
WWW: http://www.monkeymental.com/nuke/

Port: scdp-1.0.b_3
Path: /usr/ports/net-mgmt/scdp
Info: Tool that sends CDP (CISCO Discovery Protocol) Packets
Maint: arved@FreeBSD.org
B-deps: gettext-0.17_1 gmake-3.81_3 libiconv-1.13.1 libnet10-1.0.2a_4,1
R-deps:
WWW: http://sourceforge.net/projects/scdp/

Для начала мы рассмотрим способ рассылки анонса по CDP и LLDP: для этого достаточно установить из портов один их следующий демонов

  • порт net-mgmt/scdp - только CDP
  • порт net-mgmt/openlldp - только LLDP
  • порт net-mgmt/cdpd - CDP и LLDP
  • порт net/ladvd - CDP,EDP,FDP,NDP и LLDP

cdpd

Демон cdpd поддерживет работу только с протоколами CDP и LLDP. Прост в установке.

freebsd#cd /usr/ports/net-mgmt/cdpd/
freebsd#make install clean
freebsd#rehash

freebsd#cdpd -h
Usage: cdpd [-i iface] [-t time] [-dhor] [-c|-l]
-a   : send announces on all ethernet interfaces with IP addresses configured
-c   : do NOT send CDP packets (enabled by default)
-d   : increase debug level and do not daemonise
-i name : interface to send cdp packets on (only ethernet ones supported)
-h   : this help message
-o   : run once - send only one packet over each interface and exit
-l   : do NOT send LLDP packets (enabled by default)
-r   : announce host as a Router-capable device (Station by default)
-t time : period between announces (60 sec by default)

По умолчанию демон cdpd рассылает анонсы по протоколу CDP и LLDP, следовательно в настройке не нуждается.

Разрешим автозапуск демона cdpd при старте системы, для этого добавляем строки в /etc/rc.conf:

freebsd#echo "cdpd_enable=YES">>/etc/rc.conf

Запустим демон cdpd:

freebsd#/usr/local/etc/rc.d/cdpd start

 

ladvd

Демон ladvd поддерживет работу с протоколами CDP и LLDP. Прост в установке.

freebsd#cd /usr/ports/net/ladvd
freebsd#make install clean

Для настройки демона ladvd посмотрим на его флаги и параметры запуска:

freebsd#ladvd -h
Usage: ladvd [-c] [-l] [-f] INTERFACE INTERFACE
   -a = Auto-enable protocols based on received packets
   -d = Dump pcap-compatible packets to stdout
   -f = Run in the foreground
   -h = Print this message
   -m <address>= Management address (IPv4 and IPv6 supported)
   -n = Use addresses specified via -m for all interfaces
   -o = Run Once
   -r = Receive Packets
   -u <user> = Setuid User (defaults to ladvd)
   -v = Increase logging verbosity
   -w = Use wireless interfaces
   -c <cc> = System Country Code
   -l <location> = System Location
   -C = Enable CDP
   -E = Enable EDP
   -F = Enable FDP
   -N = Enable NDP

В настройках надо указать флаг -С для того, чтобы сервер стал рассылать анонсы по протоколу CDP.

Разрешим автозапуск демона ladvd при старте системы, для этого добавляем строки в /etc/rc.conf:

freebsd#echo ladvd_enable="YES">>/etc/rc.conf
freebsd#echo ladvd_flags="-С">>/etc/rc.conf

Запустим демон cdpd:

freebsd#/usr/local/etc/rc.d/ladvd start

OpenLLDP (lldpd)

Демон lldpd поддерживет работу только с протоколом LLDP. Прост в установке, в настройках не нуждается.

freebsd#cd /usr/ports/net-mgmt/openlldp
freebsd#make install clean

freebsd#lldpd -h

lldpd 0.3
(c) Copyright 2002 - 2006 The OpenLLDP Group
Dual licensed under the GPL and Other/Proprietary licenses.

This product borrows some code from the Open1X project. (http://www.open1x.org)

Usage: lldpd [-c config file] [-i device] [-d debug_level] [-f] [-s]


-c <path> : Use the config file <path> instead of the default.
-i <interface> : Use <interface> for LLDP transactions
-d <debug_level flags=""> : Set debug verbosity.
-f : Run in forground mode.
-s : Remove the existing control socket if found. (Should only be used in system init scripts!)


<debug_level> can be any of :
   A : Enable ALL debug flags.
   c : Enable CONFIG debug flag.
   s : Enable STATE debug flag.
   t : Enable TLV debug flag.
   i : Enable INT debug flag.
   n : Enable SNMP debug flag.
   x : Enable EXCESSIVE debug flag.

Разрешим автозапуск демона lldpd при старте системы, для этого добавляем строки в /etc/rc.conf:

freebsd#echo lldp_enable="YES">>/etc/rc.conf

Запустим демон lldpd:

freebsd#/usr/local/etc/rc.d/lldpd start

Cisco

***

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

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
s-frw-002        Fas 0/24          166            H       FreeBSD   re0

Switch(config)# no cdp run

Switch(config-if)# no cdp enable

CDPR

freebsd#cd /usr/ports/net-mgmt/cdpr/
freebsd#make install clean

freebsd#rehash
freebsd#cdpr -h
cdpr - Cisco Discovery Protocol Reporter
Version 2.2.1
Copyright (c) 2002-2006 - MonkeyMental.com

d: Specify device to use (eth0, hme0, etc.)
h: Print this usage
t: time in seconds to abort waiting for a packet (should be > 60)
v[vv]: Set verbose mode

** Options dealing with server updates: **
u: Send cdpr information to a cdpr server
requires config file as arg
l: Location/description of this port for use with -u or -s and -p
n: Override the hostname reported to the server for use with -u or -s and -p
s: Server to send information to specify port with a : after Server/IP
Example: 192.168.1.20:88 (default: 80) requires -p (overridden by -u)
p: Path of server script to send data to requires -s (overridden by -u)

freebsd#cdpr
cdpr - Cisco Discovery Protocol Reporter
Version 2.2.1
Copyright (c) 2002-2006 - MonkeyMental.com

1. re0 (No description available)
2. lo0 (No description available)
Enter the interface number (1-2):1
Using Device: re0
Waiting for CDP advertisement:
(default config is to transmit CDP packets every 60 seconds)
Device ID
   value: freebsd2.test.lan
Port ID
   value: fxp0
Addresses
   value: 10.11.22.33

http://en.wikipedia.org/wiki/Foundry_Networks

http://en.wikipedia.org/wiki/Nortel_Discovery_Protocol