nftables cgroup zaobilaznica također traži ispravku izvorišne adrese
Označavanje jednog cgroup-a šalje ga u drugu tablicu, a socket zadržava adresu koju je već imao. Klasifikacija, rutiranje i prevođenje kao tri odvojena koraka.
Označavanje saobraćaja iz jednog cgroup-a je lakši dio. Tri odvojene odluke moraju se poklopiti prije nego jedna aplikacija izađe kroz fizičko sučelje dok sve ostalo ostaje u tunelu: koji socket pripada izuzetku, koje pretraživanje rute oznaka pokreće i koju izvorišnu adresu paket nosi kad izlazi. Većina neuspjelih pokušaja prvi pogodi, drugi napola pogodi, a treći nikad ne pogleda.
Tri odluke, ne jedna
Klasifikacija odgovara ko je izuzet. Rutiranje odgovara kamo umjesto toga ide označeni paket. Odabir izvora odgovara šta će udaljena strana vidjeti i kamo se odgovor treba vratiti.
To pada neovisno. Paket može biti klasificiran, preusmjeren na fizičko sučelje i ipak nositi privatnu adresu koju nijedan upstream ruter ne može vratiti, što stvara timeout koji izgleda točno kao blokada firewall-a. Ništa u koraku klasifikacije ne upozorava na to. Ništa ni u koraku rutiranja.
Redoslijed je također važan. Klasifikacija se događa kad se paket generira, rutiranje nakon toga, a prevođenje adrese na mjestu izlaza.
Ako ne možete imenovati koja je od tri faze pokvarena, ne debugirate, nego preslažete pravila i nadate se.
Uparite cgroup koji će postojati i sutra
nftables može testirati pripadnost socket-a cgroup v2, što je zaista korisno jer prati proces, a ne odredište. Kvaka je identifikator. Desktop aplikacija pokrenuta iz izbornika često živi u prolaznom scope-u čije se ime mijenja pri sljedećem pokretanju.
nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroupKopiranje imena scope-a iz jedne sesije i tvrdo kodiranje daje pravilo koje radi danas i sutra tiho prestaje odgovarati. Umjesto toga smjestite aplikaciju u namjerno stabilan kontekst izvršavanja, poput namjenskog scope-a ili unit-a koji kontrolirate, i uparite to. Tada pravilo preživljava restarte i ažuriranja paketa. Ono postaje i nešto o čemu kolega može razmišljati bez vaše historije sesija.
Također budite precizni oko toga koji mehanizam koristite. Klasifikacija net_cls u cgroup v1 i uparivanje socket-a u cgroup v2 su različite stvari, i polje sličnog imena u dokumentaciji ne čini ih zamjenjivima.
Lanac tipa route pokreće drugo pretraživanje
Za lokalno generirani saobraćaj tip lanca odlučuje hoće li se išta dogoditi nakon postavljanja oznake. Izlazni lanac tipa filter može označiti paket i kernel će nastaviti koristiti rutu koju je već odabrao. Lanac tipa route je mehanizam koji traži novo pretraživanje.
table inet bypass {
chain mark {
type route hook output priority mangle; policy accept;
socket cgroupv2 level 2 "app.slice" meta mark set 0x1 comment "app bypass"
}
}
ip rule add fwmark 0x1 lookup 200
ip route add default via 203.0.113.1 dev wlan0 table 200Oznaka zatim treba pravilo politike koje je šalje u tablicu, a ta tablica mora biti potpuna: zadana ruta, sva lokalna odredišta koja aplikacija još treba i upstream gateway koji zaista odgovara.
Odaberite vrijednost oznake namjerno. WireGuard koristi vlastiti fwmark za vanjski transportni saobraćaj, a slučajno slijetanje na isti broj može ometati vlastiti izuzetak rutiranja tunela na način koji je bolan za dijagnostiku.
Izvorišna adresa ne slijedi rutu
Socket koji je već odabrao izvorišnu adresu za put kroz tunel zadržava tu adresu i nakon preusmjeravanja. Ništa u promjeni rutiranja je ne prepisuje, zato paket napušta fizičko sučelje s privatnim izvorom koji upstream mreža ne može vratiti.
Vidljivi simptom je aplikacija koja izgleda kao da šalje podatke i nikad ne primi odgovor, i firewall log koji ne pokazuje ništa jer se paket nikad nije vratio.
Uska ispravka je pravilo prevođenja izvora ograničeno na oznaku te aplikacije i njezino stvarno izlazno sučelje, integrirano s postojećim NAT-om umjesto da ga zamijeni:
table inet bypass {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
meta mark 0x1 oifname "wlan0" masquerade
}
}Prevedite izuzetak i ništa drugo. Sveobuhvatno masquerade pravilo popravlja simptom i uništava vašu sposobnost da kažete koji je saobraćaj kojim putem išao. Uparite po oznaci, stvarnom izlaznom sučelju i, ako možete, vlastitoj adresi aplikacije. Široka pravila lako je napisati i gotovo nemoguće kasnije revidirati.
Šta još izmiče izuzetku
Razrješavanje imena može dolaziti iz zasebnog resolver procesa u drugom cgroup-u, pa klasificiranje socket-a preglednika ne klasificira njegove upite. Ako upiti resolvera ostanu u tunelu dok veza izlazi izvan njega, split-horizon odgovori mogu se ne slagati s putem. To neslaganje stvara kvarove koji izgledaju kao DNS bugovi, a nisu.
Podređeni procesi nasljeđuju cgroup u većini postavki, ali helper koji se premjesti u vlastiti scope ne. Provjerite umjesto da pretpostavljate, posebno za sve što se ponovno izvršava.
Naposljetku, odlučite šta treba da se dogodi kad je tunel pao. Izuzetak koji tiho postane potpuna zaobilaznica drugačiji je sigurnosni stav od onog koji pada zatvoreno, i samo jedan od njih je ono što ste mislili.