FortiGate HA Split-Brain: Diagnosing and Forcing a Safe Resync

Proactive Security for the AI Era
NodeZero continuously and autonomously pentests infrastructure, identity, cloud, and now web applications, chaining weaknesses across every domain the way real attackers do. Every finding ships with replayable proof showing exploitable business impact, not theoretical risk.
FortiGate high-availability clustering is built to survive the failure of a single unit, not to survive a heartbeat link that quietly stops passing traffic. When both heartbeat interfaces between two cluster members go down at the same time, or when a monitored heartbeat link degrades badly enough that hello packets stop arriving without the physical link actually dropping, each unit can independently conclude it is alone and promote itself to primary. The result is split-brain: two units answering ARP requests for the same virtual MAC address, two units claiming the same management and interface IPs, and a Layer 2 network that starts flapping as upstream switches see the same MAC show up on two different ports. A related but distinct failure mode is a cluster that never reaches split-brain but shows persistent out-of-sync status, where the checksum comparison between primary and secondary never converges even though only one unit is answering traffic. Both problems get fixed the same way: isolate what actually broke on the heartbeat path, confirm which unit holds the configuration you want to keep, and force a resync deliberately rather than rebooting units and hoping the cluster sorts itself out. This matters beyond routine uptime, too. A cluster stuck flapping between primary roles is a bad place to be in the middle of emergency patching, and FortiGate and FortiManager have both carried critical, actively exploited vulnerabilities in the past, including the FortiOS SSL-VPN heap overflow tracked as CVE-2023-27997 and the FortiManager authentication bypass known as FortiJump (CVE-2024-47575). If your HA pair is unstable when a patch window opens, fix the cluster first.
Causes: why heartbeat loss turns into split-brain
FortiGate HA elects a primary using heartbeat interfaces, typically two dedicated ports (commonly labeled ha1 and ha2) that exchange hello packets and synchronize session and configuration state between cluster members. As long as at least one heartbeat link stays up, the cluster's arbitration logic is designed to prevent both units from claiming primary at once. Split-brain shows up specifically when that protection breaks down, and in practice that happens for a small number of recurring reasons.
The most common cause is total heartbeat link loss on both interfaces simultaneously, usually because both heartbeat cables run through the same switch, the same switch stack member, or the same power circuit, so a single upstream failure takes down both links at once rather than just one. A close second is heartbeat link congestion or a bad NIC or transceiver on one member: if heartbeat hello packets are delayed or dropped intermittently rather than the link going fully down, both units can still misjudge peer state and each decide it's the only one left.
A less obvious but well-documented cause is two separate HA clusters on the same broadcast domain sharing the same HA Group ID. FortiGate uses the Group ID (along with the group name/password) to distinguish which units belong together; if a second, unrelated cluster on the same VLAN is configured with the same Group ID, both clusters' heartbeat traffic can interfere with each other and produce exactly the same symptoms as a genuine heartbeat failure. Finally, mismatched firmware between the two units, one member running a different FortiOS build than the other after an incomplete or failed upgrade, will also block clean synchronization and can present as persistent out-of-sync status even without a full split-brain event.
Diagnostics: isolating the heartbeat failure and config drift
Start by running get system ha status on both units, not just one. This command reports the HA mode (active-passive or active-active), the Group ID, and which unit each member currently believes is primary. If both units report themselves as primary, you have confirmed split-brain rather than a false alarm from a monitoring tool. If the Group ID differs between what you expect and what's configured, or if you find a second cluster nearby sharing your Group ID, that's your root cause without needing to go further.
Next, check heartbeat interface health directly rather than trusting link lights. diagnose sys ha status (the extended form) reports heartbeat packet loss counters (hb_lost_cnt) per interface; a counter that is climbing, rather than flat at zero, points to a congested or failing heartbeat link even when the interface shows as physically up. Where available, heartbeat statistics commands that show sent, received, and lost packet counts per heartbeat interface are the fastest way to tell the difference between a link that's fully dead and one that's degraded enough to break arbitration without dropping.
Once you know which link failed, compare configuration state between the two units with diagnose sys ha showcsum, run separately on each unit. This reports checksums for the debug zone and data zone of the running configuration, broken into global and per-VDOM sections, each ending in a sum value. If the sum values match between primary and secondary, the units agree on their configuration and you are dealing with a heartbeat problem only. If the sums differ, you have real configuration drift on top of the heartbeat issue, meaning changes were made independently on one or both units while they were split, and you need to identify which side holds the config you actually want before you force anything. Also pull diagnose sys ha history read on both units to see the timestamped record of role changes; a cluster that has flipped primary role multiple times in a short window confirms an intermittent, not a one-time, heartbeat problem, which changes how urgently you need to fix the physical link rather than just resync configuration.
Briefings like this, every morning before 9am.
Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.
Fixes: forcing a safe resync without an outage
Fix the physical or logical cause of the heartbeat loss before you force anything. If both heartbeat links share a switch, a power circuit, or a cable run, separate them, ideally onto genuinely independent physical paths, or direct-cable them between the two units if your rack layout allows it. If you found a duplicate Group ID collision with a neighboring cluster, change one cluster's Group ID and password to a value that doesn't overlap. If firmware is mismatched, bring both units to the same FortiOS build; HA will not synchronize reliably across differing versions no matter what else you fix.
Only after the heartbeat path is stable should you address configuration drift. Do not force a sync in the direction of whichever unit happens to currently be primary without checking first; if the secondary independently applied a legitimate emergency change (say, a temporary firewall rule opened during the split window), forcing a sync from the wrong side silently discards that change with no warning. Compare the showcsum output and your own change log or configuration backups from both units to determine which one holds the configuration you actually want to keep going forward, and back up both configs before you touch anything further.
Once you've confirmed the source of truth, run execute ha synchronize start from the unit holding the correct configuration to force it to push its full running configuration out to the other cluster member. This is a configuration-level synchronization, not a manual failover, so it does not by itself force a role change or interrupt existing sessions on a stable cluster. That said, forcing a full sync while the heartbeat link is still flapping can itself trigger another false failover, which is exactly why the link has to be stable first. If checksums still don't converge after a forced sync, and you've already ruled out an active heartbeat problem, the next step is removing the out-of-sync unit from the cluster, resetting it to a clean HA state, and rejoining it, which forces a full initial sync rather than an incremental one.
Validation: confirming the cluster is actually healthy again
Run get system ha status on both units again and confirm only one reports itself as primary, with the other correctly showing as secondary and both agreeing on the same Group ID and cluster membership. Then re-run diagnose sys ha showcsum on both units and confirm the sum values now match for every zone; a match here is the actual signal that configuration is synchronized, not just that the heartbeat link is up.
Check diagnose sys ha history read again after the fix and watch it over a real observation window, at least 15 to 30 minutes of normal traffic, rather than declaring victory immediately. A cluster that flipped once during your fix and then stays stable is healthy; one that continues flipping roles even after you've addressed the heartbeat link means you haven't found the actual root cause yet. Also verify heartbeat packet loss counters stay flat rather than continuing to climb, and check with your network team that upstream switches have stopped logging MAC flapping or duplicate IP/ARP warnings for the cluster's virtual MAC and shared IPs, since those L2 symptoms can persist briefly even after the FortiGate side is healthy again while switch MAC and ARP tables age out old entries.
Failure cases: when the resync doesn't hold
A handful of patterns show up repeatedly when a fix that looked complete doesn't actually stick. Checksums that converge after a forced sync but drift again within minutes usually mean something outside your manual process is still writing configuration to only one unit, commonly a centralized management tool such as FortiManager pushing a policy update to a single device rather than through the HA-aware workflow, or an API/automation script targeting one unit's management IP directly instead of the cluster's HA management interface.
Heartbeat links that test clean in isolation but the cluster still occasionally re-elects primary point to an intermittent problem you haven't actually found yet, commonly a heartbeat interface sharing a switch with other high-bandwidth traffic that occasionally saturates the port, or a failing SFP/transceiver that passes basic link tests but drops packets under load. Don't close this out until you've watched the packet loss counters under real traffic conditions, not just at idle.
Downstream network symptoms, duplicate MAC or IP warnings, ARP flapping alerts, occasionally outlive the FortiGate-side fix because adjacent switches and routers cached the duplicated virtual MAC address during the split window. If L2 symptoms persist after both units report a clean, single-primary HA status, the fix is clearing stale ARP and MAC table entries on the affected switches, not further troubleshooting the FortiGate cluster itself. Finally, watch for a forced sync that silently overwrote a legitimate change made during the split; if something that worked before the split-brain event stops working right after your resync, check whether it depended on a configuration change that existed only on the unit whose config you discarded.
Escalation criteria: when to open a Fortinet TAC case
Escalate to Fortinet support rather than continuing to iterate on the CLI when any of the following are true: configuration checksums still fail to converge after you've fixed the heartbeat link, confirmed matching firmware on both units, and run a forced sync at least twice; the cluster re-enters split-brain repeatedly with no identifiable heartbeat root cause after a genuine physical-layer investigation, which can indicate a hardware fault in a heartbeat NIC or a deeper HA process issue rather than a cabling problem; or the two units are running mismatched FortiOS firmware and you cannot safely bring them to a common version without a maintenance window, since HA diagnostics are not fully reliable across differing builds and this needs to be resolved through planned change management rather than live troubleshooting.
Also escalate immediately, without attempting further live fixes, if the cluster is actively passing production traffic and you cannot get a safe maintenance window to force a resync; in that case collect diagnose sys ha showcsum output from both units, diagnose sys ha history read, and the heartbeat packet loss counters first, and hand that evidence to Fortinet support rather than experimenting further on a live, traffic-carrying cluster.
The bottom line
FortiGate split-brain almost always traces back to both heartbeat links failing at once, usually because they share a physical failure point that isn't obvious until you look for it, or to a Group ID collision with a neighboring cluster. Confirm the failure with get system ha status on both units, use diagnose sys ha showcsum to find real configuration drift rather than assuming, fix the heartbeat path before you force anything, and only then run execute ha synchronize start from the unit you've confirmed holds the configuration you actually want. Validate with a real observation window, not just a clean status check immediately after the fix, and escalate to Fortinet support when checksums won't converge or the cluster keeps re-electing primary with no identifiable cause.
Frequently asked questions
What causes a FortiGate HA cluster to enter split-brain?
Split-brain happens when both heartbeat links between the two cluster members fail at the same time, which most often occurs because both heartbeat cables share a single point of failure such as the same switch, switch stack member, or power circuit, so one upstream event takes down both links together.
How do I confirm a cluster is actually in split-brain and not just showing a false alarm?
Run `get system ha status` on both cluster members separately; if both units report themselves as primary, split-brain is confirmed, and if the Group ID or cluster membership differs between what each unit reports, that mismatch is likely the root cause rather than a monitoring glitch.
What does diagnose sys ha showcsum actually tell me?
It reports configuration checksums for the debug zone and data zone on the unit where you run it, ending in a sum value per zone; comparing that sum between both cluster members shows whether their configurations actually match, which is the real test for synchronization, not just heartbeat link status.
Is execute ha synchronize start safe to run on a live, traffic-carrying cluster?
It forces a configuration-level sync from the unit you run it on to the other cluster member and does not by itself trigger a role failover, but it should only be run after the heartbeat link is confirmed stable, since forcing a sync while heartbeat is still flapping can itself trigger another unwanted failover.
Why do duplicate IP or MAC warnings on my switches persist after the FortiGate cluster looks healthy again?
Adjacent switches and routers can cache the duplicated virtual MAC address in their ARP and MAC tables during the split-brain window, and those stale entries can outlive the actual fix on the FortiGate side until they age out or are manually cleared on the affected network equipment.
When should I stop troubleshooting HA myself and open a Fortinet support case?
Escalate when configuration checksums still won't converge after fixing the heartbeat link and running a forced sync more than once, when split-brain recurs repeatedly with no identifiable heartbeat root cause after real physical-layer investigation, or when the two units are running mismatched firmware that can't be safely aligned outside a planned maintenance window.
Sources & references
Free resources
Critical CVE Reference Card 2025–2026
25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.
Ransomware Incident Response Playbook
Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.
Get threat intel before your inbox does.
50,000+ security professionals read Decryption Digest for early warnings on zero-days, ransomware, and nation-state campaigns. Free, daily, no spam.
Unsubscribe anytime. We never sell your data.

Founder & Cybersecurity Evangelist, Decryption Digest
Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.
