The Swiggy delivery network — a routing problem you already understand
You order biryani on Swiggy at 8 PM. The order goes to a dispatcher. The dispatcher looks at three things in real time: which delivery partner is closest, which one has the highest rating, and which route avoids the Outer Ring Road jam right now. The biryani always arrives — but the path changes based on traffic. That dispatcher is FortiGate SD-WAN. The delivery partners are your WAN underlays (MPLS, broadband, 4G). The "real time" data is the Performance SLA. The biryani is your application traffic.
Now imagine Swiggy stops giving the delivery partner the whole apartment building's master key and instead generates a one-time door code valid for just that order, valid only for the 3rd floor, valid only between 8-9 PM. That is ZTNA. A traditional SSL-VPN hands the user the master key (LAN access). ZTNA hands them a session-scoped, application-scoped, posture-verified one-time code.
Why this matters — interview-grade and production-grade
If you are interviewing for a Fortinet admin role in 2026, the panel will ask two questions back-to-back: "explain SD-WAN application steering" and "why is your CISO replacing SSL-VPN with ZTNA?" The first answer separates the GUI-clickers from the engineers. The second separates the engineers from the architects. This blog gets you both.
Fortinet has shipped multiple zero-day exploits in its SSL-VPN code (CVE-2024-21762, CVE-2024-47575, CVE-2025-32756 — all critical). Every quarter another one drops. Every Fortinet shop's CISO is asking: "can we kill SSL-VPN and use ZTNA for everything?" The honest answer is "mostly yes" — for HTTPS apps. SSL-VPN still has edge cases (legacy thick-client apps, port-forwarded RDP) but those are shrinking fast. Knowing how to migrate makes you the engineer the org keeps.
FortiGate SD-WAN — the core concept
SD-WAN on FortiGate is built from three things layered on top of each other:
- SD-WAN Zone — a logical grouping of member interfaces (e.g.
virtual-wan-zone). Once an interface is added to a zone, it disappears from the regular interface list and is referenced aszone-name. - Performance SLA — the health probe (HTTP / DNS / Ping / TCP-echo / TWAMP). Targets a public server (e.g.
8.8.8.8) or a private one. Measures latency, jitter, packet-loss. Triggers a "member failed" event when thresholds break. - SD-WAN Rule — the steering policy. "If source X talks to destination Y (or app Z), prefer the member with best latency / best quality / lowest cost." Applied in order, first match wins.
config system sdwan
set status enable
config zone
edit "virtual-wan-zone"
next
end
config members
edit 1
set interface "port1"
set zone "virtual-wan-zone"
set comment "MPLS underlay"
next
edit 2
set interface "port2"
set zone "virtual-wan-zone"
set comment "Broadband underlay"
next
end
config health-check
edit "M365-probe"
set server "outlook.office365.com"
set protocol http
set http-get "/"
set http-match "200"
set interval 1000
set failtime 5
set members 1 2
config sla
edit 1
set latency-threshold 60
set jitter-threshold 20
set packetloss-threshold 1
next
end
next
end
config service
edit 1
set name "M365-steer"
set mode sla
set internet-service enable
set internet-service-app-ctrl 41540 41541
config sla
edit "M365-probe"
set id 1
next
end
set priority-members 1 2
next
end
endFGT # diagnose sys sdwan health-check status M365-probe Health Check (M365-probe): Seq(1 port1): state=alive, packet-loss=0.000% latency=18.123 jitter=2.111 sla_map=0x1 Seq(2 port2): state=alive, packet-loss=0.200% latency=42.001 jitter=4.890 sla_map=0x1
Both members alive, both meeting SLA, port1 (MPLS) preferred. If port1 fails the SLA, FortiGate auto-fails M365 traffic to port2 within ~5 seconds (depends on failtime).
Each application class hits its own SD-WAN rule. The Performance SLA continuously re-evaluates which member meets the threshold; if MPLS jitter spikes above 20ms, M365 fails to broadband automatically.
Sneha's Pune branch users complain Teams calls drop every afternoon. She runs diag sys sdwan health-check status M365-probe and sees jitter spiking above 20ms on MPLS during 2-4 PM — neighbour office on the same MPLS circuit doing a backup. Two fixes: (a) raise the M365 jitter threshold (lazy), (b) add a backup-app steering rule that forces backups onto port2 broadband (correct). She picks (b). Teams stays on MPLS, backup moves off, calls recover.
BGP-over-IPsec overlay — when branches need to talk to branches
SD-WAN gets one branch to the internet/SaaS cleanly. Real enterprises also need branch-to-branch (Pune-to-Lucknow office for an internal CRM). The pattern Fortinet pushes is ADVPN with iBGP on top.
config router bgp
set as 65001
set router-id 10.50.255.1
config neighbor-group
edit "ADVPN-spokes"
set advertisement-interval 1
set link-down-failover enable
set next-hop-self enable
set additional-path send
set remote-as 65001
set route-reflector-client enable
next
end
config neighbor-range
edit 1
set prefix 10.50.255.0/24
set neighbor-group "ADVPN-spokes"
next
end
config network
edit 1
set prefix 10.50.0.0 255.255.0.0
next
end
endThe NSE7 SD-WAN trap: candidates pick eBGP for the overlay because "different AS = more isolation." Wrong. iBGP preserves the next-hop attribute — without it, ADVPN spokes can't resolve each other's tunnel endpoints and shortcut tunnels never come up. Memorise: iBGP over IPsec for ADVPN, always.
ZTNA on FortiGate — the architecture
FortiGate ZTNA is built from three components:
- FortiClient EMS — runs in your DC or cloud. Profiles user devices, runs Zero-Trust tagging rules (AV installed? On-domain? Specific registry key? OS patched?), issues short-lived client certs.
- ZTNA tags — synced from EMS to FortiGate in real-time. Every endpoint shows up with a set of tags like
EMS_All_Registered_Clients,tag_av_installed,tag_corp_domain_joined. - Access Proxy VIP — on the FortiGate. Listens on HTTPS, terminates the user's TLS connection, checks the client cert + ZTNA tags + ZTNA policy, then proxies to the real internal app. The internal app is never directly exposed.
config firewall access-proxy
edit "ap_internal_jira"
set vip "vip_ztna_proxy" # listens on 203.0.113.10:443
set client-cert enable
config api-gateway
edit 1
set url-map "jira.corp.local"
set service https
config realservers
edit 1
set address "jira-prod" # internal address object 10.60.10.20
set port 443
next
end
next
end
next
end
config firewall policy
edit 100
set name "ZTNA_jira_corp_users"
set srcintf "any"
set dstintf "any"
set ztna-status enable
set ztna-ems-tag "tag_corp_domain_joined" "tag_av_installed"
set srcaddr "all"
set dstaddr "vip_ztna_proxy"
set action accept
set schedule "always"
set service "HTTPS"
next
endLateral-movement blast radius is the real reason CISOs are migrating. ZTNA reduces it from "everything" to "one app per session".
Karthik's CISO mandates ZTNA for the new contract-developer workforce. Karthik defines an EMS tagging rule "if FortiClient sees Windows Defender real-time-protection=ON AND AV signatures < 24h old, tag tag_av_installed." The ZTNA policy requires both tag_av_installed and tag_corp_domain_joined. A contractor's personal laptop without AV cannot reach Jira; their managed laptop can. Zero VPN tunnel ever crosses the firewall.
The 4 SD-WAN failures you'll diagnose in your first month
| Symptom | Likely cause | First command |
|---|---|---|
| "Member shows failed but interface is up" | SLA probe target is unreachable, not the underlay | execute ping-options source <member-ip> then execute ping <sla-target> |
| Asymmetric routing — return traffic goes wrong way | Missing set auxiliary-session enable or no return route on the other underlay | diag sys session list |
| SLA flapping — member goes alive/dead repeatedly | failtime too aggressive vs probe loss tolerance | diag sys sdwan health-check status |
| Overlay (IPsec) doesn't come up | Phase1 mismatch (most common: PSK or PFS group), or NAT-T disabled | diag debug enable; diag debug application ike -1 |
- Forgetting to remove the interface from other configs before adding to the SD-WAN zone. Symptom: GUI says "Interface in use." Fix: remove all firewall policies, static routes, references; then add to zone; then add policies/routes back via the zone.
- Using eBGP over the ADVPN overlay. ADVPN shortcut tunnels never establish because next-hop is rewritten. Always iBGP.
- ZTNA policy with
ztna-status enablebut noztna-ems-tagset. Effectively allows any registered EMS device — defeats the posture-check premise. - Trusting the FortiClient EMS tag without enforcement. The tag is data; the policy is the control. Always check both
get firewall access-proxy+ the policy rule. - Performance SLA targeting a DNS name that's only resolvable internally on one underlay. The other underlay always "fails." Use an IP or a name resolvable on both.
- Use
internet-serviceobjects (App Control IDs like41540for M365) instead of writing destination IPs — Fortinet keeps the IP list updated for you. - Test SLA failover in a maintenance window by shutting one underlay's interface (
config sys int / edit port1 / set status down) and watchingdiag sys sdwan member. If failover takes more than 10 seconds, yourinterval+failtimeneeds tuning. - For NSE7: practice writing and reading BGP configs by hand — the exam shows partial CLI snippets and asks "what's wrong with this neighbor-group?" Almost always the answer is a missing
next-hop-self,route-reflector-client, oradditional-path. - For ZTNA migration: start with one HTTPS app, mirror users from SSL-VPN to ZTNA for 2 weeks (both work), then cut over. Don't big-bang the whole org.
Aditya migrates 3 internal apps to ZTNA. Week 2, a developer complains "Jira is slow." Aditya checks: the developer is hitting the Access Proxy from Lucknow office over MPLS. The MPLS goes to the DC where Jira lives — but ZTNA adds TLS termination + cert check at the Access Proxy. P50 latency went from 12ms (direct LAN) to 24ms (through proxy). That's the ZTNA tax. He documents it; team accepts; everyone's happy.
Default to ZTNA wherever it works. Fall back to SSL-VPN only for thick-client protocols ZTNA Access Proxy can't broker.
📋 Quick reference — FortiGate SD-WAN + ZTNA cheat sheet
| Need to… | Use |
|---|---|
| List SLA status | diag sys sdwan health-check status |
| See chosen member per service | diag sys sdwan service |
| List SD-WAN members | diag sys sdwan member |
| Watch ADVPN tunnel shortcuts | diag vpn tunnel list type-shortcut |
| List EMS-synced ZTNA tags | diag firewall dynamic list |
| Show Access Proxy state | diag firewall access-proxy list all |
| Debug IKE Phase 1 | diag debug application ike -1 |
| Debug ZTNA policy decision | diag firewall auth list ; diag debug application authd -1 |
Sources used in this lesson
- FortiOS 7.6.6 — Basic ZTNA configuration
- FortiOS 7.6.6 — ZTNA configuration examples
- FortiOS 7.6 — Configuring the SD-WAN interface
- FortiOS 7.6 — Basic SD-WAN configuration (MSSP architecture)
- Fortinet — ZTNA vs VPN: the better cybersecurity solution
- FortiClient EMS 7.4 — Security Posture Tags
- NSE7 SD-WAN 7.2 — exam blueprint and topic detail
📝 Check your understanding — 10 scenario questions
Bloom-tiered: 1 Remember + 3 Apply + 4 Analyze + 2 Evaluate. Pass: 70% (7/10).
What's next?
Spin up a FortiGate VM in EVE-NG or GNS3 and replicate the SD-WAN config above. Then move to ZTNA on a real EMS install. NSE7 practice exam questions live on exam.techclick.in.