Două ieșiri VPN sănătoase, o încărcare lungă deja în curs și cerința ca următoarea conexiune să folosească celălalt tunel. Există două moduri de a îndeplini asta, și doar unul este sigur pe un gateway activ. Schimbarea rutei implicite mută fiecare pachet, inclusiv pe cele care aparțin încărcării. O golire planificată schimbă alegerea pentru conexiunile noi și lasă fluxurile urmărite pe calea pe care au început.

Două moduri de a schimba o ieșire

Schimbarea rutei este o singură comandă și poate fi anulată în câteva secunde, de aceea este folosită în timpul incidentelor. Este și nediferențiată: pachetele încărcării existente ies brusc printr-un alt tunel, cu altă adresă publică de sursă și stare de traducere separată.

Dacă capătul îndepărtat urmărește fluxurile după adresa de sursă, încărcarea poate pur și simplu să nu mai fie recunoscută. Golirea evită asta luând decizia o dată pe conexiune și stocând-o, astfel încât încărcarea veche își păstrează ieșirea până când se termină. Aceasta este toată valoarea exercițiului: capătul îndepărtat nu vede nicio schimbare pe care ar trebui să o interpreteze. Continuă să primească pachete care corespund conexiunii pe care o știe deja.

Costul este complexitatea: două tabele de rutare, un clasificator care rulează pe cârligul potrivit și marcaje care trebuie coordonate cu tot restul de pe mașină care le folosește.

Dați fiecărei ieșiri propriul tabel

Rezervați un tabel de rutare pentru fiecare ieșire și valori de marcaj sau biți distincți pentru cele două alegeri. Fiecare tabel are nevoie de rutele potrivite rolului său, nu doar de un nume, și are nevoie de un rezultat de eșec deliberat pentru cazul lipsă. Un tabel gol care cade în tăcere în tabelul principal — așa iese traficul printr-o ieșire pe care nimeni nu a ales-o.

ip rule add fwmark 0x10/0x10 table 101
ip rule add fwmark 0x20/0x20 table 102
ip route add default via 192.0.2.1 dev wg-a table 101
ip route add default via 198.51.100.1 dev wg-b table 102

Adăugați o rută blackhole la sfârșitul fiecărui tabel, astfel încât o căutare fără potrivire să eșueze zgomotos în loc să evadeze către un implicit pe care nu l-ați ales.

Alegeți o dată, la primul pachet

Clasificați după ce există urmărirea conexiunilor și înainte de căutarea de rută care contează. Pentru o conexiune LAN nouă și neclasificată, alegeți ieșirea și stocați-o în starea conexiunii. La pachetele ulterioare, restabiliți valoarea stocată în marcajul de pachet pe care îl citește rutarea pe politică.

Partea subtilă este ce înseamnă nou. Conntrack poate raporta încă NEW pentru pachetele timpurii și retransmisii înainte de a vedea un răspuns, așa că un clasificator care se bazează doar pe acea stare poate suprascrie o alegere pe care a făcut-o deja. Verificați că nu este stocată nicio ieșire pentru conexiune înainte de a atribui una.

nftables ține marcajele de pachet și de conexiune separate, iar ghidul de metainformare documentează copierea explicită dintre ele. Un marcaj de conexiune nu devine singur marcajul de pachet cu care se potrivește regula dumneavoastră, iar acesta este cel mai frecvent motiv pentru care un clasificator scris cu grijă nu are niciun efect.

Limitați restaurarea la direcția și traficul pe care le aveți în minte. Aplicarea unui marcaj de ieșire internet pe pachetele care se întorc poate trimite răspunsurile spre ieșire în loc de LAN, iar simptomul este o conexiune unidirecțională care arată ca o problemă de firewall. Citiți calea răspunsului înainte de a atinge o regulă de firewall, pentru că pachetul este rutat, doar că nu înapoi la expeditor.

Patru faze ale unei goliri

  1. Pregătiți B fără a atinge A: rutare, forwardare, autorizare, NAT și calea de întoarcere. Instalați tabelul și politica de selecție prin proprietarul de configurație existent al gateway-ului.

  2. Comutați clasificatorul astfel încât conexiunile noi și neclasificate să aleagă B, păstrând alegerile stocate. O tranzacție nftables atomică evită o fereastră în care starea veche trebuie curățată.

  3. Lăsați A pornit cât timp fluxurile sale se termină. Interfața, tabelul, ieșirea îndepărtată și mapările NAT fac încă parte din acele fluxuri, iar editarea unei reguli NAT nu reconstruiește legăturile care există deja.

  4. Retrageți A când condiția de golire este îndeplinită, judecată după starea conexiunilor și comportamentul aplicației, nu după un singur interval liniștit.

Ce nu poate promite o golire

O cerere de browser nu este o conexiune de transport nouă; gruparea continuă să trimită cereri prin cea veche. Invers, un flux UDP poate îmbătrâni din conntrack și un pachet ulterior este clasificat din nou. Golirea urmează fluxurile urmărite, nu ideea unei aplicații despre o sesiune.

Dacă A eșuează înainte ca fluxurile sale să se termine, marcajul stocat nu le salvează. Se reconectează prin B sau nu se reconectează deloc. O golire planificată cumpără continuitate cât timp calea originală este sănătoasă; nu este replicare de stare între ieșiri independente.

Verificați ambele jumătăți

Porniți o conexiune permisă de lungă durată înainte de schimbare și una cu adevărat nouă după. Confirmați ce tunel folosește fiecare și ce adresă publică de sursă vede capătul îndepărtat, apoi verificați că traficul de întoarcere revine.

Nu goliți tabelul conntrack pentru a face noua alegere să apară. Asta distruge exact starea pe care golirea ar trebui să o păstreze și transformă o migrare controlată într-o întrerupere cu un test de aspect curat.

Articole similare