Kako zaključati izlaz na Linuxu da ništa ne iscuri kad VPN padne
Usmeravanje 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 trebalo da dosegne internet samo kroz tunel. Kad tunel padne, aplikacija bi trebalo da stane, umesto da tiho nastavi preko fizičkog interfejsa. Postizanje takvog ponašanja je problem firewall-a, a ne usmeravanja, i razlika je važna jer se ruta može zameniti restartom demona, dok filter ostaje gde ste ga postavili. Sledi kako put paketa zapravo odlučuje, a zatim kako ograničiti izuzetke koji tunelu omogućuju ponovno povezivanje.
Lokalni izlaz je druga kuka od prosleđivanja
Paket koji napušta aplikaciju na kutiji prolazi kroz izlaznu kuku; paket koji kutija usmerava za drugi host prolazi kroz prosleđivanje. Politika koja pominje 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ć usmeren kroz tunel. Usmeravanje i filtriranje takođe ostaju odvojene odluke, pa ruta ka provajderu može postojati dok filter odbija paket. Na to razdvajanje se oslanjate.
Gateway koji prosleđuje za druge uređaje treba obe 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 primer udp dport 1194 ip daddr 203.0.113.7 accept. Ako klijent razrešava ime hosta, početna DNS razmena treba sopstveno pravilo ograničeno na resolver i na port 53, a ne blanket dozvolu za adresu tog resolvera. Svaki izuzetak treba da navede razlog zbog kojeg postoji. Dozvola za sav UDP saobraćaj prema VPN portu pokriva mnogo više od jedne autentifikovane usluge koju ste imali na umu.
Početno razrešavanje je mesto gde brave obično trunu. Skup adresa koji se osvežava po timeru treba definisano ponašanje kad osvežavanje ne uspe, a to ponašanje ne može biti otvaranje veze prema provajderu dok ne uspe. Osvežavajte kroz tunel dok je tunel gore, a inače se vratite na poslednji 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 veruje 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 ponovo stvaraju, a ime nije kriptografski identitet. Peer takođe može nestati dok interfejs ostaje gore, što pravilo čini vrlo ubedljivim 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 pre pada tunela nastavlja da radi posle. 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 smeru 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 podrazumevane rute takođe nije zamena. Ruta je stanje koje demon poseduje i prepisuje, a njeno uklanjanje može oduzeti put potreban za ponovno povezivanje. IPv6 treba sopstveni plan, jer otkrivanje suseda i router advertisements su link servisi koji moraju nastaviti da rade dok je običan saobraćaj blokiran. DHCP pripada istoj kategoriji. Zapišite to kao izuzetke sa svrhom, umesto da ih kasnije otkrijete kao ispade.
Put oporavka pre primene
Testirajte bravu onako kako će pasti: podizanje bez tunela, ubijanje demona, promena 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 najverovatnije biti zaključana vašim sopstvenim pravilom.
Zatim proverite do čega obična aplikacija još može doći, s bezopasnim odredištem i zahtevom koji možete proveriti. Rezultat koji želite je odbijanje na vezi i uspeh kroz tunel, a ne dvosmislen timeout koji može značiti oboje. Držite skup pravila pod istim vlasnikom kao i ostatak firewall-a, umesto da zamenite celu tabelu iz shell skripte. Politika u kojoj svaka dozvola može opravdati sebe vredi više od dugog skupa pravila koje niko ne može objasniti.