HA 虚拟 MAC
HA 虚拟 MAC
功能简介
在 FortiGate HA(FGCP)集群中,主设备(primary)的接口会使用虚拟 MAC(VMAC)。这样在故障切换(failover)后,新的主设备可以继承与旧的主设备相同的 VMAC 与 IP,使上下联交换机等网络设备仍把它识别为“同一台设备”,从而更快恢复转发与通信。
接口的两类 MAC
- Current_HWaddr:接口当前在网络中可见的 MAC 地址,在 standalone(单机)模式下可通过 CLI 修改。
- Permanent_HWaddr:网卡出厂写入的物理 MAC,不可更改。
- 默认配置(standalone 模式)下二者相同,开启 HA FGCP 后,主设备接口对外可见的 MAC(Current_HWaddr)会改为 HA VMAC(与 VDOM/接口/HA group ID 等因素相关)。
VMAC 工作模式
NAT 模式:
- 主设备每个接口通常获得不同的 VMAC。
- VLAN 子接口继承其所在物理口的 VMAC(EMAC VLAN 是个例外)。
- 冗余/聚合(802.3ad)接口继承列表中第一个成员接口的 VMAC。
Transparent 模式:
- FGCP 将 VMAC 分配给主设备的管理 IP。
- 由于管理 IP 可从任意接口访问,表现为“所有接口看起来像同一个 VMAC”。
HA 独立管理口:会保留原始 MAC,不会变成 VMAC。
备设备(Secondary):接口 MAC 不会变为 VMAC,仍然使用原始 MAC。
查看接口 MAC/VMAC
Standalone 模式:同时显示 Current_HWaddr 与 Permanent_HWaddr,未手动修改接口 MAC 的情况下,二者通常相同(物理 MAC)。
FortiGate # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr e0:23:ff:67:e3:9c Permanent_HWaddr e0:23:ff:67:e3:9c FortiGate # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr e0:23:ff:67:e3:9c inet addr:10.10.12.2 Bcast:10.10.12.255 Mask:255.255.255.0 inet addr6: 2100::2 prefixlen 64 link-local6: fe80::e223:ffff:fe67:e39c prefixlen 64 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:179819739 errors:0 dropped:0 overruns:0 frame:0 TX packets:124048087 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:203328470553 (189.4 GB) TX bytes:60298053563 (56.2 GB)HA 模式:
主设备:Current_HWaddr 变为 HA VMAC,而 Permanent_HWaddr 仍是物理 MAC,
ifconfig命令看到的HWaddr为 HA VMAC。FortiGate # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr 00:09:0f:09:07:00 Permanent_HWaddr 94:f3:92:53:ae:7a FortiGate # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr 00:09:0F:09:00:00 inet addr:172.22.6.65 Bcast:172.22.7.255 Mask:255.255.254.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:336270575 errors:0 dropped:0 overruns:0 frame:0 TX packets:213599289 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:316749603468 (294.10 GB) TX bytes:110547160311 (102.10 GB)备设备:Current_HWaddr 与 Permanent_HWaddr 相同,为真实物理 MAC,
ifconfig命令看到的HWaddr为真实物理 MAC。FortiGate # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr ac:71:2e:fd:21:be Permanent_HWaddr ac:71:2e:fd:21:be FortiGate # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr AC:71:2E:FD:21:BE inet addr:172.22.6.65 Bcast:172.22.7.255 Mask:255.255.254.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:37615511 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6160997309 (5.7 GB) TX bytes:0 (0 Bytes)
接口 MAC/VMAC 映射表
FortiGate # diagnose sys ha mac
HA mac msg
serial#=FGT61FTK2206xxxx Primary
prio=0, phy_index= 0, itf_name= wan1, mac=94.f3.92.53.ae.7a, vmac=00.09.0f.09.07.00, linkfail=0
prio=0, phy_index= 1, itf_name= wan2, mac=94.f3.92.53.ae.7b, vmac=00.09.0f.09.07.01, linkfail=0
prio=0, phy_index= 2, itf_name= dmz, mac=94.f3.92.53.ae.7c, vmac=00.09.0f.09.07.02, linkfail=0
prio=0, phy_index= 3, itf_name=internal1, mac=94.f3.92.53.ae.7d, vmac=--.--.--.--.--.--, linkfail=0
prio=0, phy_index= 4, itf_name=internal2, mac=94.f3.92.53.ae.7e, vmac=--.--.--.--.--.--, linkfail=1
prio=0, phy_index= 5, itf_name=internal3, mac=94.f3.92.53.ae.7f, vmac=00.09.0f.09.07.05, linkfail=1
prio=0, phy_index= 6, itf_name=internal4, mac=94.f3.92.53.ae.80, vmac=00.09.0f.09.07.06, linkfail=1
prio=0, phy_index= 7, itf_name=internal5, mac=94.f3.92.53.ae.81, vmac=00.09.0f.09.07.07, linkfail=0
prio=0, phy_index= 8, itf_name= a, mac=94.f3.92.53.ae.82, vmac=00.09.0f.09.07.08, linkfail=1
prio=0, phy_index= 9, itf_name= b, mac=94.f3.92.53.ae.83, vmac=00.09.0f.09.07.08, linkfail=1
prio=0, phy_index=10, itf_name=internal, mac=94.f3.92.53.ae.7e, vmac=00.09.0f.09.07.04, linkfail=1
prio=0, phy_index=11, itf_name=fortilink, mac=94.f3.92.53.ae.82, vmac=00.09.0f.09.07.08, linkfail=1
prio=0, phy_index=12, itf_name=emacvlan1, mac=9a.f3.92.53.ae.7a, vmac=00.09.0f.09.07.0c, linkfail=0
serial#=FGT61FTK22053887 Secondary
prio=1, phy_index= 0, itf_name= wan1, mac=ac.71.2e.fd.21.be, vmac=--.--.--.--.--.--, linkfail=0
prio=1, phy_index= 1, itf_name= wan2, mac=ac.71.2e.fd.21.bf, vmac=--.--.--.--.--.--, linkfail=0
prio=1, phy_index= 2, itf_name= dmz, mac=ac.71.2e.fd.21.c0, vmac=--.--.--.--.--.--, linkfail=0
prio=1, phy_index= 3, itf_name=internal1, mac=ac.71.2e.fd.21.c1, vmac=--.--.--.--.--.--, linkfail=0
prio=1, phy_index= 4, itf_name=internal2, mac=ac.71.2e.fd.21.c2, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index= 5, itf_name=internal3, mac=ac.71.2e.fd.21.c3, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index= 6, itf_name=internal4, mac=ac.71.2e.fd.21.c4, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index= 7, itf_name=internal5, mac=ac.71.2e.fd.21.c5, vmac=--.--.--.--.--.--, linkfail=0
prio=1, phy_index= 8, itf_name= a, mac=ac.71.2e.fd.21.c6, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index= 9, itf_name= b, mac=ac.71.2e.fd.21.c7, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index=10, itf_name=internal, mac=ac.71.2e.fd.21.c2, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index=11, itf_name=fortilink, mac=ac.71.2e.fd.21.c6, vmac=--.--.--.--.--.--, linkfail=1
prio=1, phy_index=12, itf_name=emacvlan1, mac=b2.71.2e.fd.21.be, vmac=--.--.--.--.--.--, linkfail=0- 输出包含每个接口的 phy_index、itf_name、mac(物理)、vmac(虚拟)、linkfail 等字段。
- 这个输出对排查“某个接口当前应该用哪个 VMAC”很直观。
VMAC 分配方式
有 3 种 VMAC 分配方式:默认方式、自动分配、手动分配。
默认方式
相关信息
- 以下 VMAC 算法仅适用于比较常见的情况:
vcluster_integer= 0 或 1,group-id< 256,phy_index< 128的情况。 - 其他情况下的 VMAC 算法会有所区别,具体请参考官方 Docs 文档。
默认配置下,HA VMAC 地址根据以下公式确定:
HA 配置示例:
config system ha set group-id 0 set group-name "summerice" set mode a-p set password ENC 8d7WHMRiOFwjt7pOVnRmVrs9+rVayb7F2h1BKknc/3NsIjK1iEetIIVMzaGcdy3ONs7YzupDTFE09VWflnewYi91ZZ9V63QFh+EsKYhxjphPRf8cBmkQAq9Dcu6ymAo/Sm60+yVAUl5T+sUFbBivGJIG55rGnVV6BuN8VB3UYupQAUFOA9hZovr0TE6GcKkM/+lBf1lmMjY3dkVA set hbdev "port4" 0 set override disable endgroup-prefix:此情况下固定为 00:09:0f:09,占据 VMAC 的前 4 段(32 bit)。group-id_hex:vluster 的 group-id 转换为十六进制的形式。,占据 VMAC 的第 5 段。下表列出了为每个 group-id 设置的 VMAC 地址。相关信息
- 可用
get system ha | grep group-id查看 group-id。
Integer Group ID Hexadecimal Group ID 0 00 1 01 2 02 3 03 ... ... 7 07 ... ... 63 3f ... ... 255 ff - 可用
vcluster_integer,占据 VMAC 的第 6 段二进制的第 1bit,其值 =cluster_id- 1:在未启用 VDOM + vcluster 时,默认所有接口均位于 root VDOM 中,
vcluster_id为 1,vcluster_integer= 0。在启用 VDOM + vcluster 时,
vcluster_id的十进制值取自如下 CLI 命令,如下所示,vcluster_id= 2,对应的:vcluster_integer= 1。config global config system ha set vcluster-status enable config vcluster edit 2 set override disable set priority 200 set vdom "vdom1" next end end end FortiGate (global) # get sys ha | grep vcluster vcluster-status : enable vcluster: vcluster-id: 1 vcluster-id: 2
phy_index:接口索引号。占据 VMAC 的第 6 段二进制的第 2~8 bit。接口编号从 0 到 x(其中 x 为接口总数)。可以使用diagnose sys ha mac/diagnose sys ha dump-by debug-zone命令查看接口的phy_index。举例:HA
group-id为 7,未开启 VDOM,wan1 接口的phy_index= 0。VMAC 前 4 段:固定值 00:09:0F:09。
VMAC 第 5 段:为
group-id(7)对应的group-id_hex(07)。示例设备未开启 VDOM,
vcluster_id为 0,VMAC 的第 6 段的二进制第 1bit 为 0。wan1 接口的
phy_index为 0,VMAC 的第 6 段的二进制第 2~8 bit 为 0。wan1 接口的 VMAC = 00:09:0F:09:07:00。
FortiGate # get sys ha | grep group-id group-id : 7 FortiGate # diagnose sys ha mac | grep wan1 prio=0, phy_index= 0, itf_name= wan1, mac=94.f3.92.53.ae.7a, vmac=00.09.0f.09.07.00, linkfail=0 prio=1, phy_index= 0, itf_name= wan1, mac=ac.71.2e.fd.21.be, vmac=--.--.--.--.--.--, linkfail=0 FortiGate # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr 00:09:0f:09:07:00 Permanent_HWaddr 94:f3:92:53:ae:7a FortiGate # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr 00:09:0F:09:07:00 inet addr:172.22.6.80 Bcast:172.22.7.255 Mask:255.255.254.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:336288265 errors:0 dropped:0 overruns:0 frame:0 TX packets:213612129 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:316754405177 (295.0 GB) TX bytes:110549910225 (102.10 GB)在多 VDOM 环境下,开启 HA 的
vcluster-status,将 wan1 切换至 vdom1(vcluster_id= 2,对应的:vcluster_integer= 1),则 VMAC 的第 6 段二进制第 1bit 变为 1(1000 0000),最终 VMAC = 00:09:0F:09:07:80。FortiGate (global) # show sys interface wan1 | grep vdom set vdom "vdom1" FortiGate (global) # show system ha config system ha ...... set vcluster-status enable config vcluster edit 1 set override disable set priority 200 set vdom "root" "vdom2" "vdom3" next edit 2 set override disable set vdom "vdom1" next end end FortiGate (global) # diagnose sys ha mac | grep wan1 prio=0, phy_index= 0, itf_name= wan1, mac=94.f3.92.53.ae.7a, vmac=00.09.0f.09.07.80, linkfail=0 prio=1, phy_index= 0, itf_name= wan1, mac=ac.71.2e.fd.21.be, vmac=--.--.--.--.--.--, linkfail=0 FortiGate (global) # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr 00:09:0F:09:07:80 inet addr:172.22.6.80 Bcast:172.22.7.255 Mask:255.255.254.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:340321975 errors:0 dropped:0 overruns:0 frame:0 TX packets:216361446 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:319365771796 (297.4 GB) TX bytes:110923401801 (103.3 GB)
自动分配
提示
- 该功能在 FortiOS 7.6.0 及以后版本支持。
- 只能配置物理接口。
在 HA 配置下针对特定接口启用auto-virtual-mac-interface命令启用此功能。FGCP 可根据主设备(Primary)的接口物理 MAC 地址,将本地管理位(U/L 位)修改为 1,作为该接口的 VMAC 地址。
相关信息
在 48 bit 的物理 MAC 地址中,U/L 位指 16 进制 MAC 地址首字节(8 bit)的倒数第 2 bit:
- 当该 bit 为 0 时:表示该 MAC 地址为通用地址,即由权威机构分配。
- 当该 bit 为 1 时:表示该 MAC 地址为本地地址,即由本地分配。
例如,wan1 接口十六进制地址 E0:23:FF:67:E3:9C 的首字节(8 bit)二进制表示为 1110 0000,其中 U/L 位为 0。默认 HA 配置下,该接口的 VMAC 使用基于
group-id的分配方式。FortiGate # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr 00:09:0f:09:00:02 Permanent_HWaddr e0:23:ff:67:e3:9c针对 wan1 接口启用
auto-virtual-mac-interface(可配置多个接口,也可配置为all)。config system ha set auto-virtual-mac-interface wan1 wan2 <----可配置多个接口,也可配置为all end再次查看 wan1 接口的 VMAC,其中 U/L 位被设置为 1,变为 1110 0010(E2),VMAC = E2:23:FF:67:E3:9C。
FortiGate-101F # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr e2:23:ff:67:e3:9c Permanent_HWaddr e0:23:ff:67:e3:9c FortiGate # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr E2:23:FF:67:E3:9C inet addr:10.10.12.2 Bcast:10.10.12.255 Mask:255.255.255.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:182841979 errors:0 dropped:0 overruns:0 frame:0 TX packets:126672095 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:205975479283 (191.8 GB) TX bytes:60698259991 (56.5 GB)
手动分配
提示
- 该功能在 FortiOS 7.6.0 及以后版本支持。
- 手动分配 VMAC 可在物理接口、EMAC VLAN 接口或 FortiExtender 接口上进行配置。该设置将覆盖该接口上的其他 VMAC 地址分配。
例如,wan1 接口的 VMAC 为 00:09:0f:09:00:02。
FortiGate # diagnose hardware deviceinfo nic wan1 | grep HWaddr Current_HWaddr 00:09:0f:09:00:02 Permanent_HWaddr e0:23:ff:67:e3:9c手动修改 wan1 接口的 VMAC 为 12:23:34:45:56:67。
config system interface edit "wan1" set virtual-mac 12:23:34:45:56:67 next end再次查看 wan1 接口的 VMAC,其中 U/L 位被设置为 1,变为 1110 0010(E2),VMAC = E2:23:FF:67:E3:9C。
FortiGate # diagnose sys ha mac | grep wan1 prio=0, phy_index= 2, itf_name= wan1, mac=94.f3.92.53.ae.7a, vmac=12.23.34.45.56.67, linkfail=0 prio=1, phy_index= 0, itf_name= wan1, mac=ac.71.2e.fd.21.be, vmac=--.--.--.--.--.--, linkfail=0 FortiGate # fnsysctl ifconfig wan1 wan1 Link encap:Ethernet HWaddr 12:23:34:45:56:67 inet addr:172.22.6.80 Bcast:172.22.7.255 Mask:255.255.254.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:340321975 errors:0 dropped:0 overruns:0 frame:0 TX packets:216361446 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:319365771796 (297.4 GB) TX bytes:110923401801 (103.3 GB)
单机模式修改 MAC 地址
当 FortiGate 处于 Standalone(单机)模式时:在接口层面可以通过macaddr选项修改 MAC 地址。
config system interface
edit "wan1"
set macaddr 00:01:02:03:04:05
next
end
FortiGate-101F # diagnose hardware deviceinfo nic wan1 | grep HWaddr
Current_HWaddr 00:01:02:03:04:05
Permanent_HWaddr e0:23:ff:67:e3:9c
......VMAC 工作机制
GARP
当 HA 发生主备切换后,新主设备会发送包含接口 VMAC 的 gratuitous ARP(GARP)来尽快更新上下联交换机/路由器的转发表(MAC 表/ARP 表),让上下游设备更快把流量转发到新的主设备接口。
GARP 不是绝对必须(网络设备最终也会自学习),但通常能显著加快收敛。
配置参数
config system ha
set arps <integer>
set arps-interval <integer>
set gratuitous-arps {enable | disable}
set link-failed-signal {enable | disable}
endgratuitous-arps:是否发送 GARP(默认开启)。arps:HA 切换后发送的 GARP 次数(1-60,默认 5)。arps-interval:GARP 间隔秒数(1-20,默认 8)。link-failed-signal:- HA 切换后让所有接口 shutdown 1 秒再 up,用于强制上下游设备链路状态变化,接口 down/up 后,上下游设备会重新学习 MAC/ARP 表(默认关闭)。
- 当关闭了
gratuitous-arps或 GARP 不能有效更新网络时(例如上下游设备配置了安全功能忽略了 FortiGate 发出的 GARP),建议启用link-failed-signal。
HA 部署注意事项
- 同一广播域内每套 HA 集群建议使用唯一的 HA group ID,避免 VMAC 冲突。
- 在 FortiGate 透明模式下观察到“多个接口同 VMAC”可能是预期行为(VMAC 绑定到管理 IP 的表现),不要先入为主当成异常。
- 如果 HA 切换后交换机收敛慢,优先从 GARP(次数/间隔)和
link-failed-signal这两个参数调整。 - 排查 VMAC 生成逻辑时,先明确你处于哪一种分配方式(默认逻辑/自动/手动),再去对照算法,避免计算结果偏差。
常见问题
HA 切换后业务中断或间歇丢包
- 查看 FortiGate 是否发送 GARP 通知上下游设备。
- 上下联设备是否及时学习到新的 VMAC 入口(MAC 表/ARP 更新)。
arps/arps-interval是否过小、是否需要启用link-failed-signal。- 是否存在 VMAC 冲突(同广播域多个集群 group-id 相同)。
- 多个 HA 集群处在同一广播域且使用相同 HA group ID 时,可能引发 MAC 冲突。
- 可通过修改其中一套 HA 集群的
group-id解决(或使用自动、手动方式分配 VMAC)。
聚合接口修改成员后 VMAC 变化
冗余/聚合(802.3ad)接口继承列表中第一个成员接口的 VMAC。
在 FortiGate 设备上向聚合接口添加或移除成员时如果操作的是聚合口的第一个成员接口,会导致聚合接口的 MAC/VMAC 地址变化,可能会导致上下游设备业务抖动。
如果不对聚合口的第一个成员接口做修改,建议在聚合接口中增加成员时,使用
append命令追加成员接口,新增成员接口会添加到聚合口成员列表末尾。config system interface edit "agg1" append member port18 next end
命令速查
| 命令 | 用途 | 关键字段/结果 |
|---|---|---|
diagnose hardware deviceinfo nic | 列接口名 | 接口列表 |
diagnose hardware deviceinfo nic | 查单接口 MAC | Current_HWaddr/Permanent_HWaddr |
diagnose sys ha mac | 查接口/VMAC 映射 | itf_name/phy_index/mac/vmac |
diagnose sys ha dump-by debug-zone | 查接口 phyindex | phyindex |
get system ha | 查看 HA 配置 | 用于确认 group-id 等信息 |