{"id":10443,"date":"2026-08-15T14:39:53","date_gmt":"2026-08-15T12:39:53","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/multi-wan-failover-policy-planner\/"},"modified":"2026-08-15T14:49:07","modified_gmt":"2026-08-15T12:49:07","slug":"multi-wan-failover-policy-planner","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/","title":{"rendered":"Multi-WAN Failover &#038; Policy Planner"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">A second uplink is bought for the day the first one fails, and on that day two things decide whether it helps: how long the switch takes, and whether the rules underneath still point where they were meant to. Both are arithmetic, and both are easier to check here than at three in the morning.<\/p>\n<div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 12px; margin-bottom: 18px;\">\n<div>\n            <label for=\"mv-intervall\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Health check every (s)<\/label><br \/>\n            <input id=\"mv-intervall\" type=\"number\" min=\"1\" max=\"120\" step=\"1\" value=\"5\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box;\">\n        <\/div>\n<div>\n            <label for=\"mv-fehler\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Failures before switching<\/label><br \/>\n            <input id=\"mv-fehler\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" value=\"3\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box;\">\n        <\/div>\n<div>\n            <label for=\"mv-erfolge\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Successes before switching back<\/label><br \/>\n            <input id=\"mv-erfolge\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" value=\"5\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box;\">\n        <\/div>\n<div>\n            <label for=\"mv-ziele\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Check targets<\/label><br \/>\n            <select id=\"mv-ziele\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box;\"><option value=\"verschieden\" selected>different per WAN<\/option><option value=\"gleich\">the same on both<\/option><\/select>\n        <\/div>\n<div>\n            <label for=\"mv-volumen\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Backup data cap (GB)<\/label><br \/>\n            <input id=\"mv-volumen\" type=\"number\" min=\"0\" max=\"10000\" step=\"1\" value=\"50\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box;\">\n        <\/div>\n<div>\n            <label for=\"mv-last\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Typical load (Mbit\/s)<\/label><br \/>\n            <input id=\"mv-last\" type=\"number\" min=\"0.1\" max=\"1000\" step=\"0.1\" value=\"6\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box;\">\n        <\/div>\n<\/p><\/div>\n<div style=\"font-family: 'Nunito Sans', sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.92rem; margin-bottom: 8px;\">Policy routes, in order<\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 10px;\">The first matching rule wins, exactly as on the console. A rule that covers everything above a narrower one makes the narrower one unreachable.<\/p>\n<div id=\"mv-regeln\" style=\"display: grid; grid-template-columns: auto 1fr 1fr 1fr auto; gap: 6px 10px; align-items: center; margin-bottom: 18px;\"><\/div>\n<p>    <button id=\"mv-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Plan failover<\/button><\/p>\n<div id=\"mv-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"A second uplink is bought for the day the first one fails, and on that day two things decide whether it helps: how long the switch takes, and whether the rules underneath still point where they were meant to. Both are arithmetic, and both are easier to check here than at three in the morning.\",\"label_intervall\":\"Health check every (s)\",\"label_fehler\":\"Failures before switching\",\"label_erfolge\":\"Successes before switching back\",\"label_ziele\":\"Check targets\",\"ziele_verschieden\":\"different per WAN\",\"ziele_gleich\":\"the same on both\",\"label_volumen\":\"Backup data cap (GB)\",\"label_last\":\"Typical load (Mbit\\\/s)\",\"h_regeln\":\"Policy routes, in order\",\"regeln_hinweis\":\"The first matching rule wins, exactly as on the console. A rule that covers everything above a narrower one makes the narrower one unreachable.\",\"spalte_bereich\":\"Source\",\"spalte_dienst\":\"Traffic\",\"spalte_wan\":\"Uplink\",\"spalte_ausweichen\":\"may fail over\",\"bereich_alle\":\"everything\",\"bereich_lan\":\"LAN\",\"bereich_iot\":\"IoT\",\"bereich_gaeste\":\"guests\",\"bereich_voip\":\"VoIP network\",\"dienst_alle\":\"all traffic\",\"dienst_voip\":\"VoIP\",\"dienst_video\":\"video\",\"dienst_sicherung\":\"backup\",\"wan_wan1\":\"WAN1\",\"wan_wan2\":\"WAN2\",\"fest\":\"(pinned)\",\"knopf\":\"Plan failover\",\"h_zeiten\":\"Timing\",\"zeile_umschalt\":\"Time until the switch\",\"zeile_rueckschalt\":\"Time until switching back\",\"zeile_volumen\":\"Backup cap lasts\",\"stunden\":\"hours\",\"h_regelfolge\":\"Which rules actually apply\",\"spalte_nummer\":\"#\",\"spalte_wirkung\":\"Effect\",\"wirkt\":\"applies\",\"verdeckt_von\":\"unreachable - rule %d already matches\",\"keine_regeln\":\"No rule is active, so everything follows the default route.\",\"h_hinweise\":\"What this configuration means\",\"hinweis_sitzungen_brechen\":\"A failover changes the source address, so every open connection dies with it. Downloads restart, SSH sessions hang, and a call in progress drops - the switch restores the line, not the session.\",\"hinweis_umschaltung_langsam\":\"More than thirty seconds until the switch. For anything a person is waiting on, that is indistinguishable from an outage.\",\"hinweis_umschaltung_nervoes\":\"Under ten seconds the line switches on a brief packet loss that would have resolved itself, and every switch costs all open connections.\",\"hinweis_rueckschaltung_zu_schnell\":\"Switching back is not slower than switching over. A line that flaps then drags every connection with it, twice per flap.\",\"hinweis_gleiche_pruefziele\":\"The same check target on both uplinks means an outage at that target looks like both lines being down. Two different targets, ideally in different networks.\",\"hinweis_volumen_knapp\":\"The backup cap lasts less than a day at this load. A failover during a system update or a cloud backup empties it before anyone notices the primary line is gone.\",\"hinweis_regel_verdeckt\":\"At least one rule can never match because a broader one sits above it. Order narrow before broad.\",\"hinweis_gepinnt_auf_ersatz\":\"A rule pins traffic to WAN2 without allowing failover. If WAN2 goes down, that traffic goes down with it - the primary line will not take it.\",\"hinweis_voip_bricht\":\"VoIP is allowed to fail over. The line comes back, the call does not; a call in progress ends at the moment of the switch.\",\"dezimal\":\".\"};<\/p>\n<p>    const BEREICHE = ['alle', 'lan', 'iot', 'gaeste', 'voip'];\n    const DIENSTE  = ['alle', 'voip', 'video', 'sicherung'];\n    const WANS     = ['wan1', 'wan2'];\n    const ANZAHL_REGELN = 4;<\/p>\n<p>    function zahl(wert, ersatz) {\n        const n = Number(wert);\n        return isFinite(n) ? n : ersatz;\n    }<\/p>\n<p>    \/** Deckt der Bereich a den Bereich b vollstaendig ab? *\/\n    function deckt(a, b) {\n        return a === 'alle' || a === b;\n    }<\/p>\n<p>    \/**\n     * Eine Regel verdeckt eine spaetere, wenn sie deren Bereich und Dienst\n     * vollstaendig einschliesst. Getroffen wird immer die erste passende.\n     *\/\n    function regelnPruefen(regeln) {\n        const liste = (regeln || []).filter(function (r) { return r && r.aktiv; });\n        return liste.map(function (r, i) {\n            let verdecktVon = null;\n            for (let j = 0; j < i; j++) {\n                const v = liste[j];\n                if (deckt(v.bereich, r.bereich) &#038;&#038; deckt(v.dienst, r.dienst)) { verdecktVon = j; break; }\n            }\n            return {\n                nummer: i + 1,\n                bereich: r.bereich,\n                dienst: r.dienst,\n                wan: r.wan,\n                ausweichen: !!r.ausweichen,\n                wirksam: verdecktVon === null,\n                verdecktVon: verdecktVon === null ? null : verdecktVon + 1\n            };\n        });\n    }\n\n    function planen(e) {\n        const ein = e || {};\n        const intervall = Math.max(1, zahl(ein.intervall, 5));\n        const fehler    = Math.max(1, zahl(ein.fehler, 3));\n        const erfolge   = Math.max(1, zahl(ein.erfolge, 5));\n        const volumenGB = Math.max(0, zahl(ein.volumenGB, 0));\n        const lastMbit  = Math.max(0.01, zahl(ein.lastMbit, 1));\n        const ziele     = ein.ziele === 'gleich' ? 'gleich' : 'verschieden';\n\n        const umschaltzeit  = intervall * fehler;\n        const rueckschaltzeit = intervall * erfolge;\n\n        \/\/ Volumen in Sekunden: GB in Bit, geteilt durch die Rate.\n        const sekunden = volumenGB > 0 ? (volumenGB * 1073741824 * 8) \/ (lastMbit * 1000000) : 0;\n        const stunden = sekunden \/ 3600;<\/p>\n<p>        const regeln = regelnPruefen(ein.regeln);<\/p>\n<p>        const hinweise = [];\n        if (umschaltzeit > 30)  { hinweise.push('umschaltung_langsam'); }\n        if (umschaltzeit < 10)  { hinweise.push('umschaltung_nervoes'); }\n        if (rueckschaltzeit <= umschaltzeit) { hinweise.push('rueckschaltung_zu_schnell'); }\n        if (ziele === 'gleich') { hinweise.push('gleiche_pruefziele'); }\n        if (volumenGB > 0 && stunden < 24) { hinweise.push('volumen_knapp'); }\n        if (regeln.some(function (r) { return !r.wirksam; })) { hinweise.push('regel_verdeckt'); }\n        if (regeln.some(function (r) { return r.wan === 'wan2' &#038;&#038; !r.ausweichen; })) { hinweise.push('gepinnt_auf_ersatz'); }\n        if (regeln.some(function (r) { return r.dienst === 'voip' &#038;&#038; r.ausweichen; })) { hinweise.push('voip_bricht'); }\n        hinweise.push('sitzungen_brechen');\n\n        return {\n            umschaltzeit: umschaltzeit,\n            rueckschaltzeit: rueckschaltzeit,\n            volumenStunden: stunden,\n            regeln: regeln,\n            hinweise: hinweise\n        };\n    }\n\n    \/\/ --- Pruefpunkt ----------------------------------------------------------\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.MV = { planen: planen, regelnPruefen: regelnPruefen, deckt: deckt, bereiche: BEREICHE, dienste: DIENSTE };\n\n    \/\/ --- Oberflaeche ---------------------------------------------------------\n\n    const regelnBox = document.getElementById('mv-regeln');\n    const btn = document.getElementById('mv-btn');\n    const out = document.getElementById('mv-ausgabe');\n    if (!regelnBox || !btn || !out) { return; }\n\n    function el(tag, stil, text) {\n        const e = document.createElement(tag);\n        if (stil) { e.setAttribute('style', stil); }\n        if (text !== undefined) { e.textContent = text; }\n        return e;\n    }\n    function wert(id) { const e = document.getElementById(id); return e ? e.value : ''; }\n    function komma(n, stellen) {\n        return Number(n).toFixed(stellen === undefined ? 1 : stellen).replace('.', T.dezimal);\n    }\n\n    const FELD = 'width: 100%; padding: 7px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 5px; box-sizing: border-box; font-size: 0.85rem;';\n    const VORGABE = [\n        { aktiv: true,  bereich: 'voip',   dienst: 'alle',  wan: 'wan1', ausweichen: false },\n        { aktiv: true,  bereich: 'lan',    dienst: 'sicherung', wan: 'wan1', ausweichen: true },\n        { aktiv: true,  bereich: 'gaeste', dienst: 'alle',  wan: 'wan2', ausweichen: true },\n        { aktiv: false, bereich: 'alle',   dienst: 'alle',  wan: 'wan1', ausweichen: true }\n    ];\n\n    function auswahl(id, werte, vorbelegt, praefix) {\n        const s = document.createElement('select');\n        s.id = id;\n        s.style.cssText = FELD;\n        werte.forEach(function (w) {\n            const o = document.createElement('option');\n            o.value = w;\n            o.textContent = T[praefix + w];\n            if (w === vorbelegt) { o.selected = true; }\n            s.appendChild(o);\n        });\n        return s;\n    }\n\n    regelnBox.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.78rem;', '#'));\n    regelnBox.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.78rem;', T.spalte_bereich));\n    regelnBox.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.78rem;', T.spalte_dienst));\n    regelnBox.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.78rem;', T.spalte_wan));\n    regelnBox.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.78rem;', T.spalte_ausweichen));\n\n    for (let i = 0; i < ANZAHL_REGELN; i++) {\n        const v = VORGABE[i];\n        const nr = el('label', 'display: flex; align-items: center; gap: 6px; color: var(--text-secondary, #a0a0b0); font-size: 0.85rem;');\n        const an = document.createElement('input');\n        an.type = 'checkbox'; an.id = 'mv-aktiv-' + i; an.checked = v.aktiv;\n        an.style.cssText = 'accent-color: var(--accent, #7ee787);';\n        nr.appendChild(an);\n        nr.appendChild(el('span', '', String(i + 1)));\n        regelnBox.appendChild(nr);\n\n        regelnBox.appendChild(auswahl('mv-bereich-' + i, BEREICHE, v.bereich, 'bereich_'));\n        regelnBox.appendChild(auswahl('mv-dienst-' + i, DIENSTE, v.dienst, 'dienst_'));\n        regelnBox.appendChild(auswahl('mv-wan-' + i, WANS, v.wan, 'wan_'));\n\n        const aus = document.createElement('input');\n        aus.type = 'checkbox'; aus.id = 'mv-aus-' + i; aus.checked = v.ausweichen;\n        aus.style.cssText = 'accent-color: var(--accent, #7ee787); justify-self: center;';\n        regelnBox.appendChild(aus);\n    }\n\n    function regelnLesen() {\n        const liste = [];\n        for (let i = 0; i < ANZAHL_REGELN; i++) {\n            const an = document.getElementById('mv-aktiv-' + i);\n            const aus = document.getElementById('mv-aus-' + i);\n            liste.push({\n                aktiv: an ? an.checked : false,\n                bereich: wert('mv-bereich-' + i),\n                dienst: wert('mv-dienst-' + i),\n                wan: wert('mv-wan-' + i),\n                ausweichen: aus ? aus.checked : false\n            });\n        }\n        return liste;\n    }\n\n    const UEBERSCHRIFT = 'font-family: \\'Nunito Sans\\', sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.92rem; margin: 18px 0 8px;';\n    const ZELLE = 'padding: 5px 14px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    const ZELLE_WERT = 'padding: 5px 14px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace;';\n\n    btn.addEventListener('click', function () {\n        const erg = planen({\n            intervall: wert('mv-intervall'),\n            fehler: wert('mv-fehler'),\n            erfolge: wert('mv-erfolge'),\n            ziele: wert('mv-ziele'),\n            volumenGB: wert('mv-volumen'),\n            lastMbit: wert('mv-last'),\n            regeln: regelnLesen()\n        });\n\n        out.innerHTML = '';\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_zeiten));\n        const g = el('div', 'display: grid; grid-template-columns: auto auto; gap: 0 18px; align-items: baseline;');\n        function zeile(name, w) { g.appendChild(el('div', ZELLE, name)); g.appendChild(el('div', ZELLE_WERT, w)); }\n        zeile(T.zeile_umschalt, komma(erg.umschaltzeit, 0) + ' s');\n        zeile(T.zeile_rueckschalt, komma(erg.rueckschaltzeit, 0) + ' s');\n        zeile(T.zeile_volumen, erg.volumenStunden > 0 ? komma(erg.volumenStunden) + ' ' + T.stunden : '\u2014');\n        out.appendChild(g);<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_regelfolge));\n        if (!erg.regeln.length) {\n            out.appendChild(el('div', ZELLE, T.keine_regeln));\n        } else {\n            const tab = el('div', 'display: grid; grid-template-columns: auto auto auto auto 1fr; gap: 0 16px; align-items: baseline;');\n            [T.spalte_nummer, T.spalte_bereich, T.spalte_dienst, T.spalte_wan, T.spalte_wirkung].forEach(function (k) {\n                tab.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', k));\n            });\n            erg.regeln.forEach(function (r) {\n                const grau = r.wirksam ? '' : ' color: var(--text-secondary, #a0a0b0); text-decoration: line-through;';\n                tab.appendChild(el('div', ZELLE_WERT + grau, String(r.nummer)));\n                tab.appendChild(el('div', ZELLE_WERT + grau, T['bereich_' + r.bereich]));\n                tab.appendChild(el('div', ZELLE_WERT + grau, T['dienst_' + r.dienst]));\n                tab.appendChild(el('div', ZELLE_WERT + grau, T['wan_' + r.wan] + (r.ausweichen ? '' : ' ' + T.fest)));\n                tab.appendChild(el('div', ZELLE + (r.wirksam ? ' color: var(--accent, #7ee787);' : ' color: #ffa94d;'),\n                    r.wirksam ? T.wirkt : T.verdeckt_von.replace('%d', String(r.verdecktVon))));\n            });\n            out.appendChild(tab);\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_hinweise));\n        const liste = el('ul', 'margin: 0 0 0 18px; padding: 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem; line-height: 1.65;');\n        erg.hinweise.forEach(function (h) { liste.appendChild(el('li', '', T['hinweis_' + h])); });\n        out.appendChild(liste);\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Works out how long a failover actually takes, how long a backup data cap lasts, and which policy routes are shadowed by the one above them.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91243,91707],"class_list":["post-10443","page","type-page","status-publish","hentry","tag-networking","tag-unifi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Multi-WAN Failover &amp; Policy Planner - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Multi-WAN Failover &amp; Policy Planner - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Works out how long a failover actually takes, how long a backup data cap lasts, and which policy routes are shadowed by the one above them.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-15T12:49:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/multi-wan-failover-policy-planner\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/multi-wan-failover-policy-planner\\\/\",\"name\":\"Multi-WAN Failover & Policy Planner - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-15T12:39:53+00:00\",\"dateModified\":\"2026-08-15T12:49:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/multi-wan-failover-policy-planner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/multi-wan-failover-policy-planner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/multi-wan-failover-policy-planner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Multi-WAN Failover &#038; Policy Planner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Multi-WAN Failover & Policy Planner - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/","og_locale":"en_US","og_type":"article","og_title":"Multi-WAN Failover & Policy Planner - Lukas Wojcik - Blog","og_description":"Works out how long a failover actually takes, how long a backup data cap lasts, and which policy routes are shadowed by the one above them.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-15T12:49:07+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/","name":"Multi-WAN Failover & Policy Planner - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-15T12:39:53+00:00","dateModified":"2026-08-15T12:49:07+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/multi-wan-failover-policy-planner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Multi-WAN Failover &#038; Policy Planner"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10443"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10443\/revisions"}],"predecessor-version":[{"id":10461,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10443\/revisions\/10461"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10443"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}