| Вендор | LSA1 | LSA2 | LSA5 | Opaque-area (TE) |
|---|---|---|---|---|
| Cisco | show ip ospf database router | show ip ospf database network | show ip ospf database external | — |
| Cisco NX-OS | show ip ospf database router detail | show ip ospf database network detail | show ip ospf database external detail | — |
| Fortinet | get router info ospf database router lsa | get router info ospf database network lsa | get router info ospf database external lsa | — |
| FRR/Quagga | show ip ospf database router | show ip ospf database network | show ip ospf database external | show ip ospf database opaque-area |
| Ruckus | show ip ospf database link-state router | show ip ospf database link-state network | show ip ospf database external-link-state | — |
| Juniper | show ospf database router extensive | no-more | show ospf database network extensive | no-more | show ospf database external extensive | no-more | — |
| Bird | show ospf state all | show ospf state all | show ospf state all | — |
| Nokia | show router ospf database type router detail | show router ospf database type network detail | show router ospf database type external detail | — |
| Mikrotik | /routing ospf lsa print detail file=lsa.txt | /routing ospf lsa print detail file=lsa.txt | /routing ospf lsa print detail file=lsa.txt | — |
| Huawei | display ospf lsdb router | display ospf lsdb network | display ospf lsdb ase | — |
| Paloalto | show routing protocol ospf dumplsdb | show routing protocol ospf dumplsdb | show routing protocol ospf dumplsdb | — |
| — | ||||
| Ubiquiti | show ip ospf database router | show ip ospf database network | show ip ospf database external | — |
| Allied Telesis | show ip ospf database router | show ip ospf database network | show ip ospf database external | — |
| Extreme | show ospf lsdb detail lstype router | show ospf lsdb detail lstype network | show ospf lsdb detail lstype as-external | — |
| Ericsson | show ospf database router detail | show ospf database network detail | show ospf database external detail | — |
| Обязательность | YES | YES | NO | Опционально (TE) |
Визуализация топологии OSPFv3 (RFC 5340) LSDB. Сохраните вывод команды в файл с расширением .txt или .log и загрузите в Topolograph.
| Вендор | Команда | Поддержка API |
|---|---|---|
| Arista | show ipv6 ospf database detail | YES |
Сохраните вывод минимум двух команд OSPF (для получения LSA1 и LSA2) или одной команды IS-IS и загрузите в Topolograph с расширением .txt или .log.
| Вендор | Команда | Поддержка API |
|---|---|---|
| Cisco | show isis database detail | YES |
| Juniper | show isis database extensive | YES |
| Nokia | show router isis database detail | YES |
| Huawei | display isis lsdb verbose | YES |
| FRR | show isis database detail* (router-isis#no hostname dynamic) | YES |
*FRR смешивает LSPID и динамические имена хостов в IS-IS LSDB, поэтому поддерживается построение топологии IS-IS только без имён хостов. «no hostname dynamic» отключает динамические имена хостов в локальной IS-IS LSDB.
| Название TLV | Номер TLV | Cisco | Juniper | Nokia | FRR | Huawei | ZTE |
|---|---|---|---|---|---|---|---|
| IS Reachability | 2 | YES | YES | YES | YES | YES | |
| Extended IS Reachability (new) | 22 | YES | YES | YES | YES | YES | YES |
| IPv4 Internal Reachability (old) | 128 | YES | YES | YES | YES | YES | |
| IPv4 External Reachability (old) | 130 | ||||||
| Extended IPv4 Reachability (new) | 135 | YES | YES | YES | YES | YES | YES |
| IPv6 Reachability | 2 | YES | YES | YES | YES | YES | YES |
Демо-граф уже загружен для всех пользователей. Нажмите «Load dynamic graph», чтобы его загрузить. После загрузки вы увидите топологию, жирные линии - ECMP-линки.
Нажмите на жирную линию, чтобы развернуть ECMP и увидеть все вложенные линки.
Кратчайший путь можно построить от любого узла. Кликните правой кнопкой по узлу. Описание со всеми узлами и стоимостью пути отображается над топологией.
После выбора источника и назначения - кратчайший путь будет подсвечен.
Новая функция релиза v2.11. MST показывает все кратчайшие пути К узлу или ОТ узла. Активируйте через переключатель.
Новая функция v2.11. Все входящие кратчайшие пути построены к узлу.
Новая функция v2.11. Все исходящие кратчайшие пути построены от узла.
Новая функция v2.13. Разница между входящие и исходящие кратчайшими путями выбранного узла.
Как узнать, какие сети терминированы на конкретном узле. Есть два способа. Первый - начните вводить ID узла в поле «Find node by RID/IP. Find network» - вы увидите все терминированные на нём сети.
Второй способ - нажать на узел. Появится форма со списком всех зарезервированных и незарезервированных сетей. Сеть считается зарезервированной, если она терминирована минимум на двух узлах.
Чтобы найти резервный путь - нажмите на подсвеченное ребро. Вы эмулируете отказ линка, и кратчайший путь будет перестроен в обход «упавшего» ребра.
Можно изменить стоимость OSPF любого линка. Кликните правой кнопкой по ребру - появится форма. Введите новое значение cost. Представьте, что нужно перенаправить трафик с линка 123.10.10.10 - 123.30.30.30 на другой линк.
Кликните правой кнопкой по подсвеченному ребру и установите 12. Получим новый поток трафика с новой стоимостью OSPF.
При внесении изменений в конфигурацию (добавление новой сети, редистрибуция другого протокола в OSPF или изменение фильтров в route-map) важно убедиться, что результат соответствует ожиданиям. Загрузите состояние сети до и после изменений и сравните. Будет показано:
В этом режиме можно эмулировать отказ линка или маршрутизатора. Топология будет перерисована с ожидаемым изменением потоков трафика в обход упавшего элемента.
Загрузите граф (если ещё не сделали) и нажмите на NetworkReactionOnFailure.
Как видно, скорость снижения трафика от узла 123.30.30.30 к 123.123.30.30 и 123.123.31.31 отличается от обратного направления [от 123.123.30.30 к 123.30.30.30] примерно в 2 раза. Это происходит из-за асимметричного пути трафика.
Также видим ожидаемый рост трафика на синем ребре.
Topolograph строит топологию на основе смежности OSPF, физическая связность скрыта. Но в ряде случаев можно предположить, что соседи используют общую среду. Например, если у соседей есть общий DR - предполагается подключение через общую физическую среду, и при эмуляции отказа одного ребра - все рёбра между такими соседями считаются упавшими.
Пометить все линки с общей средой (общий DR) как включённые
Если у соседей нет DR или их только два на линке, при эмуляции отказа ребра удаляется только один линк между двумя конкретными соседями.
Пометить все линки с общей средой (общий DR) как отключённые
Кликните правой кнопкой по узлу и выберите «shutdown this node». Алгоритм исключит этот узел.
Реакция сети на отказ узла 123.123.101.101.
Во вкладке NetworkReactionOnFailure можно увидеть реакцию сети на изменение стоимости OSPF на лету. Задайте новую стоимость OSPF в контекстном меню ребра (правая кнопка мыши).
OSPF/IS-IS LSDB <-> YAML взаимозаменяемы в обоих направлениях: можно проектировать домен IGP с нуля или на основе загруженной LSDB, добавлять новые линки или изменять стоимости и затем проверять реакцию сети.
Постройте граф с заданными узлами и рёбрами.
Имя узла обязательно. Должно быть в формате IP-адреса. Чтобы изменить отображаемое имя - используйте label
Теги узла опциональны. Любые пары ключ (строка): значение (str, int, float, словарь, список).
Граф содержит 6 узлов. Выберите все основные узлы (ha_role: primary) в первом DC (dc1)
src, dst обязательны.
cost опционален. По умолчанию 1. Соответствует стоимости OSPF/IS-IS.
directed опционален. По умолчанию false.
Теги ребра опциональны. Любые пары ключ (строка): значение (str, int, float, словарь, список).
Выберите все рёбра через verizon ISP между 10.10.10.2 и 10.10.10.4
Добавим новый линк со стоимостью стоимостью 1 между устройствами R3 (10.10.10.3) и R4 (10.10.10.4) и посмотрим на реакцию сети.
Очевидно, трафик на прямом линке R3<->R4 вырастет, а к R2 (10.10.10.2) и R5 (10.10.10.5) - снизится.
В этом режиме можно запускать алгоритмы для проверки OSPF-сети.
Вывод всех однонаправленных линков (число входящих и исходящих линков между двумя соседями не совпадает)
Ребро помечено красным из-за разных метрик OSPF: cost 1 и cost 10
Вывод всех асимметричных путей с разных точек зрения.
Получаем список узлов с асимметричными путями. При проверке видна разница между входящими и исходящими путями.
Если несколько линков объединены в ECMP и основной линк падает - резервный путь должен пройти через второй линк того же ECMP.
Проверка пройдена
Если резервный путь не идёт через ECMP и выбирает другой маршрут - отчёт считается непройденным.
Проверка не пройдена
Отчёт проверяет: если два местоположения напрямую связаны, резервные пути должны проходить только между ними и не использовать третье местоположение как транзит. Перед запуском создайте группы (~названия сайтов/локаций) и назначьте устройства на группы. Например, два офиса во Франции: главный (EU_FRA) и удалённый (EU_FRA1). Аналогичная схема в Италии. Главные офисы соединены основным (OSPF cost 10) и резервным (OSPF cost 20) линком.
Удалённые офисы имеют основной линк (OSPF cost 1) к своим главным офисам и резервный (OSPF cost 10) к иностранному офису.

Проверка не пройдена
Во вкладке Analytics можно увидеть, сколько терминированных подсетей зарезервированы путём терминации той же подсети на разных устройствах.
Нажмите на узел, чтобы узнать, какие сети зарезервированы, а какие нет.
Как видно, только лупбэк самого устройства не зарезервирован - это нормально.
"Аналитика/Дублированные терминированные сети. Проблема влияния IP-дублирований на MPLS обусловлена тем, что метки генерируются на основе IP-блоков, которые могут дублироваться. В результате один и тот же IP-блок может быть сопоставлен с разными метками. Это приводит к тому, что один блок с разными метками распространяется на другие маршрутизаторы, в том числе с дублированным IP. Особенно критично это при внедрении MPLS Traffic Engineering (MPLS-TE) или RSVP-TE: производительность снижается, возникают ошибки маршрутизации. Таким образом, дублирование блоков критично для MPLS-сред, прежде всего из-за генерации дублирующихся меток для одного и того же блока. На маршрутизаторах это вызывает проблемы при пересчёте путей TE или RSVP-TE."
| Сеть | Количество терминирующих узлов | Имена узлов |
|---|---|---|
| 10.0.0.0/24 | 4 | [172.16.1.2, 172.26.1.2], [172.30.2.1, 178.20.3.1] |
Сеть 10.0.0.0/24 терминирована на четырёх узлах: 172.16.1.2 и 172.26.1.2 напрямую связаны, 172.30.2.1 и 178.20.3.1 напрямую связаны, но не между собой.
Вы можете использовать любимый NetDevOps-инструмент (Ansible, netmiko, Nornir, Topolograph SDK и др.) для загрузки OSPF-графа в Topolograph через POST-запрос. После загрузки вы получаете разницу с ранее загруженными графами, а именно:
Создайте аккаунт с email/паролем на странице Login/Registration, а также добавьте ваш исходный IP/сеть в список авторизованных сетей во вкладке API.
Сохраните вывод команд с LSA1, LSA2, LSA5 в один файл - cisco_lsdb_output.txt
import requests
from pprint import pprint as pp
with open('cisco_lsdb_output.txt') as f:
lsdb_output = f.read()
r_post = requests.post('https://topolograph.com/api/graph', auth=('youraccount@domain.com', 'your-pass'),
json={'lsdb_output': lsdb_output, 'vendor_device': 'Cisco'})
pp(r_post.json())
С помощью Python читаем содержимое файла и отправляем (POST-запрос) в Topolograph.
Ответ содержит:
>>> pp(r_post.json())
{'diff': {'compared_with_graph_time': '02Jun2021_21h18m04s_13_hosts',
'graphs_diff': {'all_edges_stats_ll': [{'dst_node': '123.123.110.110',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.100.100'},
{'dst_node': '123.123.111.111',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.101.101'},
{'dst_node': '123.123.100.100',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.110.110'},
{'dst_node': '123.123.101.101',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.111.111'}],
'new_nodes': [],
'old_nodes': []},
'networks_diff': {'new_subnets_attr_dd_ll': [{'rid': '123.30.30.30',
'subnet': '30.30.30.30/32'}],
'old_subnets_attr_dd_ll': [{'rid': '123.10.10.10',
'subnet': '1.2.3.0/30'}]}},
'graph_time': '08Jun2021_20h15m26s_13_hosts',
'hosts': {'count': 12},
'networks': {'backuped': 14,
'count': 38,
'notbackuped': 24,
'url_link': 'https://topolograph.com/api/network/08Jun2021_20h15m26s_13_hosts'},
'reports': {'asym_edges_pass_status': False},
'timestamp': '2021-06-8T20:15:26.265000'}
Визуальная разница между состояниями OSPF.
>>> pp(r_post.json())
{'diff': {'compared_with_graph_time': '02Jun2021_21h18m04s_13_hosts',
'graphs_diff': {'all_edges_stats_ll': [{'dst_node': '123.123.110.110',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.100.100'},
{'dst_node': '123.123.111.111',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.101.101'},
{'dst_node': '123.123.100.100',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.110.110'},
{'dst_node': '123.123.101.101',
'link_cost': 10,
'link_status': 'old',
'src_node': '123.123.111.111'}],
'new_nodes': [],
'old_nodes': []},
'networks_diff': {'new_subnets_attr_dd_ll': [{'rid': '123.30.30.30',
'subnet': '30.30.30.30/32'}],
'old_subnets_attr_dd_ll': [{'rid': '123.10.10.10',
'subnet': '1.2.3.0/30'}]}},
'graph_time': '08Jun2021_20h15m26s_13_hosts',
'hosts': {'count': 12},
'networks': {'backuped': 14,
'count': 38,
'notbackuped': 24,
'url_link': 'https://topolograph.com/api/network/08Jun2021_20h15m26s_13_hosts'},
'reports': {'asym_edges_pass_status': False},
'timestamp': '2021-06-8T20:15:26.265000'}
Топология строится на основе LSA1 и LSA2, которые привязаны к конкретной зоне. Для многозональной сети нужно сохранить вывод LSDB с нескольких устройств в отдельные файлы в формате Имя вендора_имя протокола.txt
Например, два LSDB: Cisco_ospf.txt, Juniper_ospf.txt
LSDB сохраняются в папку lsdb_samples , затем оборачиваются в словарь атрибутов LSDB
{'lsdb_output': '...lsdb output...', 'vendor_device': 'Cisco, Juniper...', 'igp_protocol': 'ospf|isis'}
Полный пример:
import requests
TOPOLOGRAPH_HOST="127.0.0.1"
TOPOLOGRAPH_PORT=5000
TOPOLOGRAPH_WEB_API_USERNAME_EMAIL="your login"
TOPOLOGRAPH_WEB_API_PASSWORD="your password"
from pprint import pprint as pp
lsdbs_attr_ll = []
lsdb_dir = os.path.join(os.getcwd(), 'lsdb_samples')
for vendor_name, protocol_name in [('Cisco', 'ospf'), ('Juniper', 'ospf')]:
f_name = os.path.join(lsdb_dir, f"{vendor_name}_{protocol_name}.txt")
with open(f_name) as f:
lsdbs_attr_ll.append({'lsdb_output': f.read(), 'vendor_device': vendor_name, 'igp_protocol': protocol_name})
r_post = requests.post(f'http://{TOPOLOGRAPH_HOST}:{TOPOLOGRAPH_PORT}/api/graphs', auth=(TOPOLOGRAPH_WEB_API_USERNAME_EMAIL, TOPOLOGRAPH_WEB_API_PASSWORD), json=lsdbs_attr_ll, timeout=(5, 30))
pp(r_post.json())
Ответ содержит:
На одном устройстве может существовать несколько экземпляров OSPF в разных VRF. Это приводит к дублированию узлов на графе. Вкладка VRF позволяет объединить несколько экземпляров OSPF в один и избежать дублирования.
На маршрутизаторе три VRF и три экземпляра OSPF. Чтобы избежать дублирования - создайте VRF (или импортируйте через CSV), свяжите узел с VRF и укажите дублирующиеся экземпляры к основному OSPF RID.