🔍 Network Topology Discovery — 网络拓扑发现
v1.0.0基于CDP/LLDP邻居协议、ARP/MAC表关联与路由表分析的迭代式多厂商网络拓扑发现工具,支持Cisco等设备,通过SSH只读命令收集二层/三层信息,生成全网结构图。
详细分析 ▾
- 确认SSH凭证提供方式,并要求技能声明所需环境变量或密钥引用;
- 使用最小权限只读设备账户(避免管理员凭证);
- 核查范围控制设置(管理子网、VRF、跳数限制)以防止无界发现;
- 避免执行导出完整运行配置或密钥的命令,除非确有必要且已审计;
- 先在隔离实验网络测试;
- 要求发布者修正注册元数据,将'ssh'列为必需二进制并明确记录凭证处理方式,降低意外暴露或越界风险。
运行时依赖
版本
安装命令
点击复制技能文档
# 网络拓扑发现 一种逐层构建网络拓扑图的迭代发现技能。与基于阈值的健康检查不同,本流程从种子设备向外扩展——发现邻居、关联 MAC 与 ARP 表、分析路由边界,并在 L2 与 L3 上整合出完整的邻接模型。命令标注 [Cisco]、[JunOS] 或 , 以区分语法差异;未标注语句适用于三家厂商。完整命令语法见 references/cli-reference.md;发现方法论与数据模型见 references/discovery-workflow.md。 ## 何时使用 - 为陌生环境绘制或验证网络拓扑图 - 并购后网络资产盘点,原文档缺失或过时 - 变更前影响分析——在维护前绘制“爆炸半径” - 故障响应——确定两个端点间的 L2/L3 路径 - 审计现网拓扑与设计文档的差异 - 识别网络中的非法或未记录设备 - 容量规划——绘制站点间链路利用率路径 - 迁移规划——盘点目标域内的设备与链路 ## 前置条件 - 对种子设备的 SSH 或控制台访问(只读权限即可) - 可覆盖发现范围内所有设备的凭据——若不同设备使用不同凭据,请提前梳理 - 网络已启用 CDP 和/或 LLDP(至少一种协议) - 明确发现范围:站点边界、VRF、管理子网或管理域,防止无限制扩散 - 设备清单跟踪器(Excel、CMDB 或文本文件),用于记录已发现设备并避免重复 ## 流程 以下流程需迭代执行,每一步依赖前序数据。从种子设备开始逐层向外发现邻居,并关联 L2 与 L3 信息,最终生成统一拓扑。 ### 步骤 1:种子设备识别 选定起始设备并验证连通性。种子通常为核心交换机、汇聚交换机或路由器,具有最广泛的邻居可见性。确认访问并收集设备标识: [Cisco] `` show version | include hostname|uptime|Software show cdp neighbors | count show lldp neighbors | count ` [JunOS] ` show version | match "Hostname|Model|Junos" show lldp neighbors | count ` , ` show version | include hostname|uptime|model show lldp neighbors | count ` 记录:主机名、平台、软件版本、管理 IP、邻居数量。邻居数量用于预估步骤 2 的规模。将该设备作为第一条记录加入发现跟踪器,状态标记为“已发现”。 注:CDP 为 Cisco 私有协议,仅 Cisco 与 EOS 支持;JunOS 仅支持 LLDP。多厂商环境请以 LLDP 为主。 ### 步骤 2:L2 邻居发现 收集当前设备的所有 CDP 与 LLDP 邻居,揭示直连的交换机、路由器、IP 电话及 AP。 [Cisco] ` show cdp neighbors detail show lldp neighbors detail ` [JunOS] ` show lldp neighbors detail ` , ` show lldp neighbors detail show lldp neighbors | include System ` 对每条邻居记录:远端主机名、远端平台/型号、远端管理 IP、本地接口、远端接口、通告能力(Router、Switch、Phone、AP)。能力字段可在不登录的情况下识别设备角色。 将邻居与发现跟踪器交叉比对:新设备状态设为“待发现”,作为下一轮种子;已发现设备跳过。 ### 步骤 3:MAC 地址表分析 收集 MAC 地址表,识别所有已连接终端,并区分干道端口(MAC 多)与接入端口(MAC 少)。 [Cisco] ` show mac address-table show mac address-table count ` [JunOS] ` show ethernet-switching table show ethernet-switching table summary ` , ` show mac address-table show mac address-table count ` 分析端口-MAC 映射: - 干道端口——学到多个 MAC,通常连接其他交换机,应已出现在 CDP/LLDP 邻居中。 - 接入端口——学到 1 或少数 MAC,通常为终端。 - 无 MAC 端口——未使用或所连设备尚未发流;检查接口 admin/oper 状态。 - MAC 过多端口(接入端口 >100)——可能接 Hub、非管理交换机或干道误配。 标记出现在非预期端口的 MAC——帮助发现未记录设备或布线错误。 ### 步骤 4:ARP 表关联 收集 ARP 表,将 IP 映射到 MAC,从而给 L2 发现的主机赋予 L3 身份。 [Cisco] ` show ip arp show ip arp vrf [name] ` [JunOS] ` show arp no-resolve show arp interface [intf] ` , ` show ip arp show ip arp vrf [name] ` 对每条 ARP 记录:IP、MAC、接口、VLAN、条目存在时间。将步骤 3 的 MAC 交叉比对,为已发现的 L2 终端分配 IP。 未解析 MAC——MAC 表中有但无对应 ARP——表示该 MAC 位于下游交换机(非本地)或设备在不同子网,需通过干道到达。 未解析 ARP——ARP 表 Incomplete——表示可达性问题(设备离线或 ARP 超时)。 ### 步骤 5:路由表分析 收集路由表,发现 L3 下一跳、远端子网及路由域边界。 [Cisco] ` show ip route summary show ip route show ip route vrf [name] ` [JunOS] ` show route summary show route protocol [ospf|bgp|static] show route table [routing-instance].inet.0 ` , ` show ip route summary show ip route show ip route vrf [name] ` 识别: - 直连子网——本地接口网络,定义本设备的 L3 边界。 - 下一跳路由器——相邻 L3 设备 IP,与 ARP/MAC 交叉比对以确定物理接口与 MAC。 - 路由协议邻居——OSPF/BGP/EIGRP 对等体,即使 CDP/LLDP 关闭也能揭示 L3 邻接。 - 默认路由——指向上游网关;沿其发现上一层设备。 - VRF 路由——独立路由表指示 VRF 边界;按 VRF 重复发现以绘制隔离域。 若某下一跳 IP 无对应 ARP,可能表示对端不活跃或不可达——需标记调查。 ### 步骤 6:拓扑整合 将 L2 与 L3 数据合并为统一拓扑模型。尽可能从链路两端进行验证:设备 A 报告的到设备 B 的链路,应在设备 B 的邻居表中指向设备 A。 非对称条目(仅一端可见)表明:对端关闭 CDP/LLDP、单向链路或陈旧邻居条目。 构建邻接模型: 1. 去重链路——同一物理连接出现在两端邻居表,用 local-port/remote-port 匹配。 2. 解决 L2/L3 重叠——干道链路在 CDP/LLDP 可见且承载多个 ARP 子网,表示一条物理链路含多条 L3 路径。 3. 设备分类——利用 CDP/LLDP 能力与路由协议参与情况标记角色:核心路由器、汇聚交换机、接入交换机、防火墙、无线控制器、终端。 4. 识别边界—— discovery 范围内无进一步邻居或邻居超出目标域的设备,定义拓扑周界。 5. 标记异常——未记录设备、非对称链路、意外路由对等、MAC 出现在错误 VLAN 等。 ## 阈值表 用于衡量发现完整性与数据新鲜度,区别于健康检查阈值。 发现完整性: | 指标 | 完整 | 部分 | 不完整 | |--------|----------|---------|------------| | CDP/LLDP 邻居 vs 预期 | 100% | 80–99% | <80% | | MAC 有 ARP 解析 | >90% | 70–90% | <70% | | 下一跳有 ARP 条目 | 100% | 80–99% | <80% | | 链路双向确认 | >95% | 80–95% | <80% | | 已采集路由表的设备 | 100% | >80% | <80% | 数据新鲜度: | 数据源 | 新鲜 | 老化 | 过期 | |-------------|-------|-------|-------| | CDP holdtime 剩余 | >120s | 60–120s | <60s | | LLDP TTL 剩余 | >90s | 30–90s | <30s | | ARP 条目存在时间 | <300s (5min) | 300–1200s | >1200s (20min) | | MAC 条目存在时间 | 最近活跃 | 最后出现 >300s | >900s | | 路由表年龄 | 已收敛 | 正在收敛 | 不完整 | ## 决策树 ### 缺少预期邻居 ` 预期邻居未出现在 CDP/LLDP 表 ├── 接口 admin up 且 oper up? │ ├── 否 → 先修复接口状态 │ └── 是 → 继续 ├── 本地接口启用 CDP/LLDP? │ ├── [Cisco] show cdp interface [intf] │ ├── [JunOS] show lldp detail | match [intf] │ ├── show lldp local-info interface [intf] │ ├── 禁用 → 在接口启用 CDP/LLDP │ └── 启用 → 继续 ├── 远端设备启用 CDP/LLDP? │ ├── 无访问权限 → 尝试 SSH 到远端 │ └── 远端禁用 → 启用或回退用 MAC/ARP ├── VLAN 不匹配? │ ├── 接入端口 VLAN 两端不一致 → 修正 VLAN │ └── 干道允许 VLAN 被裁剪 → 添加 VLAN 到干道 └── 物理层问题? ├── 检查接口错误 → 参见 interface-health 技能 └── 单向链路 → 检查光纤 Tx/Rx、SFP 插拔 ` ### 未解析 MAC 地址 ` MAC 表中有但无 ARP 条目 ├── MAC 在干道端口? │ ├── 是 → MAC 位于下游交换机,非本地 │ │ └── 发现下游交换机以定位终端 │ └── 否 → MAC 在接入端口 ├── 该 MAC 所在 VLAN 在此设备是否路由? │ ├── 否 → ARP 位于该 VLAN 的另一 L3 网关 │ │ └── 检查 SVI/IRB 所有者是否有 ARP │ └── 是 → 继续 ├── 检查端口生成树状态 │ ├── Blocking/Discarding → 端口被 STP 阻塞;MAC 为之前所学 │ └── Forwarding → 继续 └── 设备可能未配置 IP └── L2 -only 设备(非管理交换机、DHCP 超时中的打印机) ` ### 路由视图不对称 ` 设备 A 可见路由,设备 B 不可见(或下一跳不同) ├── 两台设备在同一 VRF? │ ├── 否 → 不同路由域;需路由泄漏 │ └── 是 → 继续 ├── 检查 A 与 B 间路由协议邻接 │ ├── 无邻接 → 协议未配置或被过滤 │ └── 邻接 up → 继续 ├── 检查路由过滤器 / distribute-list │ ├── [Cisco] show ip protocols | section Routing │ ├── [JunOS] show policy [name] │ ├── show ip protocols | section Routing │ └── 过滤阻断前缀 → 调整策略 ├── 路由重分发边界? │ └── 某协议未将前缀重分发到另一协议 └── 汇总隐藏明细路由? └── 检查区域汇总或聚合路由 ` ## 报告模板 ` 网络拓扑发现报告 =================================== 种子设备: [hostname] 发现范围: [站点 / VRF / 子网范围 / 域] 发现时间: [start] 至 [end] 执行人: [operator/agent] 发现摘要: - 发现设备总数: [n] - 路由器: [n] | 交换机: [n] | 防火墙: [n] | 其它: [n] - 映射链路总数: [n] (双向确认: [n], 单向: [n]) - 识别子网: [n] - 遇到 VRF: [列表] 设备清单: | 主机名 | 平台 | 管理 IP | 角色 | 发现方式 | |----------|----------|---------|------|------------------| | [name] | [model] | [ip] | [role] | [CDP/LLDP/ARP/routing] | 链路映射: | 设备 A | 端口 A | 设备 B | 端口 B | 类型 | 速率 | |----------|--------|----------|--------|------|-------| | [name] | [intf] | [name] | [intf] | [trunk/access/routed] | [1G/10G/...] | 异常: 1. [严重度] [类别] — [描述] 观察到: [实际发现] 预期: [设计文档所示] 影响: [拓扑准确性 / 安全 / 运维] 行动: [建议调查或修复措施] 完整性评估: - CDP/LLDP 覆盖率: [%] 预期邻居 - ARP 解析率: [%] MAC 条目已解析 - 双向链路确认率: [%] 建议: - [按优先级排列的行动清单] 下次发现: [基于网络变化速率推荐的刷新间隔] ` ## 故障排查 ### JunOS 设备缺少 CDP 邻居 CDP 为 Cisco 私有,JunOS 不支持。必须使用 LLDP 进行 Juniper 邻居发现。确保全局与相关接口已启用 LLDP:set protocols lldp interface all。在 Cisco/EOS 侧同时启用 LLDP 与 CDP,以便与 JunOS 交换邻居信息。 ### LLDP 显示陈旧邻居 LLDP 条目在邻居消失后仍持续 TTL 时长(默认 120s)。若出现陈旧条目,检查:远端设备最近断电或重启、线缆被拔出、或远端接口关闭 LLDP。等待 TTL 到期或手动清除 LLDP 表以刷新。 ### MAC 表在接入端口显示数千条目 接入端口学到数百 MAC 表明:端口后接 Hub 或非管理交换机、虚拟化主机多 VM 桥接到同一接口、或干道误配为接入。检查端口配置——若应为接入端口,调查所接设备。可考虑启用端口安全限制 MAC 学习数量。 ### ARP 条目 MAC 为 Incomplete show ip arp 显示 MAC 为 “Incomplete” 表示设备已发 ARP 请求但未收到回复。目标 IP 位于本地子网但主机无响应。原因:主机关机、主机防火墙阻断 ARP、IP 冲突、或主机 VLAN 错误。验证主机已开机并接入正确 VLAN。 ### 路由表出现意外默认路由 默认路由指向未知下一跳可能表明:非法 DHCP 服务器提供网关地址、未计划的静态路由、或重分发引入外部默认路由。追踪路由来源——检查 show ip route 0.0.0.0` 的协议与来源。若为 OSPF 或 BGP,定位哪个对等体在通告默认路由。