Lessons · SD-WAN SLA + strategies · SLA then steer
This lesson is measure the member, then put the app on an explicit rule. Manual / Best Quality / Lowest Cost / Maximize Bandwidth as a full choose-when table lives on the sibling page. Do not skip the implicit catch-all and then debug jitter on a path the rule never matched.
SD-WAN SLA + five strategies · Policy lookup + NAT · FortiGate interview
A member is one enrolled WAN or overlay inside the SD-WAN zone. A Performance SLA (config health-check) probes those members and marks each in-SLA or out-of-SLA against latency, jitter and packet-loss targets. It does not pick a path. An SD-WAN rule is first-match: identify the app (Internet Service / ISDB for first packet), then apply a strategy. Unmatched traffic hits the implicit rule. Lowest Cost (SLA) stays on the cheapest in-SLA member. Lab: wan1 203.0.113.1 cost 10, wan2 198.51.100.1 cost 5, health-check Office365, SLA 100 ms / 30 ms / 1% — not the shipped 5 / 5 / 0.
Why the ISP is up and Teams is still bad
Link-up is not path quality. wan1 can ARP its gateway and still carry 40 ms of jitter on the Teams media path. FortiOS only steers on the measurements you configured — protocol, server, participants, failtime, and the SLA target. A Performance SLA with no rule consuming it is a dashboard tile.
The classic ticket is first-match, not a bad circuit:
- No explicit Office 365 / Teams rule — the implicit catch-all load-balances the session onto whichever member its hash picked, including the degraded one.
- A dest-all explicit rule sits above the application rule. First match wins. The app rule never fires.
- The health-check probes 8.8.8.8 while the app path is the Microsoft front door. In-SLA on Google is not in-SLA on Outlook.
When a Performance SLA is inactive or out-of-SLA, FortiOS will not send that health-check’s steered traffic through the failing member. Traffic that never matched an SLA-aware rule still uses the implicit algorithm. Measure, then bind the app to a rule that reads those bits.
Members, SLA, then the rule
Pre-train these four words before you open Network > SD-WAN.
Zone
Logical bundle. Firewall policies and the default static route point here (default name virtual-wan-link). One policy, not one per ISP.
Member
One enrolled interface: wan1, wan2, or an IPsec overlay. Owns gateway, cost (0 = most preferred), and the sequence number used in priority-members.
Performance SLA
Active (or passive) probe per participant. Outputs latency, jitter, packet-loss, alive/dead, and bitmask sla_map. It does not steer by itself.
SD-WAN rule
First-match service: match source / dest / ISDB / app, then apply a strategy to eligible members. Miss every rule → implicit.
Read left → right. The zone is the container. Probes write in-SLA / out-of-SLA. The explicit rule consumes that bitmask. Implicit never looks at the Office365 health-check.
The health-check measures. The rule steers. The implicit rule is the leftover bucket. A member that is alive but out-of-SLA is still a valid implicit hash target unless you bound that traffic to an SLA-aware rule.
| Object | Lab value | If missing |
|---|---|---|
| Zone | virtual-wan-link | Policy and static route have nowhere to point. You write one policy per WAN — that is not SD-WAN. |
| Member 1 | wan1 · gw 203.0.113.1 · cost 10 | No underlay A. Cost 10 loses Lowest Cost (SLA) to wan2 when both are in-SLA. |
| Member 2 | wan2 · gw 198.51.100.1 · cost 5 | No cheaper DIA. Cost 0 is “most preferred,” not “free.” |
| Health-check | Office365 · members 1 2 · server on the app path | No sla_map. Lowest Cost (SLA) / Maximize Bandwidth cannot run. |
| SLA target | latency 100 ms · jitter 30 ms · loss 1% | Shipped defaults 5 / 5 / 0 mark internet DIA out-of-SLA all day. |
| Explicit rule | Office365 · ISDB Microsoft-Office365 · mode sla | App hits implicit. SLA is a graph, not a path. |
| Firewall policy | lan → virtual-wan-link · NAT on DIA | Steering has no permit. SD-WAN is not a security policy. |
Measure then steer
Order is the whole job. Skip the SLA and Lowest Cost (SLA) has nothing to read. Skip the explicit rule and the SLA has nobody to talk to.
Three ANDs for Office 365 on wan2: explicit rule matched, wan2 in-SLA, wan2 cheapest among in-SLA members. Miss the first AND and implicit owns the session.
Rules vs implicit · how to steer the app
SD-WAN rules are first-match, top down, same mental model as a firewall policy. The last row is not a rule you created — it is the implicit catch-all FortiOS always has.
| Control | What it does | What it does not do |
|---|---|---|
| Explicit rule | Matches source / dest / Internet Service / application, then runs a strategy on the listed members. | Does not permit traffic. The firewall policy lan → zone still has to allow it. |
| Implicit rule | Everything that matched nothing. Load-balances with the algorithm on the implicit rule (source-IP, sessions, spillover, …). | Does not read your Office365 SLA. Does not know Teams from bulk download. |
| Internet Service (ISDB) | First-packet identity from FortiGuard IP/port database. This is the reliable application-steering match. | Not the same as Application Control signatures, which need bytes — and SSL inspection for HTTPS. |
| Lowest Cost (SLA) | Among members that meet the required SLA target, pick the lowest cost. Session-sticky. Voice-safe. | Does not re-rank a live call when jitter improves on the other WAN. That is Best Quality, and it will move the call. |
| Best Quality | Re-ranks by a quality factor (latency / jitter / loss / …). SLA target optional. | Unsafe for long-lived media. A “better” member mid-call is a glitch, not a win. |
| Maximize Bandwidth (SLA) | Load-shares across all in-SLA members. | Will split related flows. Do not use for a single Teams meeting. |
Fortinet’s application-steering examples bind business apps (Office 365, SIP) with Lowest Cost (SLA) and recreational apps with Best Quality. For first-packet steer, set Destination to the Internet Service (Microsoft-Office365, Microsoft-Teams). Application Control IDs on HTTPS without inspection classify after the session already egressed. Source: FortiOS Administration Guide — Dynamic application steering with lowest cost and best quality strategies.
FortiOS SLA-target defaults are latency 5 ms, jitter 5 ms, packet-loss 0%. That is a metro Ethernet number, not an internet underlay. Lowest Cost (SLA) then sees both members out-of-SLA and you debug “SD-WAN is broken.” Tune per app — lab uses 100 / 30 / 1 for Office 365. Voice-like 80 / 30 / 1 is a design choice, not a shipped default.
Runbook Side A / B / C
Lab: LAN 10.20.20.0/24, zone virtual-wan-link, wan1 gw 203.0.113.1 cost 10, wan2 gw 198.51.100.1 cost 5, health-check Office365. HTTP/HTTPS DIA. Do not invent a third overlay on this page.
Side A — underlay, zone, policy
-
Enroll the members
Network > SD-WAN > SD-WAN Zones — enable SD-WAN, keep zone
virtual-wan-link, addwan1andwan2with gateways and costs. CLI:config system sdwan→config members. A member that is not in the zone is invisible to every rule. -
Default route + firewall policy
Static default whose outgoing interface is the zone, not a single WAN. Policy:
srcintf=lan→dstintf=virtual-wan-link, NAT on, log all sessions. If clients still have a more-specific route outwan1, SD-WAN never sees the packet. Source: FortiOS “Configuring the SD-WAN interface.”
Side B — measure, then write the app rule
-
Performance SLA on the members
Network > SD-WAN > Performance SLAs — create
Office365. Protocol ping or HTTP toward a server on the app path. Participants: Specifywan1+wan2(not every overlay you never use). Enable SLA Target. Set latency 100, jitter 30, packet-loss 1. Lowest Cost (SLA) and Maximize Bandwidth require this target; Manual / Best Quality do not. Source: Link health monitor / Performance SLA overview. -
Explicit application rule above implicit
Network > SD-WAN > SD-WAN Rules — Create New. Name
Office365. Destination: Internet ServiceMicrosoft-Office365(addMicrosoft-Teamsif that is the ticket). Strategy: Lowest Cost (SLA). Interface preference: wan1, wan2. Required SLA target:Office365#1. Save. Confirm it sits above any dest-all rule and above implicit. -
Leave implicit for leftover bulk
Do not “fix” implicit by pinning it to wan1. Implicit is the bucket for traffic you have not identified. Source-IP or session load-balance is fine for generic HTTPS. It is not fine for the meeting.
Network › SD-WAN › Performance SLAs › Create New
Office365 — link health monitor
Source: FortiOS Administration Guide — Link health monitor. SLA Target is required when a rule uses Lowest Cost (SLA) or Maximize Bandwidth (SLA). Latency is calculated over the last 30 probes (default GUI hint 5 ms — overwrite it). Do not leave Update static route enabled on a SaaS-only probe unless you intend every flow to leave that member.
Network › SD-WAN › SD-WAN Rules › Create New
Office365 — priority rule
Source: FortiOS — SD-WAN rules lowest cost (SLA); Dynamic application steering. After OK, drag this rule above any dest-all row. Implicit stays last and unnamed. CLI mode is set mode sla with config sla pointing at the health-check.
config system sdwan
set status enable
config members
edit 1
set interface "wan1"
set gateway 203.0.113.1
set cost 10
next
edit 2
set interface "wan2"
set gateway 198.51.100.1
set cost 5
next
end
config health-check
edit "Office365"
set server "outlook.office365.com"
set members 1 2
config sla
edit 1
set latency-threshold 100
set jitter-threshold 30
set packetloss-threshold 1
next
end
next
end
config service
edit 1
set name "Office365"
set mode sla
set internet-service enable
set internet-service-name "Microsoft-Office365"
set health-check "Office365"
set priority-members 1 2
next
end
end
Side C — proof
-
SLA bits
diagnose sys sdwan health-check Office365— each seq showsstate(alive), latency / jitter / packet-loss, andsla_map. In-SLA is0x1for target 1. Out-of-SLA is0x0. Dead is not the same as out-of-SLA: dead failed failtime; out-of-SLA is alive but above threshold. -
Selected member
diagnose sys sdwan service— Service(1) Mode(sla), Members listed withselectedon the cheapest in-SLA seq. If Office 365 sessions still egress wan1, the rule did not match (ISDB miss, or a dest-all above it). Source: FortiOS diagnose examples on Performance SLA / service. -
Forward traffic log
Generate one Outlook session from
10.20.20.40. Log & Report > Forward Traffic: dstintf should bewan2while wan2 is in-SLA. If dstintf is wan1 and sla_map on wan1 is 0x0, you matched implicit or the wrong rule.
diagnose sys sdwan memberlists seq 1 wan1 cost 10, seq 2 wan2 cost 5.health-check Office365→ wan2sla_map=0x1; wan1 either 0x1 or 0x0 matching the live numbers.diagnose sys sdwan service→ Service Office365 Mode(sla), cheapest in-SLA memberselected.- Forward log for Microsoft-Office365 shows dstintf = that selected member — not a hash onto the other WAN.
One session after commit
After the rule is saved, an Outlook session from the LAN does this:
- Packet hits the firewall policy lan →
virtual-wan-link. Permit is not a path yet. - SD-WAN walks explicit rules top-down. ISDB
Microsoft-Office365matches rule 1 on the first packet. - Strategy Lowest Cost (SLA) reads health-check
Office365. Members withsla_map=0x0are skipped. Among remaining, lowest cost wins — lab: wan2 cost 5 over wan1 cost 10. - Session is sticky on that member. A later jitter spike that takes wan2 out-of-SLA can fail the member for new sessions; existing stickiness depends on SLA fail/recovery timers — do not assume mid-flow teleport.
- Unmatched bulk HTTPS never entered step 2. Implicit hashed it. The Office365 SLA did not vote.
When a member has more than one health-check, FortiOS removes that member’s routes from the SD-WAN group only when all of those checks fail. One green probe to 8.8.8.8 will keep the member eligible even if the Office365 probe is dead. Participants should be the members you actually steer — not “All SD-WAN Members” out of habit.
Traps + proof
diagnose sys sdwan health-check then diagnose sys sdwan service. A green physical interface does not mean in-SLA, and in-SLA does not mean the app matched the rule.| Symptom | Likely cause | Proof / fix |
|---|---|---|
| SLA graphs look healthy; Teams still on the bad ISP | No explicit app rule, or dest-all above it. Implicit hashed the session. | diagnose sys sdwan service — if Service(1) never lists the session’s members as selected for that ISDB, move the app rule to the top. |
| Both members out-of-SLA on day one | Left SLA target at 5 ms / 5 ms / 0%. | Tune to realistic DIA numbers. Lab 100 / 30 / 1. Re-read Measure then steer. |
| Health-check dead on one WAN only | Probe server blocked on that ISP, or wrong participants. | Two servers if you must distinguish “path down” from “server down.” Specify members; do not probe overlays you do not steer. |
| HTTPS app still takes implicit for the first seconds | Matched Application Control, not ISDB. Classification is late. | Use Internet Service for first-packet steer. Signatures are a second identity, not a replacement. |
| Voice glitches every few minutes on “the better circuit” | Strategy is Best Quality. It re-ranks live sessions. | Lowest Cost (SLA) for media. Best Quality for bulk that can move. |
| All traffic left wan1 when Office365 SLA failed | update-static-route enabled on that health-check. Out-of-SLA withdrew the member for every flow. | Leave update-static-route for true underlay death. A SaaS probe should not black-hole the default route. |
| Policy to wan1 still works in the browser | Bypass. Clients never hit the zone. | One policy to virtual-wan-link. Kill per-WAN policies and leftover statics. |
| Member “selected” but sessions black-hole | No route / gateway on that member. Steering picked a next-hop the RIB does not have. | get router info routing-table all. SD-WAN is not a substitute for a usable default via the zone. |
- Zone
virtual-wan-linkhas wan1 cost 10 and wan2 cost 5. Default route and lan policy point at the zone. - Health-check
Office365participants are those two members. SLA target is tuned, not 5 / 5 / 0. - Explicit ISDB rule Office365, Lowest Cost (SLA), required target Office365#1, above dest-all, above implicit.
diagnose sys sdwan health-check Office365shows sla_map bits that match the live latency/jitter/loss.diagnose sys sdwan serviceshows the cheapest in-SLA member selected. Forward log dstintf agrees.- A synthetic dest-all browse still uses implicit — that is leftover, not a bug. The meeting must not.
Knowledge check
Six judgment calls on measure-then-steer — not menu trivia.
Sources
- FortiOS Administration Guide — Link health monitor (latency / jitter / loss; SLA target required for Lowest Cost and Maximize Bandwidth; last-30-probe latency/jitter; last-100-probe loss)
- FortiOS Administration Guide — Performance SLA overview (participants must be members; active vs passive; SLA target defaults 5 ms / 5 ms / 0%)
- FortiOS Administration Guide — Implicit rule (unmatched traffic; load-balance algorithms; default route via the SD-WAN zone)
- FortiOS Administration Guide — Dynamic application steering with lowest cost and best quality strategies
- FortiOS Administration Guide — SD-WAN rules — lowest cost (SLA) (
set mode sla; cost 0 = most preferred) - FortiOS CLI —
config system sdwan/config health-check/config sla/config service;diagnose sys sdwan health-check·diagnose sys sdwan service
Related: SD-WAN SLA + five strategies · SD-WAN + ZTNA · Policy lookup + NAT · FortiGate interview · Troubleshooting command center