Regula de rutare citește marca pachetului, nu conntrack
Rutarea pe bază de politică citește marca pachetului; conntrack păstrează o altă valoare, cu o viață mai lungă. Copierea între ele este un pas pe care cineva trebuie să îl scrie.
Patru verificări separă o regulă de marcă funcțională de o rută funcțională: ce marcă citește regula, dacă pachetul o mai poartă la momentul căutării, dacă o marcă de conexiune a fost restaurată pe pachetele ulterioare și dacă dacă masca și prioritatea regulii potrivite îi permit să se declanșeze. Un contor care crește dovedește doar că o regulă a potrivit ceva. Nu spune nimic despre ce purta pachetul când nucleul i-a ales calea.
Cele două mărci trăiesc în locuri diferite și expiră după calendare diferite.
Două mărci, două vieți
O marcă de pachet aparține unui singur skb, călătorește cu el prin cârlige și este consumată de selectorul fwmark al rutării pe bază de politică. O marcă de conexiune aparține intrării conntrack, persistă de-a lungul pachetelor acelui flux și este invizibilă pentru regula de rutare până când ceva o copiază înapoi. Salvarea unei mărci de pachet în conexiune este o stocare; restaurarea ei este o acțiune separată. Niciuna nu se întâmplă implicit.
De aceea un set de reguli poate părea coerent în timp ce decizia de rutare vede zero: valoarea a fost salvată și nimic nu a restaurat-o.
Copierea între ele este un pas pe care îl scrii tu
Cele două instrucțiuni importante merg în direcții opuse: una salvează marca pachetului în conexiune, cealaltă încarcă marca conexiunii pe pachet. Care îți trebuie depinde de momentul în care are loc clasificarea față de flux. Un proiect poate avea nevoie doar de marca pachetului, iar adăugarea marcării prin conntrack pentru că o soluție ocolitoare le folosea pe amândouă este felul în care o politică simplă dobândește un al doilea mod de eșec.
ct mark set meta mark meta mark set ct mark
Notează direcția lângă regulă, pentru că nu este evidentă din sintaxă la prima vedere. Prima linie salvează, a doua restaurează, și niciuna nu o implică pe cealaltă.
Clasifică înainte de căutarea care o consumă
Traficul generat local și traficul redirecționat dintr-o rețea LAN trec prin cârlige diferite și ajung la deciziile de rutare în momente diferite. O regulă de ieșire care funcționează pentru conexiunile routerului însuși nu dovedește că pachetul unui client redirecționat a fost marcat înainte de căutarea lui. Pune clasificarea acolo unde căutarea care o consumă nu a avut loc încă, și verifică dacă regulile ulterioare din același lanț suprascriu valoarea. Ordinea într-un lanț face parte din configurație, nu este un detaliu de implementare.
Persistența stării conexiunii are nevoie și ea de un plan explicit. Dacă este clasificat doar primul pachet al unui flux, pachetele ulterioare au nevoie de restaurarea mărcii salvate, altfel vor lua calea nemarcată. Aceasta este diferența dintre o marcă ce descrie o conexiune și una ce descrie un pachet.
Pune rutei o întrebare marcată
ip route get 10.77.0.10 mark 0x2
Inspectează regulile și tabela, apoi interoghează ruta cu marca inclusă, plus sursa sau interfața de intrare atunci când acestea afectează politica. O căutare obișnuită fără marcă răspunde la altă întrebare și îți va raporta bucuroasă calea pe care nu o voiai. Verifică masca și prioritatea regulii, precum și valoarea ei, și confirmă că tabela selectată conține o rută utilizabilă.
Un contor care crește este dovada că o regulă a potrivit un pachet. Nu este dovada că pachetul final purta marca dorită în punctul de decizie corect.
Citește marca, direcția, momentul și masca. Patru verificări, și ruta încetează să mai fie un mister.