OSPF 命令

厂商 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
HP show ip ospf link-state detail (Stub subnets without mask!) show ip ospf link-state detail show ip ospf external-link-state(LSA5 subnets without mask!)
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 命令

OSPFv3(RFC 5340)LSDB 拓扑可视化。将命令输出保存为 .txt 或 .log 扩展名的文件,然后上传至 Topolograph。

厂商 命令 API 支持
Arista show ipv6 ospf database detail YES

将至少两条 OSPF 命令(获取 LSA1 和 LSA2)或单条 IS-IS 命令的输出保存为 .txt 或 .log 文件并上传至 Topolograph。

IS-IS 命令

厂商 命令 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 中的动态主机名。

IS-IS TLV 支持

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

总览(GeneralView)

演示网络已为所有用户预先加载。点击「Load dynamic graph」加载它。加载后即可看到拓扑,粗线表示 ECMP 链路。 Topolograph 演示图

点击粗线以展开 ECMP,查看所有嵌套链路。 Topolograph:点击粗线展开 ECMP

最短路径。如何构建。

可以从某个节点构建最短路径。右键点击节点,拓扑上方会显示包含所有节点和路径开销的描述。 Topolograph:从节点构建最短路径

设定源节点和目标节点后,最短路径将以颜色高亮显示。 Topolograph:OSPF 最短路径

到所有节点的所有最短路径。最小生成树。

v2.11 新功能。MST 可显示到某节点或从某节点出发的所有最短路径。通过此单选框激活。 Topolograph MST:到节点或从节点出发的所有最短路径

v2.11 新功能。所有 入向 最短路径均构建至该节点。 Topolograph:所有入向最短路径

v2.11 新功能。所有 出向 最短路径均从该节点出发构建。 Topolograph:所有出向最短路径

v2.13 新功能。所选节点的 入向出向 最短路径之差。 Topolograph:入向与出向最短路径之差

网络终结设备查找

如何查看某节点终结了哪些网络?有两种方式。第一种:在「Find node by RID/IP. Find network」字段中输入节点 ID,即可看到该节点终结的所有网络。 节点上的终结网络

第二种方法是点击某个节点,弹出表单,显示所有有备份和无备份网络的列表。若某网络在至少两个节点上终结,则视为有备份。 带备份状态的终结网络

备份路径。链路故障模拟。

要查找备份路径,请点击高亮显示的链路。这将模拟链路故障,最短路径将绕过「故障」链路重新构建。 Topolograph:OSPF 备份路径

动态修改 OSPF 开销以重建最短路径

可以更改任意链路的 OSPF 开销。右键点击链路,弹出表单,输入新开销。假设需要将流量从链路 123.10.10.10 - 123.30.30.30 重定向到另一条链路。 Topolograph:OSPF 开销修改准备

右键点击高亮链路并设置为 12,即可看到新 OSPF 开销下的新流量流向。 Topolograph:OSPF 开销修改结果

比较不同时间的网络状态

进行配置变更(添加新网络、将其他协议重分发到 OSPF 或修改 route-map 中的过滤器)时,强烈建议验证变更结果是否符合预期。为此,在变更前后各上传一份网络状态并进行比较。将显示:

Topolograph:OSPF 网络状态对比

故障时的网络反应

在此模式下,可以模拟链路或路由器的故障。拓扑将以预期的流量流向重新渲染,绕过故障元素。

如尚未上传图,请先上传,然后点击 NetworkReactionOnFailure

Topolograph:OSPF 链路故障模拟

如图所示,节点 123.30.30.30 到 123.123.30.30 和 123.123.31.31 的流量下降速率与反向 [从 123.123.30.30 到 123.30.30.30] 相差约 2 倍,原因是流量路径不对称。 Topolograph:带统计的 OSPF 链路故障模拟

同时也可看到蓝色链路上预期的流量增加。 Topolograph:OSPF 链路故障模拟结果

Topolograph 基于 OSPF 邻接关系构建拓扑,物理连接是隐藏的。某些情况下可以假设邻居共享同一媒介。例如,若邻居有共同的 DR,则假设它们通过共享物理媒介连接,模拟这些邻居间某条链路故障时,所有链路都视为故障。

将所有共享媒介链路(有共同 DR)标记为已启用 Topolograph:共享媒介链路故障模拟

若邻居没有 DR,或有但链路上只有两个邻居,模拟链路故障时仅删除这两个特定邻居之间的单条链路。

将所有共享媒介链路(有共同 DR)标记为已禁用 Topolograph:专用媒介链路故障模拟

设备故障时的网络反应。模拟设备故障。

右键点击节点并选择「shutdown this node」,算法将排除该节点。 Topolograph:设备故障时的网络反应

节点 123.123.101.101 故障时的网络反应。 Topolograph:设备故障时的网络反应

NetworkReactionOnFailure 标签页中,可以动态查看 OSPF 开销变化对网络的影响。在右键菜单中设置新的 OSPF 开销。 Topolograph:OSPF 开销变化时的网络反应

网络设计模式

OSPF/IS-IS LSDB 与 YAML 现可双向互换:支持从零开始或基于已上传 LSDB 设计 IGP 域,添加新链路或修改开销,并检验网络反应。

基于 YAML 的基本拓扑。

使用定义好的 节点链路构建图。 基于 YAML 的基本拓扑

节点属性

节点名称 为必填项,须为 IP 地址格式。如需更改显示名称,请使用 label

节点标签为可选项,支持任意键(字符串): 值(str、int、float、字典、列表)对。

节点属性与 REST API 获取节点请求

图中有 6 个节点。选择第一个 DC(ha_role: primary)中的所有主节点(dc1

链路属性

src, dst 为必填项。

cost 为可选项,默认为 1,等同于 OSPF/IS-IS 开销。

directed 为可选项,默认为 false。

链路标签为可选项,支持任意键(字符串): 值(str、int、float、字典、列表)对。

链路属性与 REST API 获取链路请求

选择经 verizon ISP 连接 10.10.10.210.10.10.4

在设备 R3(10.10.10.3)与 R4(10.10.10.4)之间添加一条 开销 为 1 的新链路,观察网络反应。 Topolograph:添加新链路时的网络反应

显然,R3<->R4 直连链路上的流量增加,而到 R2(10.10.10.2)和 R5(10.10.10.5)的流量减少。

分析

在此模式下,可以运行算法以检验 OSPF 网络。

列出所有单向链路(两邻居间 IN 与 OUT 链路数量不相等) Topolograph:OSPF 单向与非对称链路

该链路因 OSPF 开销不同(cost 1 与 cost 10)而被标记为红色 Topolograph:单向与非对称链路报告

非对称路径。

从不同视角列出所有非对称路径。 Topolograph:OSPF 非对称路径菜单

获得存在非对称路径的节点列表。分析后可看到入向与出向路径的差异。 Topolograph:OSPF 非对称路径报告

经同一 ECMP 的主路径与备份路径。

若多条链路绑定为 ECMP,且主链路发生故障,备份路径应经由同一 ECMP 的第二条链路。

检查通过

Topolograph:经 ECMP 的 OSPF 路径

若备份路径不经由 ECMP 而选择完全不同的路由,则报告判定为未通过。

检查未通过

Topolograph:OSPF 路径未经 ECMP 第二条链路

经第三方站点的备份路径。

本报告检查:若两个站点直接相连,备份路径应仅在两站点之间,不应经第三方站点中转。运行前需创建 (~站点名称/位置)并 分配 设备到各组。 例如,法国有两个站点:主站点(EU_FRA)和远程站点(EU_FRA1),意大利同理。法意主站点之间有主链路(OSPF 开销 10)和备份链路(OSPF 开销 20)。

远程站点与各自主站点的主链路开销为 1,与对方国家办公室的备份链路开销为 10。

Topolograph:站点内 OSPF 路由

若主站点间主链路故障,备份路径将经由远程站点!

检查未通过

Topolograph:经第三方站点的 OSPF 备份路径

网络热力图

Analytics 标签页中,可查看有多少终结子网通过在不同设备上终结同一子网的方式实现了备份。 Topolograph:OSPF 网络热力图

点击节点可查看哪些网络有备份、哪些没有。 Topolograph:带网络的热力图

如图所示,只有设备自身的 loopback 没有备份,这是正常的。 Topolograph:带 loopback 的热力图

重复网络 [MPLS]

"分析/重复终结网络。MPLS 受 IP 重复影响的问题源于标签基于 IP 块生成,而 IP 块可能重复。因此同一 IP 块可能关联不同标签,使得相同块以不同标签传播至其他路由器,包括含重复 IP 的路由器。在实施 MPLS-TE 或 RSVP-TE 时尤为棘手,可能降低性能并导致路由错误。因此,块重复在 MPLS 环境中至关重要,主要是因为同一块生成了重复标签。这会在路由器重新计算 TE 或 RSVP-TE 路径时造成混乱。"

Feature request. #issues/6
网络 终结节点数量 节点名称
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 直接相连,但两组之间互不相连。

API

您可以使用喜欢的 NetDevOps 工具(Ansible、netmiko、Nornir、Topolograph SDK 等)通过 POST 请求将 OSPF 网络图上传至 Topolograph。上传后将获得与之前上传图的差异,具体包括:

获取凭据。

需在 Login/注册页面用 email 和密码创建账户,并在 API 标签页将您的源 IP/网络添加至授权来源网络列表。

通过 API 上传 OSPF 拓扑

将 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 状态的可视化差异。 Topolograph: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'}
          
    通过 API 上传多个 OSPF LSDB

    拓扑基于 LSA1 和 LSA2 构建,这两者仅限于各自区域。对于多区域网络,需将多台设备的 LSDB 输出分别保存为以下格式的文件 厂商名称_协议名称.txt

    例如,两个 LSDB: Cisco_ospf.txtJuniper_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

    单台设备上可在多个 VRF 中存在多个 OSPF 路由实例,导致可视化图中节点重复。VRF 标签页允许将多个 OSPF 实例指向单个实例,避免节点重复。

    路由器上有三个 VRF 和三个 OSPF 实例。为避免重复,创建 VRF(或通过 CSV 导入),将节点关联到 VRF,并将重复实例指向主 OSPF RID。

    Topolograph:OSPF VRF 实例

    
            
     
            
    Topolograph 2.61 📣 加入社区!