Zaustavite VPN klijente da ne dosežu jedan drugoga u tunelu
Doseći servis je ruta, doseći drugog klijenta je politika. Nađite točku prosljeđivanja koja odlučuje o prometu prema partnerima, zatim dokažite zabranu s klijenta.
Dva klijenta mogu oba otvoriti jump host i ipak nemati posla otvarati jedan drugoga. Dosezanje servisa je odluka o prosljeđivanju, dok je dosezanje partnera odluka o politici, i većina VPN stogova drži to u odvojenim objektima. Ništa što konfigurirate za prvo ne provodi drugo. Zadatak zato nije dodati pravilo, nego pronaći objekt koji odlučuje o prometu prema partnerima na ovom poslužitelju, tamo napisati zabranu i dokazati je s klijenta.
Ruta do zajedničkog servisa nije dopuštenje među partnerima
Oglašavanje klijentske podmreže govori partneru kako staviti paket na žicu prema adresi drugog klijenta. Hoće li taj paket biti dostavljen, rješava se poslije, onim što ga prosljeđuje. Na Linux pristupniku to je lanac FORWARD; unutar demona u korisničkom prostoru to je vlastita tablica sesija tunela. Ruta odgovara na dostupnost i ostavlja dopuštenje netaknutim.
Zato provjera izolacije koja čita samo rute ne dokazuje ništa. /24 se može poslati svakom klijentu, a svaki paket između partnera biva odbačen na kuki za prosljeđivanje. Opasan je obrnut slučaj: nema izričitog pravila, dopuštajući zadani postav i izolacija koja postoji samo zato što je nitko nije ispitao.
Zapišite zahtjev u jednom retku prije nego otvorite terminal. Dođite do bloka servisa i jump hosta, ne dolazite ni do čega drugoga unutar bloka klijenata.
Otkrijte tko zapravo prosljeđuje paket prema partneru
Dva ponašanja poslužitelja izgledaju isto s klijentske strane, a traže različita pravila. Ili jezgra ponovno prosljeđuje paket kroz sučelje tunela, ili ga demon kopira među sesijama i jezgra ga nikad ne vidi.
WireGuard pripada prvoj skupini: nema prekidač među partnerima, pa paket od 10.8.0.4 do 10.8.0.5 dolazi na wg0, udara u kuku za prosljeđivanje i ponovno se usmjerava s wg0 kad AllowedIPs pokriva obje adrese. OpenVPN je druga skupina kad je u konfiguraciji poslužitelja postavljen client-to-client, jer ta direktiva predaje paket među sesijama u korisničkom prostoru. Provjerite učitanu konfiguraciju na tu direktivu prije nego išta napišete. Pravilo jezgre koje nikad ne vidi promet ne razlikuje se od pravila koje radi, i tako raspoređivanje završi posve bez izolacije.
Čitajte djelotvornu konfiguraciju, a ne datoteku za koju pretpostavljate da je učitana, jer distribucijski paketi donose vlastita uključivanja. Ako demon prosljeđuje, zabrana pripada u njegove vlastite kontrole po klijentu, a vatrozid poslužitelja filtrira samo promet upućen poslužitelju. Ako jezgra prosljeđuje, kuka za prosljeđivanje jedino je mjesto koje je važno.
Usmjerena i prevedena raspoređivanja traže još jednu provjeru: izvor koji vidi daleki klijent možda nije onaj koji očekujete. Tada pravilo koje odgovara klijentskoj podmreži ne odgovara ničemu. Zabilježite adresu koja preživi prijevod prije pisanja uvjeta i radije uskladite par sučelja nego nagađajte adrese NAT-a.
Dajte svakoj adresi identitet koji se može opozvati sam
Izolacija se ruši čim dva uređaja dijele jednu vjerodajnicu. Pravilo vezano uz taj identitet ne može ih razdvojiti, a opoziv izgubljenog prijenosnika opoziva cijelu skupinu. Certifikati po uređaju ili ključevi po partneru drže opoziv lokalnim i politiku čitljivom, jer svaka adresa odgovara točno jednoj osobi ili stroju. Gdje dizajn to ne može, recite to u priručniku umjesto da pravilo opisujete kao fino zrnato.
Dodjela adresa mora se slagati s politikom. Rezervirajte blok za servise, blok za klijente i dijelite klijentske adrese iz skupa koji kontrolirate, a ne iz raspona tko prvi dođe. Ako poslužitelj prevodi ili premosćuje, držite tablicu preslikavanja uz konfiguraciju, jer ta tablica treba sljedećem čitatelju da ponovno izvede pravilo.
Smjestite zabranu tamo gdje paket prelazi tunel
Na pristupniku koji prosljeđuje WireGuard promet, slučaj pokrivaju dva pravila: dopustite blok servisa, zatim odbacite ostatak bloka klijenata. Par sučelja važan je koliko i adrese, jer podudaranje samo po odredištu hvata i promet koji dolazi iz LAN-a. Učitajte ih tim redom da se dopuštenje ocijeni prvo.
Uz nftables par ulazi u postojeću tablicu inet filter, prvo dopuštenje, zatim odbacivanje. Oba podudaranja prikvače par sučelja kao i adrese.
nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.2.0/24 accept
nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.0.0/24 drop
Pročitajte lanac natrag nakon učitavanja umjesto da vjerujete izlaznom statusu i potvrdite da oba pravila stoje u redoslijedu koji ste namjeravali. Dodajte odgovarajuća pravila ip6 za skup IPv6, inače je par v4 samo ukras na dvostrukom stogu tunela. Ako poslužitelj već ima dopuštajuću politiku prosljeđivanja, dodajte odbacivanje umjesto da lanac zamijenite u cijelosti.
Kad je client-to-client uključen na OpenVPN, ova pravila prosljeđivanja nikad ne pogađaju promet prema partnerima i zabrana mora živjeti u vlastitim kontrolama demona. Zadržite pravila jezgre za promet upućen poslužitelju, ali ne računajte ih kao kontrolu izolacije.
Dokažite zabranu s klijenta, a ne s poslužitelja
Testiranje s pristupnika ne dokazuje ništa, jer lokalno stvoren promet ide izlaznim putem i nikad ne prelazi kuku za prosljeđivanje. Upotrijebite dva stvarna klijenta: jedan koji treba dosegnuti servis, jedan kojemu treba biti odbijen. Prvo pokrenite slučaj dopuštenja, da se pokvaren tunel ne zamijeni s politikom koja radi.
S dopuštenog klijenta potvrdite da servis odgovara na svom portu. S istog klijenta pokušajte adresu partnera i očekujte tiho odbacivanje, a ne odbijenicu:
ping -c 3 -W 2 10.8.0.5
nc -z -w 2 10.8.0.5 22
nft list chain inet filter forward
iptables -vnL FORWARD
ping -6 -c 3 -W 2 fd00:8::5
Odbačen paket i partner izvan mreže izgledaju jednako kao istek vremena, zato provjerite brojače prije nego išta zaključite. Potvrdite da brojač pravila odbacivanja raste dok je partner dokazivo dostupan. Ponovite preko IPv6, gdje nedostajuće pravilo ip6 pušta zabranu v4 da izgleda djelotvorno. Zapišite prihvaćene i odbijene rezultate u priručnik s datumom, jer će sljedeća migracija ponovno izvesti pravilo.