Stream relay u Nginxu za OpenVPN UDP: šta mijenja
UDP ne pripada u HTTP location. Premjestite ga u stream sloj, odredite tajm-aut sesije za VPN i očekujte proxy kao izvor.
Klijent vam je podešen na UDP, Nginx server ima location blok koji pokazuje na VPN port, a ništa ne stiže. To je očekivano: HTTP location ne može prenijeti UDP datagram, kako god prednji dio bio nazvan. Nginx za to treba stream listener, a kad konfiguraciju premjestite tamo, o tome da li sesija preživljava odlučuje drugi skup detalja.
Proxy sloj dolazi prije adrese
Nginx stream modul proxyira TCP i UDP bez parsiranja HTTP-a. Njegov HTTP modul očekuje liniju zahtjeva, zaglavlja i odgovor, a ništa od toga nema u OpenVPN datagramu. Izbor sloja je zato prva odluka i ne zavisi od toga je li listener IPv4 ili IPv6.
Konfiguracija koja izgleda da radi s TCP OpenVPN ne govori ništa o UDP slučaju. Transport je ovdje dio protokola, a ne detalj postavljanja.
Listener i backend
nginx -V 2>&1 | tr ' ' '\n' | grep stream
stream {
server {
listen [::]:1194 udp reuseport;
proxy_pass [2001:db8::20]:1194;
}
}
Provjerite da build uključuje stream modul prije bilo kakvog uređivanja; distribucijski paket ga može izdvojiti u zaseban modul, a modul koji nedostaje daje grešku konfiguracije, a ne tunel. Stavite blok u glavni kontekst konfiguracije, ne unutar http, i zamijenite dokumentacijsku adresu stvarnim backendom.
I oba puta i oba firewall-a moraju propuštati datagrame: put do listenera i put od proxyja do backenda. IPv6 listener također ne stvara IPv4 put, pa ako neki klijenti još koriste IPv4, taj listener je zaseban unos s vlastitim testiranjem. Provjerite backendov vlastiti firewall s adrese proxyja, ne s laptopa.
Tajm-auti sesije nisu tajm-auti zahtjeva
Stream proxy čuva stanje UDP sesije i odbacuje ga prema vlastitim postavkama tajm-auta i odgovora. Kratak tajm-aut prepisan s DNS relayja loše pristaje VPN-u koji očekuje razmjenu datagrama satima, a kvar se pojavljuje kao veza koja tiho umire, a ne kao ona koja odbija da se pokrene.
Pročitajte stvarni proxy_timeout postavke i svaku postavku brojanja odgovora, pa ih uporedite s keepalive ponašanjem koje VPN stvarno koristi. Dva broja koje su različiti ljudi napisali u različitim datotekama normalno su stanje sustava koji radi. Dva broja koja nikad nisu upoređena normalno su stanje sustava koji povremeno zapinje. Upišite oba u servisni zapis da se poređenje dogodi jednom, na dnevnom svjetlu.
Šta relay mijenja, a šta ne
Stream proxy ne prekida OpenVPN TLS kontrolni kanal niti ga pretvara u HTTPS. Backend ostaje VPN servis, a odnos certifikata ostaje između klijenta i tog servisa. Očuvanje željenog identiteta backenda i dalje je posao klijenta i servera.
Obično proxyiranje mijenja i izvornu adresu koju backend vidi. Logovi će pokazivati proxy, a svako IP pravilo pristupa na VPN serveru procjenjivat će tu adresu umjesto klijentove. Transparentno očuvanje izvora zaseban je dizajn usmjeravanja i privilegija, ne nešto što slijedi iz dodavanja udp listeneru. Planirajte to prije nego što se napiše politika koja zavisi od adrese klijenta.
Provjerite s klijenta, ne s porta
Lokalna provjera da je UDP port otvoren dokazuje da listener postoji. Ne dokazuje da se klijent kroz njega može autentificirati ili nastaviti razmjenjivati promet. Ostvarite stvarnu vezu s odobrenog klijenta, pa potvrdite da sesija ostaje dovoljno dugo da to ima smisla.
Kad neko kaže da Nginx ne može UDP jer je jednostavan relay alat umjesto toga proradio, te dvije činjenice nisu povezane. Alat je dokazao da backend odgovara; nije rekao ništa o tome šta prednji dio podržava. Oboje može biti istina, a samo je jedno od toga konfiguracija za ovo postavljanje.