Rutningsregeln läser paketmarkeringen, inte conntrack
Policy-routing läser paketmarkeringen; conntrack lagrar ett annat värde med längre livstid. Att kopiera mellan dem är ett steg som någon måste skriva.
Fyra kontroller skiljer en fungerande markeringsregel från en fungerande rutt: vilken markering regeln läser, om paketet fortfarande bär den vid uppslaget, om en anslutningsmarkering återställdes på senare paket, och om om den matchande regelns mask och prioritet tillåter den att utlösas. En räknare som ökar bevisar bara att någon regel matchade något. Den säger inget om vad paketet bar när kärnan valde dess väg.
De två markeringarna lever på olika ställen och löper ut enligt olika scheman.
Två markeringar, två livstider
En paketmarkering tillhör en enda skb, färdas med den genom krokarna och förbrukas av policy-routingens fwmark-väljare. En anslutningsmarkering tillhör conntrack-posten, består genom det flödets paket och är osynlig för rutningsregeln tills något kopierar den tillbaka. Att spara en paketmarkering i anslutningen är en lagring; att återställa den är en separat åtgärd. Ingen av dem sker implicit.
Därför kan en regeluppsättning se konsekvent ut medan rutningsbeslutet ser noll: värdet sparades, och ingenting återställde det.
Att kopiera mellan dem är ett steg du skriver
De två viktiga satserna går i motsatta riktningar: den ena sparar paketets markering i anslutningen, den andra laddar anslutningens markering på paketet. Vilken du behöver beror på när klassificeringen sker i förhållande till flödet. En design kan bara behöva paketmarkeringen, och att lägga till conntrack-markering eftersom någon kringgående lösning använde båda är hur en enkel policy får ett andra felläge.
ct mark set meta mark meta mark set ct mark
Skriv ned riktningen bredvid regeln, för den är inte uppenbar från syntaxen vid första anblicken. Den första raden sparar, den andra återställer, och ingen av dem förutsätter den andra.
Klassificera före uppslaget som förbrukar det
Lokalt genererad trafik och trafik vidarebefordrad från ett LAN passerar olika krokar och når rutningsbeslut vid olika tidpunkter. En utregel som fungerar för routerns egna anslutningar bevisar inte att en vidarebefordrad klients paket markerades före sitt uppslag. Placera klassificeringen där uppslaget som förbrukar den ännu inte har skett, och kontrollera om senare regler i samma kedja skriver över värdet. Ordningen inom en kedja är en del av konfigurationen, inte en implementeringsdetalj.
Även beständigheten hos anslutningstillståndet kräver en tydlig plan. Om bara det första paketet i ett flöde klassificeras behöver senare paket få den sparade markeringen återställd, annars tar de den omarkerade vägen. Det är skillnaden mellan en markering som beskriver en anslutning och en som beskriver ett paket.
Ställ en markerad fråga till rutten
ip route get 10.77.0.10 mark 0x2
Granska reglerna och tabellen och fråga sedan rutten med markeringen inkluderad, plus källan eller det inkommande gränssnittet när de påverkar policyn. Ett vanligt omarkerat uppslag besvarar en annan fråga och rapporterar gärna den väg du inte ville ha. Kontrollera regelns mask och prioritet liksom dess värde, och bekräfta att den valda tabellen innehåller en användbar rutt.
En räknare som ökar är bevis för att någon regel matchade något paket. Det är inte bevis för att det slutliga paketet bar den avsedda markeringen vid rätt beslutspunkt.
Läs markeringen, riktningen, tidpunkten och masken. Fyra kontroller, och rutten slutar vara ett mysterium.