# LLDP (Link Layer Discovery Protocol) в VyOS

> Настройка LLDP в VyOS для автоматического обнаружения соседних устройств - просмотр топологии сети, диагностика подключений и мониторинг L2-соседей

Source: https://opennix.org/docs/vyos/services/vyos-lldp/



LLDP (Link Layer Discovery Protocol) - это стандартный протокол канального уровня (IEEE 802.1AB), используемый для автоматического обнаружения соседних сетевых устройств и обмена информацией о конфигурации. LLDP позволяет сетевым устройствам анонсировать свою идентификацию, возможности и соседей в локальной сети.

## Обзор

LLDP используется для:

- **Автоматического обнаружения топологии сети**: Определение физического подключения устройств
- **Документирования инфраструктуры**: Автоматический сбор информации о соседних устройствах
- **Диагностики**: Проверка корректности подключения кабелей
- **Мониторинга**: Интеграция с системами мониторинга для визуализации топологии
- **Инвентаризации**: Сбор информации о моделях, версиях ПО, серийных номерах

### Как работает LLDP

LLDP работает путем передачи специальных Ethernet-фреймов (multicast) на адрес `01:80:c2:00:00:0e`:

1. Устройство периодически отправляет LLDP-пакеты на все активные интерфейсы
2. Соседние устройства принимают эти пакеты и сохраняют информацию
3. Информация хранится в течение определенного времени (TTL)
4. Устройства также слушают LLDP-пакеты от соседей

### Передаваемая информация

LLDP может передавать следующие типы данных (TLVs - Type-Length-Value):

- **Chassis ID**: Уникальный идентификатор устройства (MAC-адрес, серийный номер)
- **Port ID**: Идентификатор порта/интерфейса
- **TTL**: Время жизни записи (обычно 120 секунд)
- **System Name**: Имя устройства (hostname)
- **System Description**: Описание системы (модель, версия ОС)
- **System Capabilities**: Возможности устройства (router, switch, bridge)
- **Management Address**: IP-адрес для управления
- **Port Description**: Описание порта
- **Port VLAN ID**: VLAN на порту (опционально)
- **Link Aggregation**: Информация о link aggregation (опционально)

### LLDP vs CDP

| Характеристика | LLDP | CDP (Cisco Discovery Protocol) |
|----------------|------|--------------------------------|
| Стандарт | IEEE 802.1AB (открытый) | Cisco proprietary |
| Поддержка | Все производители | Только Cisco |
| Multicast адрес | 01:80:c2:00:00:0e | 01:00:0c:cc:cc:cc |
| Интервал отправки | 30 секунд (по умолчанию) | 60 секунд |
| Рекомендация | Предпочтительно | Для Cisco-only сетей |

## Базовая конфигурация

### Включение LLDP

```bash
# Включить LLDP глобально
set service lldp

commit
save
```

После включения LLDP будет работать на всех интерфейсах по умолчанию.

### Просмотр соседей LLDP

```bash
# Показать всех соседей
show lldp neighbors

# Детальная информация о соседях
show lldp neighbors detail

# Соседи на конкретном интерфейсе
show lldp neighbors interface eth0
```

Пример вывода:

```
Interface    Device ID         Port ID    Capability
---------    ---------         -------    ----------
eth0         switch-core-01    Gi1/0/1    Bridge,Router
eth1         switch-access-02  Gi2/0/24   Bridge
```

### Настройка параметров LLDP

```bash
# Включить LLDP
set service lldp

# Интервал отправки LLDP-пакетов (в секундах)
set service lldp legacy-protocols cdp  # Опционально: для совместимости с CDP

# Management address (для доступа к устройству)
set service lldp management-address 192.168.1.1

commit
save
```

## Расширенная конфигурация

### Настройка LLDP на конкретных интерфейсах

```bash
# Включить LLDP
set service lldp

# Отключить LLDP на конкретном интерфейсе
set service lldp interface eth2 disable

# Включить обратно (удалить disable)
delete service lldp interface eth2 disable

commit
save
```

### Настройка описания для соседей

```bash
# Включить LLDP
set service lldp

# Установить location (физическое расположение)
set service lldp snmp location "DataCenter-1, Rack-15, RU-42"

commit
save
```

### Настройка legacy protocols (CDP)

Для совместимости с Cisco устройствами можно включить CDP:

```bash
# Включить LLDP с поддержкой CDP
set service lldp
set service lldp legacy-protocols cdp

commit
save
```

**Примечание**: CDP - это проприетарный протокол Cisco, но VyOS может слушать CDP-пакеты для совместимости.

### SNMP интеграция

```bash
# Включить LLDP
set service lldp

# Установить SNMP location для LLDP
set service lldp snmp location "Building-A, Floor-3, Room-301"

# Включить SNMP для доступа к LLDP MIB
set service snmp community public authorization ro
set service snmp listen-address 0.0.0.0

commit
save
```

LLDP MIB (LLDP-MIB) доступен через SNMP:
- OID базовый: `1.0.8802.1.1.2`
- Локальная информация: `1.0.8802.1.1.2.1.3`
- Удаленная информация: `1.0.8802.1.1.2.1.4`

## Примеры конфигураций

### Пример 1: Базовая конфигурация LLDP

```bash
# Включить LLDP на всех интерфейсах
set service lldp

# Установить management address
set service lldp management-address 192.168.1.1

# Установить location
set service lldp snmp location "Main Office, Network Closet A"

commit
save
```

Проверка:

```bash
show lldp neighbors
show lldp neighbors detail
```

### Пример 2: LLDP в среде с Cisco устройствами

```bash
# Включить LLDP с CDP compatibility
set service lldp
set service lldp legacy-protocols cdp

# Management address
set service lldp management-address 10.0.0.1

commit
save
```

Проверка Cisco соседей:

```bash
show lldp neighbors
# Или на Cisco стороне:
# show cdp neighbors
```

### Пример 3: Селективное включение LLDP

```bash
# Включить LLDP глобально
set service lldp

# Отключить на интерфейсах к конечным пользователям (security)
set service lldp interface eth2 disable
set service lldp interface eth3 disable

# Оставить включенным на uplink интерфейсах (eth0, eth1)

commit
save
```

### Пример 4: LLDP для документирования ЦОДа

```bash
# Включить LLDP
set service lldp

# Детальная информация о расположении
set service lldp snmp location "DC1, Pod-3, Rack-15, RU-42, Row-G"

# Management address
set service lldp management-address 10.255.255.1

# SNMP для мониторинга
set service snmp community monitoring authorization ro
set service snmp community monitoring network 10.0.0.0/8

commit
save
```

### Пример 5: LLDP с автоматизацией (Ansible)

Конфигурация VyOS:

```bash
# Включить LLDP
set service lldp
set service lldp management-address 192.168.1.1

commit
save
```

Ansible playbook для сбора LLDP информации:

```yaml
- name: Collect LLDP information from VyOS routers
  hosts: vyos_routers
  gather_facts: no

  tasks:
    - name: Get LLDP neighbors
      vyos.vyos.vyos_command:
        commands:
          - show lldp neighbors detail
      register: lldp_output

    - name: Display LLDP neighbors
      debug:
        var: lldp_output.stdout_lines

    - name: Save to file
      copy:
        content: "{{ lldp_output.stdout[0] }}"
        dest: "./lldp_{{ inventory_hostname }}.txt"
```

### Пример 6: LLDP мониторинг с LibreNMS

VyOS конфигурация:

```bash
# LLDP
set service lldp
set service lldp management-address 192.168.1.1

# SNMP для LibreNMS
set service snmp community librenms authorization ro
set service snmp community librenms network 192.168.1.0/24
set service snmp listen-address 0.0.0.0

commit
save
```

LibreNMS автоматически обнаружит LLDP соседей и построит карту топологии.

## Мониторинг и диагностика

### Просмотр LLDP соседей

```bash
# Все соседи (краткий формат)
show lldp neighbors

# Детальная информация о всех соседях
show lldp neighbors detail

# Соседи на конкретном интерфейсе
show lldp neighbors interface eth0

# Информация о конкретном соседе
show lldp neighbors interface eth0 detail
```

### Примеры вывода

**Краткий формат**:

```
Capability Codes: R - Router, B - Bridge, W - Wlan r - Repeater, S - Station
                  D - Docsis, T - Telephone, O - Other

Interface    Local    Remote           Remote               Capability
             Port ID  Chassis ID       Port ID
---------    -------  --------------   -------------------  ----------
eth0         eth0     00:1b:21:d4:d0   GigabitEthernet1/0/1 B,R
eth1         eth1     00:1b:21:d4:d1   GigabitEthernet2/0/5 B
```

**Детальный формат**:

```
Interface: eth0
  Chassis ID: 00:1b:21:d4:d0:00
  System Name: switch-core-01
  System Description: Cisco IOS Software, Version 15.2(4)E
  Port ID: GigabitEthernet1/0/1
  Port Description: Uplink to VyOS Router
  Capability: Bridge, Router
  Management Address: 192.168.1.10
  Time to Live: 120 seconds
```

### Проверка локальной информации

```bash
# Локальная информация LLDP
show lldp interface

# Детали локального интерфейса
show lldp interface eth0
```

### Отладка LLDP

```bash
# Проверка работы LLDP демона
show log | match lldp

# Проверка процесса lldpd
ps aux | grep lldpd

# Restart LLDP service (если необходимо)
sudo systemctl restart lldpd

# Статус сервиса
sudo systemctl status lldpd
```

### Мониторинг LLDP пакетов

```bash
# Захват LLDP пакетов на интерфейсе
sudo tcpdump -i eth0 -vv ether proto 0x88cc

# Или с использованием multicast адреса
sudo tcpdump -i eth0 ether dst 01:80:c2:00:00:0e
```

### SNMP мониторинг LLDP

```bash
# Получение LLDP информации через SNMP
snmpwalk -v2c -c public 192.168.1.1 LLDP-MIB::lldpRemTable

# Локальная информация
snmpwalk -v2c -c public 192.168.1.1 LLDP-MIB::lldpLocPortTable

# Удаленные устройства
snmpwalk -v2c -c public 192.168.1.1 LLDP-MIB::lldpRemChassisId
```

## Устранение неполадок

### Проблема: LLDP соседи не обнаруживаются

**Диагностика**:

```bash
# 1. Проверка, что LLDP включен
show configuration service lldp

# 2. Проверка интерфейса (не disabled ли)
show configuration service lldp interface

# 3. Проверка статуса интерфейса
show interfaces

# 4. Захват трафика LLDP
sudo tcpdump -i eth0 ether proto 0x88cc

# 5. Проверка логов
show log | match lldp
```

**Решение**:

```bash
# Включить LLDP, если отключен
set service lldp

# Убедиться, что интерфейс не disabled
delete service lldp interface eth0 disable

# Проверить, что интерфейс up
show interfaces ethernet eth0

commit
save

# Перезапуск LLDP daemon (если необходимо)
sudo systemctl restart lldpd
```

### Проблема: LLDP работает, но не передается нужная информация

**Причина**: Некоторая информация может не передаваться по умолчанию.

**Решение**:

```bash
# Убедиться, что установлен management address
set service lldp management-address 192.168.1.1

# Установить location
set service lldp snmp location "Building-A, Floor-2"

commit
save
```

### Проблема: LLDP не работает с Cisco устройствами

**Причина**: Cisco может использовать CDP вместо LLDP.

**Решение**:

На VyOS:

```bash
# Включить CDP compatibility
set service lldp legacy-protocols cdp

commit
save
```

На Cisco:

```
# Включить LLDP (если не включен)
lldp run

# На интерфейсах
interface GigabitEthernet1/0/1
  lldp transmit
  lldp receive
```

### Проблема: LLDP соседи появляются и исчезают

**Причина**: TTL (Time To Live) истекает быстрее, чем приходят новые пакеты.

**Диагностика**:

```bash
# Проверка TTL в детальной информации
show lldp neighbors detail

# Мониторинг исчезновений
watch -n 5 'show lldp neighbors'
```

**Решение**:

Проблема обычно на стороне соседа. Проверить:
- Интервал отправки LLDP-пакетов на соседнем устройстве
- Нагрузка на процессор соседнего устройства
- Проблемы с кабелем или портом

### Проблема: LLDP показывает неправильную информацию

**Причина**: Кэшированная информация от старого соседа.

**Решение**:

```bash
# Перезапуск LLDP для очистки кэша
sudo systemctl restart lldpd

# Подождать 30-60 секунд для получения новых LLDP-пакетов
sleep 60

# Проверка
show lldp neighbors
```

### Проблема: SNMP не возвращает LLDP информацию

**Диагностика**:

```bash
# Проверка SNMP конфигурации
show configuration service snmp

# Тест SNMP доступа
snmpwalk -v2c -c public localhost SNMPv2-MIB::sysDescr

# Проверка LLDP MIB
snmpwalk -v2c -c public localhost LLDP-MIB::lldpLocChassisId
```

**Решение**:

```bash
# Убедиться, что SNMP включен
set service snmp community public authorization ro
set service snmp listen-address 0.0.0.0

commit
save

# Перезапуск SNMP
sudo systemctl restart snmpd
```

## Интеграция с системами мониторинга

### LibreNMS

LibreNMS автоматически обнаруживает и визуализирует LLDP топологию.

**Конфигурация VyOS**:

```bash
set service lldp
set service lldp management-address 192.168.1.1
set service snmp community librenms authorization ro
set service snmp listen-address 0.0.0.0

commit
save
```

**В LibreNMS**:
1. Добавить устройство через Web UI или CLI
2. LibreNMS автоматически обнаружит LLDP соседей
3. Карта топологии будет построена автоматически (Map → Topology)

### Observium

**Конфигурация VyOS**:

```bash
set service lldp
set service lldp management-address 192.168.1.1
set service snmp community observium authorization ro
set service snmp listen-address 0.0.0.0

commit
save
```

Observium использует LLDP MIB для построения карты сети.

### Zabbix

**Конфигурация VyOS**:

```bash
set service lldp
set service lldp management-address 192.168.1.1
set service snmp community zabbix authorization ro
set service snmp v3 user zabbix auth type sha
set service snmp v3 user zabbix auth plaintext-password 'AuthPassword123!'
set service snmp v3 user zabbix privacy type aes
set service snmp v3 user zabbix privacy plaintext-password 'PrivPassword123!'

commit
save
```

Zabbix template для LLDP мониторинга использует SNMP discovery для автоматического обнаружения соседей.

### Netbox

Netbox может импортировать LLDP данные через API или скрипты.

**Скрипт для экспорта LLDP в JSON**:

```bash
#!/bin/bash

# Получение LLDP neighbors в JSON формате
vtysh -c "show lldp neighbors detail json" > /tmp/lldp_neighbors.json

# Отправка в Netbox через API
curl -X POST https://netbox.example.com/api/dcim/cables/ \
  -H "Authorization: Token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d @/tmp/lldp_neighbors.json
```

### Grafana + Prometheus

LLDP данные можно экспортировать через SNMP exporter для Prometheus.

**Prometheus SNMP exporter config**:

```yaml
modules:
  lldp:
    walk:
      - 1.0.8802.1.1.2  # LLDP-MIB
    metrics:
      - name: lldpRemSysName
        oid: 1.0.8802.1.1.2.1.4.1.1.9
        type: DisplayString
```

## Лучшие практики

### 1. Всегда включать LLDP

Включайте LLDP на всех сетевых устройствах для автоматического документирования:

```bash
set service lldp
set service lldp management-address <mgmt-ip>
```

### 2. Установка информативного location

Используйте детальное описание физического расположения:

```bash
set service lldp snmp location "DC-Moscow, Building-2, Floor-3, Rack-A15, RU-42"
```

### 3. Отключение LLDP на untrusted интерфейсах

Отключайте LLDP на портах, доступных конечным пользователям (security):

```bash
set service lldp interface eth2 disable  # User-facing port
set service lldp interface eth3 disable  # Guest network
```

### 4. CDP compatibility для смешанных сред

В сетях с Cisco оборудованием включайте CDP:

```bash
set service lldp legacy-protocols cdp
```

### 5. SNMP интеграция для мониторинга

Всегда настраивайте SNMP для доступа к LLDP MIB:

```bash
set service snmp community monitoring authorization ro
```

### 6. Регулярная проверка топологии

Периодически проверяйте LLDP соседей для обнаружения изменений:

```bash
show lldp neighbors
```

Используйте автоматизацию (Ansible, Python) для регулярного аудита.

### 7. Документирование через описания интерфейсов

Используйте описания интерфейсов в сочетании с LLDP:

```bash
set interfaces ethernet eth0 description "Uplink to switch-core-01 Gi1/0/1"
```

### 8. Мониторинг изменений топологии

Настройте алерты на изменения LLDP соседей в системах мониторинга для обнаружения:
- Неавторизованных подключений
- Замены оборудования
- Проблем с кабелями

### 9. Использование management VLAN

Настройте management address из выделенного management VLAN:

```bash
set interfaces ethernet eth0 vif 99 address 10.255.255.1/24
set service lldp management-address 10.255.255.1
```

### 10. Резервное копирование LLDP данных

Периодически сохраняйте вывод LLDP для документации:

```bash
show lldp neighbors detail > /config/lldp-backup-$(date +%Y%m%d).txt
```

## Полезные команды

```bash
# Показать всех LLDP соседей
show lldp neighbors

# Детальная информация
show lldp neighbors detail

# Соседи на конкретном интерфейсе
show lldp neighbors interface eth0

# Локальная информация LLDP
show lldp interface

# Конфигурация LLDP
show configuration service lldp

# Логи LLDP
show log | match lldp

# Захват LLDP пакетов
sudo tcpdump -i eth0 ether proto 0x88cc

# SNMP запрос LLDP данных
snmpwalk -v2c -c public localhost LLDP-MIB::lldpRemTable

# Статус LLDP демона
sudo systemctl status lldpd

# Перезапуск LLDP
sudo systemctl restart lldpd

# Сохранение LLDP информации в файл
show lldp neighbors detail > /tmp/lldp-neighbors.txt
```

## Интеграция с автоматизацией

### Python скрипт для сбора LLDP данных

```python
#!/usr/bin/env python3

import subprocess
import json
import re

def get_lldp_neighbors():
    """Получение LLDP соседей с VyOS роутера"""
    try:
        # Выполнение команды через SSH или локально
        result = subprocess.run(
            ['vtysh', '-c', 'show lldp neighbors detail'],
            capture_output=True,
            text=True
        )

        # Парсинг вывода
        neighbors = []
        current = {}

        for line in result.stdout.splitlines():
            if line.startswith('Interface:'):
                if current:
                    neighbors.append(current)
                current = {'interface': line.split(':')[1].strip()}
            elif 'System Name:' in line:
                current['system_name'] = line.split(':')[1].strip()
            elif 'Port ID:' in line:
                current['port_id'] = line.split(':')[1].strip()
            elif 'Management Address:' in line:
                current['mgmt_address'] = line.split(':')[1].strip()

        if current:
            neighbors.append(current)

        return neighbors

    except Exception as e:
        print(f"Error: {e}")
        return []

if __name__ == '__main__':
    neighbors = get_lldp_neighbors()
    print(json.dumps(neighbors, indent=2))
```

### Ansible playbook для LLDP аудита

```yaml
- name: LLDP Topology Audit
  hosts: vyos_routers
  gather_facts: no

  tasks:
    - name: Collect LLDP neighbors
      vyos.vyos.vyos_command:
        commands:
          - show lldp neighbors detail
      register: lldp_data

    - name: Parse and validate topology
      set_fact:
        lldp_neighbors: "{{ lldp_data.stdout[0] | parse_lldp }}"

    - name: Check for unexpected neighbors
      debug:
        msg: "WARNING: Unexpected neighbor detected!"
      when: "'unknown' in lldp_neighbors"

    - name: Generate topology report
      template:
        src: topology_report.j2
        dest: "./reports/{{ inventory_hostname }}_lldp.html"
```

## Заключение

LLDP (Link Layer Discovery Protocol) - это важный инструмент для автоматического обнаружения и документирования сетевой топологии. VyOS предоставляет полную поддержку LLDP с дополнительной совместимостью с Cisco CDP.

Основные преимущества LLDP:
- Автоматическое обнаружение соседних устройств
- Стандартизированный протокол (IEEE 802.1AB)
- Интеграция с системами мониторинга через SNMP
- Упрощение документирования инфраструктуры
- Диагностика проблем подключения

Рекомендации для production:
- Включайте LLDP на всех сетевых устройствах
- Отключайте LLDP на untrusted портах для безопасности
- Используйте детальные location descriptions
- Интегрируйте с системами мониторинга (LibreNMS, Zabbix, Observium)
- Регулярно аудируйте топологию через LLDP данные
- Документируйте изменения в топологии

LLDP в VyOS обеспечивает надежное обнаружение топологии и интегрируется со всеми современными системами мониторинга, делая управление сетевой инфраструктурой более эффективным.

