LibreNMS для распределённой сети: SNMP, карта, алерты и Oxidized
Меня зовут Семёнов Евгений Сергеевич, и у меня в практике за 15 лет было около сорока внедрений NMS разного масштаба — от маленьких офисов с двумя коммутаторами до логистических сетей с сотнями Cisco, Aruba и MikroTik в филиалах. Если мониторят серверы и приложения — я выбираю Zabbix. Если именно сеть, то почти всегда — LibreNMS: он бесплатный, понимает любое оборудование через SNMP MIB и ставится за рабочий день. Ниже — наш внутренний boilerplate-регламент внедрения и реальный кейс с цифрами.
Что такое LibreNMS и почему он так прижился
LibreNMS — форк старого-доброго Observium, но с открытой разработкой и нормальным community. Работает на стеке PHP + MySQL + RRDtool + Python-поллерах. Сильная сторона — встроенная база описаний оборудования: 1500+ моделей из коробки, от Cisco Catalyst до HP ProCurve и промышленных Moxa. Слабая — тяжёлый веб-интерфейс, если устройств становится много.
У нас на продакшене LibreNMS крутится на отдельной виртуалке Debian 12 с 6 vCPU и 12 ГБ RAM, в дата-центре МТС, мониторит 230+ сетевых устройств у клиентов. Сервер — Dell Xeon Platinum 8280, дисковая подсистема NVMe, к ней подцеплен 40-гигабитный Mellanox для взаимодействия с остальными виртуалками.
Установка: официальный скрипт vs ручная сборка
Есть три пути: Docker-образ, Debian-пакет и ручная установка из git. Я всегда беру ручную — контроль над версиями PHP, nginx и MariaDB окупается с лихвой, когда приходит время большого апгрейда.
sudo apt update && sudo apt install -y acl curl fping git graphviz imagemagick \
mariadb-client mariadb-server mtr-tiny nginx-full nmap php8.2-cli php8.2-curl \
php8.2-fpm php8.2-gd php8.2-gmp php8.2-mbstring php8.2-mysql php8.2-snmp \
php8.2-xml php8.2-zip python3-dotenv python3-pymysql python3-redis \
python3-setuptools python3-systemd python3-pip rrdtool snmp snmpd whois \
unzip python3-pip
sudo useradd librenms -d /opt/librenms -M -r -s "$(which bash)"
cd /opt
sudo git clone https://github.com/librenms/librenms.git
sudo chown -R librenms:librenms /opt/librenms
sudo chmod 771 /opt/librenms
sudo setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache
sudo setfacl -R -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache
MariaDB, nginx, PHP-FPM, cron, dispatcher-сервис — всё по официальной документации. Я не переписываю туториал, в нём 200 строк, они действительно рабочие. Если при ./validate.php всё горит зелёным — двигаемся дальше.
SNMP v3: нормальная аутентификация вместо пароля на заборе
Первое, что я делаю после установки — раскатываю SNMP v3 на всех коммутаторах. У нас в стандартной заготовке два контекста: ro (только чтение, полл LibreNMS) и rw (управление, Oxidized тоже ходит по v3). На Cisco IOS это выглядит так:
snmp-server group LIBRENMS-RO v3 priv
snmp-server user nms LIBRENMS-RO v3 auth sha1 AuthPass2025! priv aes 128 PrivPass2025!
snmp-server contact "it@company.ru"
snmp-server location "MSK-Office-5floor"
Для MikroTik:
/snmp community add name=nms authentication-protocol=SHA1 authentication-password=AuthPass2025! \
encryption-protocol=AES encryption-password=PrivPass2025! security=private
/snmp set enabled=yes trap-version=3 contact="it@company.ru" location="Warehouse-Khimki"
Добавляем устройство в LibreNMS одним CLI-вызовом:
sudo -u librenms /opt/librenms/addhost.php 10.10.5.1 v3 nms AuthPass2025! SHA1 PrivPass2025! AES priv
Auto-discovery и карта топологии
Включите на коммутаторах CDP (Cisco) или LLDP (все остальные) — после этого LibreNMS сам построит карту связей. Настройка на стороне LibreNMS — в config.php:
$config['autodiscovery']['xdp'] = true; // LLDP/CDP/FDP/OSPF
$config['autodiscovery']['ospf'] = true;
$config['autodiscovery']['bgp'] = false;
$config['autodiscovery']['snmpscan'] = false; // на проде вредно, грузит сеть
$config['nets'] = ['10.10.0.0/16', '10.20.0.0/16'];
Крон /opt/librenms/discovery-wrapper.py запускается каждые 6 часов и сам добавляет новые устройства. Через сутки после настройки в разделе Maps появится наглядная schema с линиями между коммутаторами — это не декорация, по ней удобно находить петли и несимметричные каналы.
Алерты в Telegram: минимум шума, максимум пользы
Стандартный саундтрек пожилого админа — 300 писем за выходные. Чтобы не скатиться туда, я настраиваю Telegram-транспорт и жёсткий список правил. Добавляем в config.php:
$config['alert']['transports']['telegram'][0]['token'] = '1234567890:AA...';
$config['alert']['transports']['telegram'][0]['chat_id'] = '-1001234567890';
$config['alert']['transports']['telegram'][0]['parse_mode'] = 'markdown';
Дальше в UI → Alerts → Rules создаю минимальный набор:
| Правило | Условие | Severity | Delay |
|---|---|---|---|
| Device down | devices.status = 0 | Critical | 5 мин |
| Port down (uplink) | ports.ifOperStatus = down AND ifAlias ~ "UPLINK" | Critical | 1 мин |
| CPU > 85% | processors.processor_usage > 85 | Warning | 10 мин |
| Temp > 65°C | sensors.sensor_current > 65 AND class=temperature | Warning | 15 мин |
| UPS battery | sensors.sensor_class = charge AND sensor_current < 90 | Warning | 30 мин |
Delay в 5 минут убивает около 80% ложных алертов от кратковременных пропаданий пинга. Оставшиеся 20% уже реально требуют действий.
Oxidized: git-история всех сетевых конфигов
Сетевое оборудование часто меняют не спеша и без документирования. Oxidized решает это радикально — каждую ночь стягивает running-config со всех устройств и коммитит в git. LibreNMS видит его через плагин и отрисовывает diff прямо в веб-интерфейсе.
sudo apt install -y ruby ruby-dev libssl-dev pkg-config g++ cmake
sudo gem install oxidized oxidized-script oxidized-web
sudo useradd -s /bin/bash -m oxidized
sudo -u oxidized oxidized # создаст /home/oxidized/.config/oxidized/
В config указываем источник — сам LibreNMS через его API (удобно: добавили устройство в NMS — оно автоматически попало в бэкап):
source:
default: http
http:
url: https://nms.company.ru/api/v0/oxidized
headers:
X-Auth-Token: 'ВАШ_API_ТОКЕН_ИЗ_LIBRENMS'
output:
default: git
git:
user: oxidized
email: oxidized@company.ru
repo: /var/lib/oxidized/devices.git
interval: 3600
После первого прогона в репозитории лежат все running-configs. Диффы за месяц рассказывают о сети больше, чем любая Confluence-страница.
Реальный кейс: логистика, 8 складов, 140 устройств
В апреле 2025 года к нам пришёл логистический оператор — один головной офис в Москве, 8 складов в Подмосковье и Калужской области, суммарно 140 сетевых устройств: 72 Cisco Catalyst, 38 MikroTik, 14 Aruba-точек, 8 АТС, плюс Wi-Fi-контроллеры. До нас мониторили «никак, в основном пингом из гугл-таблицы».
Мы развернули LibreNMS на новой виртуалке в их кластере Proxmox, SNMP v3 на всём парке раскатили через Ansible за два вечера, IPsec-туннели до складов уже были. Через неделю появилось то, что клиент никогда не видел: карта связности с перекрёстными путями, графики загрузки uplinks на всех складах, сигналы о перегретых коммутаторах в котельных.
За первые полтора месяца LibreNMS выявил три проблемы, о которых не подозревали: деградирующий SFP-модуль на складе в Подольске (ежечасные переподключения, гуляли вместе с грузовиками), петлю на складе Ногинск (разъединили, и время доставки заказа по WMS упало с 48 секунд до 9), перегрев стойки в Дмитрове (кондиционер чинили четыре месяца, никто не замечал). Бюджет — 215 000 рублей за внедрение под ключ плюс техподдержка 18 000 в месяц.
Distributed polling и масштабирование
Когда устройств становится больше 400–500, одной виртуалке становится тесно: цикл опроса не укладывается в 5 минут. Решение — distributed poller: отдельная машина пополняет ту же БД. Конфигурация в config.php:
$config['distributed_poller'] = true;
$config['distributed_poller_name'] = 'poller-spb';
$config['distributed_poller_group'] = 1;
$config['distributed_poller_memcached_host'] = 'nms.company.ru';
$config['distributed_poller_memcached_port'] = 11211;
У меня в практике потолок одного поллера — примерно 700 устройств с интервалом 5 минут. Выше — ставьте второй и третий.
Что я обязательно делаю после запуска
- Ставлю validate.php в cron раз в сутки — при деградации система сама напишет в алерт-канал.
- Бэкаплю БД и конфиг —
mysqldump librenms+ tar на/opt/librenms/config.phpв Borg-репозиторий на отдельном сервере. - Включаю LDAP-авторизацию против AD клиента — админы заходят своими учётками, а не общим librenms/Password1.
- Настраиваю раз в месяц PDF-отчёт «топ-10 устройств по загрузке» — для начальника IT-отдела клиента, чтобы он видел ценность.
Развернём LibreNMS и сделаем сеть прозрачной
Устанавливаем и настраиваем NMS для офисов до 50 РМ и для распределённых сетей с филиалами. SNMP v3, автодискавери, Telegram-алерты, Oxidized, отчёты руководителю — всё под ключ. Первый мониторинг раскатаем за рабочий день.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — LibreNMS в корпоративной сети
- Когда LibreNMS выигрывает у Zabbix?
- Когда главная задача — именно сеть. LibreNMS из коробки понимает более 1500 моделей коммутаторов, роутеров и UPS, рисует карту топологии по CDP/LLDP, умеет weathermap. Zabbix универсальнее для серверов и приложений.
- Почему мы используем только SNMP v3?
- SNMP v2c передаёт community-string по сети в открытом виде. v3 добавляет SHA-аутентификацию и AES-шифрование. Для распределённых сетей с туннелями через публичный интернет это минимальная гигиена.
- Сколько железа нужно под LibreNMS для офиса 50–150 устройств?
- 4 vCPU, 8 ГБ RAM, 120 ГБ SSD хватает с запасом. RRD-базы занимают около 200 МБ на устройство, но за счёт round-robin не растут со временем.
- Зачем нужен Oxidized, если на коммутаторах есть ручной бэкап?
- Oxidized тянет конфиг раз в сутки и коммитит в git. Вы видите diff — что именно и когда изменилось. При ЧП открываете вчерашний коммит и возвращаете рабочую конфигурацию за минуту.
- Как мониторить филиалы за NAT?
- Самый надёжный путь — поднять IPsec/WireGuard туннели и опрашивать SNMP по внутренним адресам. Для крупной сети — distributed polling: ставим дополнительный poller в филиале.