Kako zaključati izlaz na Linuxu da ništa ne iscuri kad VPN padne
Rutiranje i filtriranje su odvojene odluke. Zaključajte izlaznu kuku, pa ograničite izuzetke za endpoint, DNS i administraciju koji su tunelu potrebni za ponovno povezivanje.
Zamislite medijsku kutiju na kućnoj vezi koja bi trebala dosezati internet samo kroz tunel. Kad tunel padne, aplikacija bi trebala stati, umjesto da tiho nastavi preko fizičkog interfejsa. Postizanje takvog ponašanja je problem firewall-a, a ne rutiranja, i razlika je važna jer ruta može biti zamijenjena restartom demona, dok filter ostaje gdje ste ga postavili. Slijedi kako put paketa zapravo odlučuje, a zatim kako ograničiti izuzetke koji tunelu omogućuju ponovno povezivanje.
Lokalni izlaz je druga kuka od prosljeđivanja
Paket koji napušta aplikaciju na kutiji prolazi kroz izlaznu kuku; paket koji kutija rutira za drugi host prolazi kroz prosljeđivanje. Politika koja spominje samo forward ograničava drugo i ostavlja prvo potpuno otvorenim, zato toliko mnogo zaključavanja izlaza izgleda ispravno i ne radi ništa. Uparivanje interfejsa pripada istom pravilu: oifname "tun0" accept propušta saobraćaj koji je već rutiran kroz tunel. Rutiranje i filtriranje također ostaju odvojene odluke, pa ruta prema provajderu može postojati dok filter odbija paket. Na to razdvajanje se oslanjate.
Gateway koji prosljeđuje za druge uređaje treba obje kuke. Zaključavanje samo izlaza štiti samu kutiju i ostavlja svakog klijenta nizvodno slobodnim da iscuri.
Napišite listu izuzetaka od endpointa prema van
Počnite od endpointa tunela: jedna odredišna adresa ili mali odobreni skup, transportni protokol i odredišni port, na primjer udp dport 1194 ip daddr 203.0.113.7 accept. Ako klijent razrješava ime hosta, početna DNS razmjena treba vlastito pravilo ograničeno na resolver i na port 53, a ne blanket dozvolu za adresu tog resolvera. Svaki izuzetak treba navesti razlog zbog kojeg postoji. Dozvola za sav UDP saobraćaj prema VPN portu pokriva mnogo više od jedne autentificirane usluge koju ste imali na umu.
Početno razrješavanje je mjesto gdje brave obično trunu. Skup adresa koji se osvježava po timeru treba definirano ponašanje kad osvježavanje ne uspije, a to ponašanje ne može biti otvaranje veze prema provajderu dok ne uspije. Osvježavajte kroz tunel dok je tunel gore, a inače se vratite na posljednji poznati ispravan endpoint.
Lokalna administracija treba isti tretman. Upravljačka podmreža nije pouzdana samo zato što su joj adrese privatne, a pravilo koje joj vjeruje poziva drugi put oko brave.
Uparivanje interfejsa nije dokaz zdravog tunela
Pravila koja prihvataju sve što izlazi iz tun0 pretpostavljaju da je paket na tom interfejsu došao iz tunela. Imena interfejsa se ponovno stvaraju, a ime nije kriptografski identitet. Peer također može nestati dok interfejs ostaje gore, što pravilo čini vrlo uvjerljivim no-op-om.
Praćenje konekcija dodaje srodnu zamku. Široko pravilo za uspostavljene konekcije ponavlja dozvolu koju je tok dobio ranije, pa sesija započeta prije pada tunela nastavlja raditi poslije. Ograničite prihvatanje po stanju na interfejse i adrese koje zaista mislite, inače ste napravili bravu koja se sama otvara. Ulazna i izlazna pravila odgovaraju na različita pitanja, a očvršćivanje jednog uz ignorisanje drugog ostavlja kutiju dostupnom u smjeru o kojem niste razmišljali.
Šta preživi pad demona
Filter koji instalira skripta koja se izvršava nakon dizanja tunela nestaje zajedno s tunelom, upravo u trenutku kad je bio potreban. Učitajte bravu pri podizanju i pustite demonu da upravlja samo svojim izuzecima.
Brisanje default rute također nije zamjena. Ruta je stanje koje demon posjeduje i prepisuje, a njeno uklanjanje može oduzeti put potreban za ponovno povezivanje. IPv6 treba vlastiti plan, jer otkrivanje susjeda i router advertisements su link servisi koji moraju nastaviti raditi dok je običan saobraćaj blokiran. DHCP pripada istoj kategoriji. Zapišite to kao izuzetke sa svrhom, umjesto da ih kasnije otkrijete kao ispade.
Put oporavka prije primjene
Testirajte bravu onako kako će pasti: podizanje bez tunela, ubijanje demona, promjena endpointa i ponovno povezivanje. Svaki slučaj treba zaustaviti aplikacije i ostaviti kanal za oporavak funkcionalnim. Radite to s konzole, jer je udaljeni shell sesija koja će najvjerovatnije biti zaključana vašim vlastitim pravilom.
Zatim provjerite do čega obična aplikacija još može doći, s bezopasnim odredištem i zahtjevom koji možete provjeriti. Rezultat koji želite je odbijanje na vezi i uspjeh kroz tunel, a ne dvosmislen timeout koji može značiti oboje. Držite skup pravila pod istim vlasnikom kao i ostatak firewall-a, umjesto da zamijenite cijelu tablicu iz shell skripte. Politika u kojoj svaka dozvola može opravdati sebe vrijedi više od dugog skupa pravila koje niko ne može objasniti.