查找对象引用
查找对象引用
网络需求
在删除一些配置对象前,通常需要先解除该对象的引用关系,如果对象被其他配置被引用,那么通常无法删除它们或将它们分配给某些新的配置,例如:
- 在 GUI 下将接口 internal1 添加到一个新的 Hardware/Software 交换接口时,新的交换接口成员列表中可能不显示该接口。从 CLI 执行此操作时也会因“Object is in use”错误而中断,这是因为该接口已被一些其他配置引用。例如配置了静态 IP 地址、配置了 DHCP 服务器、设置了静态路由等,这些都与该接口相关联。
- 尝试删除一个未使用的地址对象,但无法执行此操作。这是因为该地址对象可能被防火墙策略、地址组等配置引用。
本文主要介绍如何快速找到并解除这些引用关系。
GUI
方法 1
在某个功能配置页面的列表上方,可以看到“关联项”列。



如果“关联项”列不可见,点击左侧的齿轮按钮(或右键单机标题列),然后选中“关联项”。

点击“关联项”下的数字。

弹出“使用率”页面,可以看到该对象当前被哪些配置引用,在该页面可以直接修改/删除引用该对象的配置,如下所示,点击查询一个 IP 池的关联项,有 2 条防火墙策略引用了这个 IP 池。

编辑:选中某个配置并点击编辑按钮,可以在当前页面编辑引用该对象(防火墙策略)的配置。

删除:直接删除引用该对象的配置。
条目:跳转到选中的配置所在页面。

查看属性:查看对象被引用的配置的简要信息。

方法 2
编辑某个配置对象,页面右侧点击“关联项”按钮,也可以弹出“使用率”页面。

CLI
主要方法
FortiOS 的 CLI 采用树状语法定义配置对象的位置,例如防火墙地址对象的路径为Firewall/Address/<name>,进入该配置的 CLI 语法为config firewall address <name>。
通过如下命令可以查找对象的配置关联项。
diagnose sys cmdb refcnt show <path.object.mkey><path.object.mkey>是对象存储位置、对象类别、对象数据库主键的组合。如下所示,该命令显示 config system interface下名称为“wan2”的接口的所有配置引用,接口“wan2”已被 firewall sniffer、ACME 以及 SD-WAN member 配置引用。
FortiGate # diag sys cmdb refcnt show system.interface.name wan2
entry used by child table members:seq-num '2' of complex system.sdwan:members.interface
entry used by table firewall.sniffer:id '1'
entry used by child table interface:interface-name 'wan2' of complex system.acme:interface.interface-name定位对象的 mkey
上述命令要求使用<path.object.mkey>格式指定需要查找关联项的对象。虽然可以很容易找到 path 和 object 的字段(例如,地址对象的path.object为firewall.address),但要确定该对象使用的具体 mkey 字段需要用到如下方法(mkey 并不总是name)。
方法 1 - 使用 tree 命令
如下所示的 SD-WAN 成员配置,该 SD-WAN 区域的成员序号 1 为 wan1。
config system sdwan config members edit 1 <---SD-WAN成员序号 set interface "wan1" set zone "virtual-wan-link" next end end使用 tree 命令查看,SD-WAN 功能的配置路径为
system.sdwan,对象为members,而 mkey 为seq-num(被*标记的为 mkey),而不是接口名称(SD-WAN 成员在配置中是通过其成员 ID 编号而非接口名称进行引用的)。FortiGate # tree system sdwan members -- [members] --*seq-num (0,512) <---“*”标记表示该对象的mkey |- interface (15) |- zone (35) |- gateway ......已经知道了 SD-WAN 成员的 mkey
seq-num在配置(config system sdwan→config members)中为“1”,使用diagnose sys cmdb refcnt show system.sdwan.members.seq-num 1命令就可以查找所有引用 SD-WAN 成员 #1 的配置,如下所示,该 SD-WAN 成员被一个 SD-WAN 健康检查引用(health-check.members.seq-num):FortiGate # diagnose sys cmdb refcnt show system.sdwan.members.seq-num 1 entry used in complex system.sdwan:health-check.members.seq-num child table health-check:name '223.5.5.5' entry members:seq-num '1' (From VDOM: 'root') config system sdwan config health-check edit "223.5.5.5" set server "223.5.5.5" set members 1 <---引用关系 next end end重要
<path.object.mkey>之间的分隔符可以使用.或:。如下所有分隔方式均可正常使用:diagnose sys cmdb refcnt show system.interface.name wan1 diagnose sys cmdb refcnt show system.interface:name wan1 diagnose sys cmdb refcnt show system:interface:name wan1
方法 2 - 使用 get 命令
get命令可以仅列出对象的 mkey,如下所示,防火墙地址对象的 mkey 为name。
get firewall address
== [ all ]
name: all <---mkey为“name”
== [ SSLVPN_TUNNEL_ADDR1 ]
name: SSLVPN_TUNNEL_ADDR1
== [ 10.10.1.4 ]
name: 10.10.1.4
......举例
查找防火墙地址对象“all”的关联配置。如下所示,地址对象“all”正在被多个防火墙策略中的源地址引用。
FortiGate # diagnose sys cmdb refcnt show firewall.address:name all entry used by child table source-address:name 'all' of complex vpn.ssl.settings:source-address.name entry used by child table dst:name 'all' of table service:id '1' of complex system.sdwan:service.dst.name entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '10' entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '25' entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '20' entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '2' entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '23' entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '13' entry used by child table srcaddr:name 'all' of table firewall.policy:policyid '12'查找对象所有可能关联的所有配置(并非实际被引用),将 mkey 留空即可:
FortiGate # diagnose sys cmdb refcnt show firewall.address:name may used by table firewall.addrgrp.member.name may used by table vpn.ssl.web.portal.widget.ip-pools.name may used by table vpn.ssl.web.portal.widget.split-tunneling-routing-address.name may used by table vpn.ssl.settings.tunnel-ip-pools.name may used by table vpn.ipsec.phase2.src-name may used by table vpn.ipsec.phase2.dst-name may used by table vpn.ipsec.phase1-interface.ipv4-split-include may used by table vpn.ipsec.phase2-interface.src-name may used by table vpn.ipsec.phase2-interface.dst-name may used by table firewall.policy.srcaddr.name may used by table firewall.policy.dstaddr.name may used by table firewall.interface-policy.srcaddr.name may used by table firewall.interface-policy.dstaddr.name may used by table firewall.sniff-interface-policy.srcaddr.name may used by table firewall.sniff-interface-policy.dstaddr.name其他举例:
diagnose sys cmdb refcnt show system.interface.name <interface name> diagnose sys cmdb refcnt show firewall.address:name <address name> diagnose sys cmdb refcnt show firewall.profile: <profile name> diagnose sys cmdb refcnt show firewall.service.group:name <servicegroup name>