Označiti promet iz jednog cgroupa lakši je 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 iznimci, 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 tko je izuzet. Usmjeravanje odgovara kamo umjesto toga ide označeni paket. Odabir izvora odgovara što ć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 nadređeni usmjerivač ne može vratiti, što stvara istek vremena koji izgleda točno kao blokada vatrozida. Ništa u koraku klasifikacije ne upozorava na to. Ništa ni u koraku usmjeravanja.

Redoslijed je također važan. Klasifikacija se događa kad se paket stvori, usmjeravanje nakon toga, a prevođenje adrese na mjestu izlaza.

Ako ne možete imenovati koja je od tri faze pokvarena, ne otklanjate pogrešku, nego preslažete pravila i nadate se.

Uparite cgroup koji će postojati i sutra

nftables može ispitati pripadnost socketa cgroupu v2, što je doista korisno jer prati proces, a ne odredište. Kvaka je identifikator. Stolna aplikacija pokrenuta iz izbornika često živi u prolaznom scopeu čije se ime mijenja pri sljedećem pokretanju.

nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroup

Kopiranje imena scopea 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 scopea ili unita 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 povijesti sesija.

Budite također precizni oko toga koji mehanizam rabite. Klasifikacija net_cls u cgroupu v1 i uparivanje socketa u cgroupu v2 različite su stvari, i polje sličnog imena u dokumentaciji ne čini ih zamjenjivima.

Lanac tipa route pokreće drugo pretraživanje

Za lokalno stvoreni promet tip lanca odlučuje hoće li se išta dogoditi nakon postavljanja oznake. Izlazni lanac tipa filter može označiti paket i jezgra će nastaviti rabiti rutu koju je već odabrala. Lanac tipa route mehanizam je 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 200

Oznaka 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 nadređeni gateway koji doista odgovara.

Odaberite vrijednost oznake namjerno. WireGuard rabi vlastiti fwmark za vanjski prijevozni promet, a slučajno slijetanje na isti broj može ometati vlastitu iznimku usmjeravanja 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 usmjeravanja je ne prepisuje, zato paket napušta fizičko sučelje s privatnim izvorom koji nadređena mreža ne može vratiti.

Vidljivi simptom je aplikacija koja izgleda kao da šalje podatke i nikad ne primi odgovor, i zapis vatrozida 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 iznimku i ništa drugo. Sveobuhvatno pravilo masquerade popravlja simptom i uništava vašu sposobnost da kažete koji je promet 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.

Što još izmiče iznimci

Razrješavanje imena može dolaziti iz zasebnog resolver procesa u drugom cgroupu, pa klasificiranje socketa 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 pogreške, 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 što se treba dogoditi kad je tunel pao. Iznimka koja tiho postane potpuna zaobilaznica drugačiji je sigurnosni stav od one koja pada zatvoreno, i samo je jedna od njih ono što ste mislili.

Povezani članci