Postavite uslugu na prijenosno računalo iza NAT-a na razini operatera, usmjerite to računalo na VPS preko VPN-a i nitko izvana ne može do njega doći. Dodate pravilo odredišnog NAT-a na VPS-u i dobijete nešto gore od tišine: veze se otvaraju, a zatim zapinju. Odgovor ne nedostaje, on izlazi klijentovom vlastitom zadanom rutom, što znači da ga poslužitelj nikad ne vidi. Prođite ovih pet provjera redom i zaustavite se na prvoj koja ne drži.

Potvrdite da će poslužitelj uopće prosljeđivati

Označite ovaj okvir prije nego napišete ijedan prijevod. Pravilo DNAT-a za paket koji jezgra odbija proslijediti prihvaća parser pravila, a zatim ga odbacuje put prosljeđivanja, što daje istek koji izgleda kao problem s vatrozidom.

sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1

Postavljanje u pokrenutoj jezgri nije isto kao postavljanje kroz ponovno pokretanje. Zapišite net.ipv4.ip_forward=1 u datoteku pod /etc/sysctl.d/, pokrenite sysctl --system, pa pročitajte vrijednost natrag umjesto da vjerujete da je datoteka preuzeta. Kontejner koji upravlja vlastitim mrežnim prostorom imena treba istu vrijednost unutar tog prostora, ne samo na hostu.

Ako je očitavanje još uvijek nula, zaustavite se ovdje. Ništa dalje neće raditi.

Pričvrstite adresu tunela prije nego se na nju pozove ijedno pravilo

Bazen dodjeljuje adrese redom spajanja, pa pravilo napisano za današnji zakup može tiho pokazivati na drugog klijenta sljedeći tjedan. Vežite adresu uz identitet certifikata, a ne uz redoslijed dolaska.

client-config-dir /etc/openvpn/ccd
ifconfig-push 10.77.0.14 10.77.0.13

Taj par je klijentski kraj i kraj partnera tunela točka-na-točku, a poslužitelj je vezan uz zajedničko ime certifikata. U topologiji podmreže druga se vrijednost čita kao mrežna maska, pa napišite oblik koji odgovara topologiji u uporabi. Zatim ponovno spojite klijenta i pročitajte adresu na samom klijentu, jer pogled poslužitelja na bazen nije dokaz što je klijent konfigurirao.

Ako se adresa promijeni nakon ponovnog spajanja, zaustavite se. Pravilo NAT-a koje slijedi pokretnu metu neuspješno će raditi s prekidima i neće vas ničemu naučiti.

Prevedite u oba smjera

Prijevod odredišta šalje dolazni paket klijentu. Prijevod izvora je ono što klijenta tjera da odgovori poslužitelju, a ne izvornom pošiljatelju, i to je pravilo koje ljudi izostavljaju.

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 29443 -j DNAT --to-destination 10.77.0.14:29443
iptables -t nat -A POSTROUTING -d 10.77.0.14 -p tcp --dport 29443 -j SNAT --to-source 10.77.0.13

Bez drugog pravila klijent odgovara kroz svoj ISP-ov uzlazni kanal, pa udaljeni partner vidi izvornu adresu s kojom nikad nije razgovarao, dok poslužitelj ne drži nikakav zapis praćenja za odgovor. Vanjski promatrač vidi rukovanje koje se dovršava napola, a to je upravo simptom koji ljude šalje u potragu za greškom u vatrozidu koje nema.

Pročitajte oba pravila natrag s iptables -t nat -S i potvrdite da je naziv sučelja onaj koji nosi javnu adresu. Na hostu koji već filtrira s nftables, upišite prijevod u nftables NAT lanac odgovarajuće obitelji adresa umjesto da miješate alate.

Pustite tablicu filtra kroz

NAT tablice prepisuju zaglavlja; one ne daju dopuštenje. Uz zadanu politiku DROP proslijeđeni tok treba vlastito prihvaćanje, plus povratni smjer koji većina politika već pokriva pravilom established,related.

iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 29443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Provjerite politiku lanca FORWARD prije nego bilo što dodate, jer redoslijed ranog DROP-a odlučuje hoće li se vaše pravilo ikad razmotriti. Na hostu čija filtracija živi u nftablesu, dodajte ekvivalentno pravilo na forward kuku inet tablice i potvrdite da osnovni lanac doista vidi proslijeđeni promet, a ne samo lokalni ulaz. Ako brojač paketa na novom pravilu ostane na nuli dok NAT brojači rastu, paket se odbacuje prije vašeg pravila. To je znak da pročitate redoslijed lanaca, a ne da dodate drugu kopiju istog pravila.

Dokažite to s vanjske mreže

Testirajte s nepovezane mreže. Provjera s drugog računala na istom LAN-u može proći kroz hairpin NAT podršku i nikad ne vježba putanju koju koristi udaljeni klijent, pa zeleni rezultat ondje dokazuje pogrešnu stvar.

tcpdump -ni any port 29443
conntrack -L | grep 29443

Pokrenite snimanje na poslužitelju i na klijentu istodobno. Snimanje na poslužitelju pokazuje izlazi li prevedeni paket prema tunelu; snimanje na klijentu pokazuje dolazi li zahtjev i kamo je odgovor adresiran. Zapis o prijevodu u conntrack -L dokazuje da se pravilo podudarilo, a njegova odsutnost dokazuje da paket nikad nije stigao do NAT lanca.

Skeneri portova slab su dokaz. Prijavljuju port kao zatvoren dok se aplikacija ne veže i ne počne slušati, pa upotrijebite stvarnu vezu sa stvarnom uslugom. Kad konačno proradi, zadržite izloženost na tom jednom portu: prosljeđivanje SSH-a ili administratorske ploče jer je prvo pravilo djelovalo nezgodno mnogo je veća odluka od objavljivanja usluge.

Povezani članci