Un marcaj setat în nftables ar trebui să trimită o clasă de trafic prin tunel, iar traficul continuă să iasă prin interfața fizică. Setul de reguli pare corect în izolare. Ce s-a întâmplat de obicei este că altceva a scris același marcaj, sau că regula de rutare corespunde unei măști pe care noua valoare nu o mai satisface.

Verificarea 1: citiți regula cu care se potrivește nucleul

Începeți cu regula de politică, nu cu firewall-ul. Nucleul consultă regulile în ordinea priorității, iar prima potrivire decide tabela. Citiți valoarea fwmark și masca din regula însăși, apoi confirmați că un pachet cu marcajul pe care l-ați setat chiar corespunde acesteia. O regulă care așteaptă o valoare completă de 32 de biți nu va corespunde unui pachet care poartă doar un singur bit.

Apoi confirmați ce tabelă selectează acea regulă și ce conține tabela. O regulă care indică o tabelă goală produce o căutare eșuată, ceea ce în multe sisteme înseamnă că pachetul cade la regula următoare și iese prin interfața fizică.

Două comenzi lămuresc acest lucru: lista de reguli și căutarea rutei către destinație în acea tabelă.

Verificarea 2: marcaj de pachet sau marcaj de conexiune

nftables poate seta un marcaj pe pachet și un marcaj pe intrarea de urmărire a conexiunilor, iar acestea sunt obiecte diferite. Marcajul de pachet trăiește pe durata trecerii de procesare a pachetului, în timp ce marcajul de conexiune persistă pentru flux și trebuie copiat în mod deliberat. Să setezi unul și să te aștepți la celălalt este o jumătate de remediu obișnuită.

Dacă regula de rutare se bazează pe marcajul de pachet, restaurarea marcajului de conexiune mai târziu pe cale nu face nimic pentru acea decizie, pentru că decizia a fost deja luată.

Decideți care obiect deține semnalul de rutare, apoi setați-l în punctul în care se ia decizia de rutare.

Verificarea 3: cine altcineva scrie acel marcaj

Uneltele proprii ale WireGuard își marchează pachetele UDP pentru ca transportul criptat să nu fie rutat înapoi în tunelul căruia îi aparține. Dacă setul dumneavoastră de reguli atribuie o valoare fără legătură aceluiași câmp, acea excludere dispare și traficul exterior al tunelului încearcă să intre în el însuși. Simptomul este un tunel care se stabilește și apoi nu mai lasă traficul să treacă.

Marcajele sunt folosite și de alte unelte de firewall, de rețeaua containerelor și de rutarea pe politică în alte scopuri, așa că scrierea întregului câmp de către două subsisteme este un conflict chiar și atunci când fiecare este corect în parte.

Enumerați scriitorii înainte de a adăuga încă unul.

Verificarea 4: masca decide ce păstrați

Un marcaj este un câmp de 32 de biți, iar măștile sunt modul în care mai mulți proprietari îl împart. Setarea unei valori cu mască păstrează biții care nu vă aparțin; setarea întregului câmp îi distruge pe ai tuturor celorlalți. Citiți masca în fiecare regulă care atinge câmpul, inclusiv în cele pe care nu le-ați scris.

Documentați alocarea biților lângă setul de reguli.

Altfel următoarea persoană va reutiliza o valoare care are deja un proprietar, iar un conflict aici arată ca o eroare de rutare deși este o eroare de adresare. Documentația nftables despre metadatele pachetelor descrie operațiile de marcaj în sine.

Verificarea 5: verificați cu un flux real, nu cu o căutare

O căutare simplă de rută nu poartă niciun marcaj, așa că poate arăta o cale diferită de pachetul real. Generați traficul care vă interesează și observați contoarele, intrarea de urmărire a conexiunilor și interfața pe care acesta iese în realitate. Testați atât clasa inclusă, cât și clasa exclusă, pentru că un marcaj prea larg strică excluderea în timp ce pare reușit. Dacă clasa inclusă funcționează și clasa exclusă intră și ea în tunel, marcajul este prea larg și nu prea îngust.

Evitați golirea stării conexiunilor pentru a forța o reîmprospătare în timpul unei sesiuni active, deoarece fluxurile noi și cele existente pot lua în mod legitim căi diferite.

Notați marcajul, masca și tabela într-un singur loc, iar următoarea modificare devine verificabilă.

Articole similare