Kako zaključati izlaz na Linuxu da ništa ne iscuri kad VPN padne
Usmjeravanje i filtriranje odvojene su odluke. Zaključajte izlaznu kuku, pa ograničite iznimke za endpoint, DNS i administraciju koje su tunelu potrebne 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 sučelja. Postizanje takvog ponašanja problem je firewall-a, a ne usmjeravanja, i razlika je važna jer se ruta može zamijeniti restartom demona, dok filtar ostaje gdje ste ga postavili. Slijedi kako put paketa zapravo odlučuje, a zatim kako ograničiti iznimke koje 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 usmjerava za drugi host prolazi kroz prosljeđivanje. Politika koja spominje samo forward ograničava drugo i ostavlja prvo posve otvorenim, zato toliko mnogo zaključavanja izlaza izgleda ispravno i ne radi ništa. Uparivanje sučelja pripada istom pravilu: oifname "tun0" accept propušta promet koji je već usmjeren kroz tunel. Usmjeravanje i filtriranje također ostaju odvojene odluke, pa ruta prema pružatelju može postojati dok filtar odbija paket. Na to se razdvajanje 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 popis iznimaka 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. Svaka iznimka treba navesti razlog zbog kojeg postoji. Dozvola za sav UDP promet prema VPN portu pokriva mnogo više od jedne autentificirane usluge koju ste imali na umu.
Početno razrješavanje mjesto je 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 pružatelju 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 sučelja nije dokaz zdravog tunela
Pravila koja prihvaćaju sve što izlazi iz tun0 pretpostavljaju da je paket na tom sučelju došao iz tunela. Imena sučelja se ponovno stvaraju, a ime nije kriptografski identitet. Peer također može nestati dok sučelje ostaje gore, što pravilo čini vrlo uvjerljivim no-op-om.
Praćenje veza dodaje srodnu zamku. Široko pravilo za uspostavljene veze ponavlja dozvolu koju je tok dobio ranije, pa sesija započeta prije pada tunela nastavlja raditi poslije. Ograničite prihvaćanje po stanju na sučelja 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 ignoriranje drugog ostavlja kutiju dostupnom u smjeru o kojem niste razmišljali.
Što preživi pad demona
Filtar 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 iznimkama.
Brisanje zadane 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 promet blokiran. DHCP pripada istoj kategoriji. Zapišite to kao iznimke 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 najvjerojatnije 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 nitko ne može objasniti.