TGViewer
Будни сетевика Будни сетевика @life_of_network_engineer · 1.17K subscribers
Post #221 1.6K
Задача: в алертах от zabbix при падении BGP-сессий с провайдерами видеть их имена, а не только IP-адреса

Пример того, что хотелось:

router_name: PROVIDER_NAME@IP_ADDRESS is DOWN


На тот момент у нас во всех ЦОДах в качестве бордеров были Cisco ASR9001.

Через SNMP нельзя вытащить имена провайдеров, которые вы настроили в конфигурации маршрутизатора - в BGP-MIB просто нет объекта с description пира. Соотвественно алерты будут приходить на падение BGP-сессий с указанием только IP-адресов. Необходимо было добавить как раз понятные имена провайдеров, чтобы сразу по алерту было видно с кем упала сессия и надо ли действовать ASAP или подождет. Это были попытки облегчить себе жизнь в период, когда еще не было выделенных спецов для мониторинга инф-ры 24/7. Сейчас спецы появились, но все уже привыкли к удобным именам.

Был изобретен следующий велосипед.

1️⃣ Создаем файлик router.peers, в котором указываем соотвествие IP-адреса BGP-пира из конфигурации маршрутизатора и имени. Формат JSON:

{
"router1": {
"NAME_ISP1": ["172.17.11.12"],
"NAME_ISP2": ["172.17.11.13"],
"NAME_ISP3": ["172.17.11.14"]
},
"router2": {
"NAME_ISP1": ["172.17.11.22"],
"NAME_ISP2": ["172.17.11.23"],
"NAME_ISP3": ["172.17.11.24"]
}
}



2️⃣ Пишем скрипт bgp_peer_parser.py, который будет парсить этот файлик:

#!/usr/bin/python3
import json, sys

path = '/etc/zabbix/set/router.peers'
method = str(sys.argv[1])
mx = str(sys.argv[2])

if method == 'discovery':
with open(path, 'r') as f:
data = f.read()
try:
data = json.loads(data)
except:
print(‘Problem with JSON’)
sys.exit(1)
try:
discovery = {}
discovery["data"] = []
for each in data[mx]:
for ip in data[mx][each]:
peer = {"{#PEER_NAME}":str(each),"{#PEER_IP}":str(ip)}
discovery['data'].append(peer)
discovery = json.dumps(discovery)
print(discovery)
except:
print(‘0’)
sys.exit(1)


3️⃣ Копируем скрипт на хост и в конфиге zabbix_agent хоста, на котором будет выполняться скрипт указываем:
UserParameter=router[*],/etc/zabbix/externalscripts/bgp_peer_parser.py $1 $2
где router - это имена ваших сетевых железок в zabbix.

Можно выполнять с самого zabbix-сервер.

Приложил в комменты шаблон для zabbix с созданными Disccovery Rules, где отслеживаются состояние BGP-сессий и два триггера на Admin Down и Down.

Получатся вот такие алерты:
Router1
High: NAME_ISP1@172.17.11.12 is DOWN
Operational data: Active (3), 2, Hold Timer Expired (1024)


Недостатки очевидны:
• Нужно следить за актуальностью файлика маппинга IP в Name и менять руками
• Нужно следить, чтобы никто не сломал структуру файла, например не пропустил запятую, потому что узнаете вы об этом уже позже, когда заббикс поругается и новые алерты не будут работать. В нашем случае, т.к. файлик лежал в репозитории, то включили проверку на файл в репе - если сломал, то не сможешь смержить изменения.

Плюсы:
• Универсальное решение для любого вендора. Когда мы переезжали с Cisco ASR на Juniper MX ничего менять не пришлось.

С таким решением мы жили довольно долго, да и живем сейчас если уж быть честным, но переходим на Netbox вместо json-файлика.

Проверил, на текущей версии Junos в MIB ничего похожего на BGP peer description не появилось 🤷

🎤 Будни сетевика 😊 #Задача
  • 👍 18
  • ❤ 3
  • 🔥 1
More from @life_of_network_engineer
  1. Sep 24, 2026Итак, результаты опроса. Большинство (32%, 84 из 265) ответило, что 1 публичный IPv4-адрес…
  2. Sep 1, 2026Post #281
  3. Aug 26, 2026CDN Tsunami: Exploiting HTTP/3-HTTP/1.1 Conversion for DoS Attacks Опубликовано исследован…
  4. Aug 9, 2026🩺 Network Doctor - TUI инструмент для анализа работы сети на разных уровнях. От многих по…
  5. Aug 8, 2026А еще у PTX дефолтные полисеры сильно меньше. Juniper ARP Policer on PTX Протокол | MX | Q…
  6. Aug 8, 2026Model: ptx10001-36mr Тестируем новую (для нас) железку от Juniper, ранее все маршрутизатор…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →