| 厂商 | 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 命令的输出保存为 .txt 或 .log 文件并上传至 Topolograph。
| 厂商 | 命令 | 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 在 IS-IS LSDB 中混合了 LSPID 和动态主机名,因此仅支持不使用主机名的 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 新功能。所选节点的 入向 与 出向 最短路径之差。
如何查看某节点终结了哪些网络?有两种方式。第一种:在「Find node by RID/IP. Find network」字段中输入节点 ID,即可看到该节点终结的所有网络。
第二种方法是点击某个节点,弹出表单,显示所有有备份和无备份网络的列表。若某网络在至少两个节点上终结,则视为有备份。
要查找备份路径,请点击高亮显示的链路。这将模拟链路故障,最短路径将绕过「故障」链路重新构建。
可以更改任意链路的 OSPF 开销。右键点击链路,弹出表单,输入新开销。假设需要将流量从链路 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 现可双向互换:支持从零开始或基于已上传 LSDB 设计 IGP 域,添加新链路或修改开销,并检验网络反应。
使用定义好的 节点 和 链路构建图。
节点名称 为必填项,须为 IP 地址格式。如需更改显示名称,请使用 label
节点标签为可选项,支持任意键(字符串): 值(str、int、float、字典、列表)对。
图中有 6 个节点。选择第一个 DC(ha_role: primary)中的所有主节点(dc1)
src, dst 为必填项。
cost 为可选项,默认为 1,等同于 OSPF/IS-IS 开销。
directed 为可选项,默认为 false。
链路标签为可选项,支持任意键(字符串): 值(str、int、float、字典、列表)对。
选择经 verizon ISP 连接 10.10.10.2 与 10.10.10.4
在设备 R3(10.10.10.3)与 R4(10.10.10.4)之间添加一条 开销 为 1 的新链路,观察网络反应。
显然,R3<->R4 直连链路上的流量增加,而到 R2(10.10.10.2)和 R5(10.10.10.5)的流量减少。
在此模式下,可以运行算法以检验 OSPF 网络。
列出所有单向链路(两邻居间 IN 与 OUT 链路数量不相等)
该链路因 OSPF 开销不同(cost 1 与 cost 10)而被标记为红色
从不同视角列出所有非对称路径。
获得存在非对称路径的节点列表。分析后可看到入向与出向路径的差异。
若多条链路绑定为 ECMP,且主链路发生故障,备份路径应经由同一 ECMP 的第二条链路。
检查通过
若备份路径不经由 ECMP 而选择完全不同的路由,则报告判定为未通过。
检查未通过
本报告检查:若两个站点直接相连,备份路径应仅在两站点之间,不应经第三方站点中转。运行前需创建 组 (~站点名称/位置)并 分配 设备到各组。 例如,法国有两个站点:主站点(EU_FRA)和远程站点(EU_FRA1),意大利同理。法意主站点之间有主链路(OSPF 开销 10)和备份链路(OSPF 开销 20)。
远程站点与各自主站点的主链路开销为 1,与对方国家办公室的备份链路开销为 10。

检查未通过
在 Analytics 标签页中,可查看有多少终结子网通过在不同设备上终结同一子网的方式实现了备份。
点击节点可查看哪些网络有备份、哪些没有。
如图所示,只有设备自身的 loopback 没有备份,这是正常的。
"分析/重复终结网络。MPLS 受 IP 重复影响的问题源于标签基于 IP 块生成,而 IP 块可能重复。因此同一 IP 块可能关联不同标签,使得相同块以不同标签传播至其他路由器,包括含重复 IP 的路由器。在实施 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 等)通过 POST 请求将 OSPF 网络图上传至 Topolograph。上传后将获得与之前上传图的差异,具体包括:
需在 Login/注册页面用 email 和密码创建账户,并在 API 标签页将您的源 IP/网络添加至授权来源网络列表。
将 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())
响应包含:
单台设备上可在多个 VRF 中存在多个 OSPF 路由实例,导致可视化图中节点重复。VRF 标签页允许将多个 OSPF 实例指向单个实例,避免节点重复。
路由器上有三个 VRF 和三个 OSPF 实例。为避免重复,创建 VRF(或通过 CSV 导入),将节点关联到 VRF,并将重复实例指向主 OSPF RID。