{"id":10445,"date":"2026-08-15T14:39:56","date_gmt":"2026-08-15T12:39:56","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/multi-wan-failover-policy-planner\/"},"modified":"2026-08-15T14:49:10","modified_gmt":"2026-08-15T12:49:10","slug":"multi-wan-failover-policy-planner","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/multi-wan-failover-policy-planner\/","title":{"rendered":"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN"},"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;\">Drugie \u0142\u0105cze kupuje si\u0119 na dzie\u0144, w kt\u00f3rym padnie pierwsze, a tego dnia o pomocy decyduj\u0105 dwie rzeczy: ile trwa prze\u0142\u0105czenie i czy regu\u0142y pod spodem nadal wskazuj\u0105 tam, gdzie mia\u0142y. Jedno i drugie to rachunek, i jedno i drugie sprawdza si\u0119 tutaj \u0142atwiej ni\u017c o trzeciej nad ranem.<\/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;\">Sprawdzanie co (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;\">Niepowodzenia do prze\u0142\u0105czenia<\/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;\">Sukcesy do powrotu<\/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;\">Cele sprawdzania<\/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>r\u00f3\u017cne dla ka\u017cdego \u0142\u0105cza<\/option><option value=\"gleich\">te same na obu<\/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;\">Limit danych \u0142\u0105cza zapasowego (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;\">Typowe obci\u0105\u017cenie (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;\">Regu\u0142y routingu, po kolei<\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 10px;\">Wygrywa pierwsza pasuj\u0105ca regu\u0142a, dok\u0142adnie jak na konsoli. Regu\u0142a obejmuj\u0105ca wszystko czyni ka\u017cd\u0105 w\u0119\u017csz\u0105 pod ni\u0105 nieosi\u0105galn\u0105.<\/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;\">Zaplanuj prze\u0142\u0105czanie<\/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\":\"Drugie \u0142\u0105cze kupuje si\u0119 na dzie\u0144, w kt\u00f3rym padnie pierwsze, a tego dnia o pomocy decyduj\u0105 dwie rzeczy: ile trwa prze\u0142\u0105czenie i czy regu\u0142y pod spodem nadal wskazuj\u0105 tam, gdzie mia\u0142y. Jedno i drugie to rachunek, i jedno i drugie sprawdza si\u0119 tutaj \u0142atwiej ni\u017c o trzeciej nad ranem.\",\"label_intervall\":\"Sprawdzanie co (s)\",\"label_fehler\":\"Niepowodzenia do prze\u0142\u0105czenia\",\"label_erfolge\":\"Sukcesy do powrotu\",\"label_ziele\":\"Cele sprawdzania\",\"ziele_verschieden\":\"r\u00f3\u017cne dla ka\u017cdego \u0142\u0105cza\",\"ziele_gleich\":\"te same na obu\",\"label_volumen\":\"Limit danych \u0142\u0105cza zapasowego (GB)\",\"label_last\":\"Typowe obci\u0105\u017cenie (Mbit\\\/s)\",\"h_regeln\":\"Regu\u0142y routingu, po kolei\",\"regeln_hinweis\":\"Wygrywa pierwsza pasuj\u0105ca regu\u0142a, dok\u0142adnie jak na konsoli. Regu\u0142a obejmuj\u0105ca wszystko czyni ka\u017cd\u0105 w\u0119\u017csz\u0105 pod ni\u0105 nieosi\u0105galn\u0105.\",\"spalte_bereich\":\"\u0179r\u00f3d\u0142o\",\"spalte_dienst\":\"Ruch\",\"spalte_wan\":\"\u0141\u0105cze\",\"spalte_ausweichen\":\"mo\u017ce prze\u0142\u0105czy\u0107\",\"bereich_alle\":\"wszystko\",\"bereich_lan\":\"LAN\",\"bereich_iot\":\"IoT\",\"bereich_gaeste\":\"go\u015bcie\",\"bereich_voip\":\"sie\u0107 VoIP\",\"dienst_alle\":\"ca\u0142y ruch\",\"dienst_voip\":\"VoIP\",\"dienst_video\":\"wideo\",\"dienst_sicherung\":\"kopia zapasowa\",\"wan_wan1\":\"WAN1\",\"wan_wan2\":\"WAN2\",\"fest\":\"(na sta\u0142e)\",\"knopf\":\"Zaplanuj prze\u0142\u0105czanie\",\"h_zeiten\":\"Czasy\",\"zeile_umschalt\":\"Czas do prze\u0142\u0105czenia\",\"zeile_rueckschalt\":\"Czas do powrotu\",\"zeile_volumen\":\"Limit zapasowy starcza na\",\"stunden\":\"godzin\",\"h_regelfolge\":\"Kt\u00f3re regu\u0142y faktycznie dzia\u0142aj\u0105\",\"spalte_nummer\":\"#\",\"spalte_wirkung\":\"Skutek\",\"wirkt\":\"dzia\u0142a\",\"verdeckt_von\":\"nieosi\u0105galna - regu\u0142a %d ju\u017c pasuje\",\"keine_regeln\":\"\u017badna regu\u0142a nie jest aktywna, wi\u0119c ca\u0142y ruch idzie tras\u0105 domy\u015bln\u0105.\",\"h_hinweise\":\"Co oznacza ta konfiguracja\",\"hinweis_sitzungen_brechen\":\"Prze\u0142\u0105czenie zmienia adres \u017ar\u00f3d\u0142owy, wi\u0119c ka\u017cde otwarte po\u0142\u0105czenie ginie razem z nim. Pobierania zaczynaj\u0105 si\u0119 od nowa, sesje SSH wisz\u0105, a trwaj\u0105ca rozmowa si\u0119 urywa - prze\u0142\u0105czenie przywraca \u0142\u0105cze, a nie po\u0142\u0105czenie.\",\"hinweis_umschaltung_langsam\":\"Ponad trzydzie\u015bci sekund do prze\u0142\u0105czenia. Dla wszystkiego, na co czeka cz\u0142owiek, jest to nie do odr\u00f3\u017cnienia od awarii.\",\"hinweis_umschaltung_nervoes\":\"Poni\u017cej dziesi\u0119ciu sekund \u0142\u0105cze prze\u0142\u0105cza si\u0119 ju\u017c przy kr\u00f3tkiej stracie pakiet\u00f3w, kt\u00f3ra sama by min\u0119\u0142a - a ka\u017cde prze\u0142\u0105czenie kosztuje wszystkie otwarte po\u0142\u0105czenia.\",\"hinweis_rueckschaltung_zu_schnell\":\"Powr\u00f3t nie jest wolniejszy ni\u017c prze\u0142\u0105czenie. Trzepocz\u0105ce \u0142\u0105cze porywa wtedy ze sob\u0105 ka\u017cde po\u0142\u0105czenie, dwa razy na trzepni\u0119cie.\",\"hinweis_gleiche_pruefziele\":\"Ten sam cel sprawdzania na obu \u0142\u0105czach oznacza, \u017ce awaria tego celu wygl\u0105da jak awaria obu linii. Dwa r\u00f3\u017cne cele, najlepiej w r\u00f3\u017cnych sieciach.\",\"hinweis_volumen_knapp\":\"Limit zapasowy nie starcza przy tym obci\u0105\u017ceniu na dob\u0119. Prze\u0142\u0105czenie w trakcie aktualizacji systemu albo kopii do chmury opr\u00f3\u017cni go, zanim ktokolwiek zauwa\u017cy brak \u0142\u0105cza g\u0142\u00f3wnego.\",\"hinweis_regel_verdeckt\":\"Co najmniej jedna regu\u0142a nigdy nie zadzia\u0142a, bo nad ni\u0105 stoi szersza. W\u0119\u017csze przed szerszymi.\",\"hinweis_gepinnt_auf_ersatz\":\"Regu\u0142a przypina ruch na sta\u0142e do WAN2, nie pozwalaj\u0105c na prze\u0142\u0105czenie. Gdy WAN2 padnie, ten ruch padnie razem z nim - \u0142\u0105cze g\u0142\u00f3wne go nie przejmie.\",\"hinweis_voip_bricht\":\"VoIP mo\u017ce si\u0119 prze\u0142\u0105cza\u0107. \u0141\u0105cze wraca, rozmowa nie; trwaj\u0105ce po\u0142\u0105czenie ko\u0144czy si\u0119 w chwili prze\u0142\u0105czenia.\",\"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>Wylicza, ile naprawd\u0119 trwa prze\u0142\u0105czenie awaryjne, na jak d\u0142ugo starcza limit danych \u0142\u0105cza zapasowego i kt\u00f3re regu\u0142y routingu przes\u0142ania ta stoj\u0105ca nad nimi.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92310,92328],"class_list":["post-10445","page","type-page","status-publish","hentry","tag-networking-pl","tag-unifi-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN - 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\/pl\/narzedzia\/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=\"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Wylicza, ile naprawd\u0119 trwa prze\u0142\u0105czenie awaryjne, na jak d\u0142ugo starcza limit danych \u0142\u0105cza zapasowego i kt\u00f3re regu\u0142y routingu przes\u0142ania ta stoj\u0105ca nad nimi.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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:10+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\\\/pl\\\/narzedzia\\\/multi-wan-failover-policy-planner\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/multi-wan-failover-policy-planner\\\/\",\"name\":\"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-15T12:39:56+00:00\",\"dateModified\":\"2026-08-15T12:49:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/multi-wan-failover-policy-planner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/multi-wan-failover-policy-planner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/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\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN\"}]},{\"@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":"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN - 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\/pl\/narzedzia\/multi-wan-failover-policy-planner\/","og_locale":"en_US","og_type":"article","og_title":"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN - Lukas Wojcik - Blog","og_description":"Wylicza, ile naprawd\u0119 trwa prze\u0142\u0105czenie awaryjne, na jak d\u0142ugo starcza limit danych \u0142\u0105cza zapasowego i kt\u00f3re regu\u0142y routingu przes\u0142ania ta stoj\u0105ca nad nimi.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/multi-wan-failover-policy-planner\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-15T12:49:10+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\/pl\/narzedzia\/multi-wan-failover-policy-planner\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/multi-wan-failover-policy-planner\/","name":"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-15T12:39:56+00:00","dateModified":"2026-08-15T12:49:10+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/multi-wan-failover-policy-planner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/multi-wan-failover-policy-planner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Planer prze\u0142\u0105czania awaryjnego i regu\u0142 Multi-WAN"}]},{"@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\/10445","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=10445"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10445\/revisions"}],"predecessor-version":[{"id":10463,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10445\/revisions\/10463"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10445"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}