Relay stream în Nginx pentru UDP-ul OpenVPN: ce se schimbă
UDP-ul nu are ce căuta într-un location HTTP. Mutați-l în stratul stream, dimensionați timpul de sesiune pentru un VPN și așteptați-vă ca proxy-ul să fie sursa.
Clientul dumneavoastră este setat pe UDP, serverul Nginx are un bloc location care indică portul VPN, și nu sosește nimic. Acest lucru este de așteptat: un location HTTP nu poate transporta un datagram UDP, indiferent cum se numește interfața. Nginx are nevoie de un listener stream pentru asta, iar după ce mutați configurația acolo, un al doilea set de detalii decide dacă o sesiune supraviețuiește.
Stratul de proxy vine înaintea adresei
Modulul stream al Nginx face proxy pentru TCP și UDP fără a analiza HTTP. Modulul său HTTP așteaptă o linie de cerere, antete și un răspuns, iar nimic din toate acestea nu există într-un datagram OpenVPN nativ. Alegerea stratului este deci prima decizie și este independentă de faptul că listenerul este IPv4 sau IPv6.
O configurație care pare să funcționeze cu OpenVPN pe TCP nu spune nimic despre cazul UDP. Transportul este aici parte a protocolului, nu un detaliu al implementării.
Listenerul și backendul
nginx -V 2>&1 | tr ' ' '\n' | grep stream
stream {
server {
listen [::]:1194 udp reuseport;
proxy_pass [2001:db8::20]:1194;
}
}
Confirmați că build-ul include modulul stream înainte de a edita ceva; un pachet de distribuție îl poate separa într-un modul separat, iar un modul lipsă produce o eroare de configurare în loc de un tunel. Puneți blocul în contextul principal de configurare, nu în interiorul http, și înlocuiți adresa de documentație cu backendul real.
Atât cele două rute, cât și cele două firewall-uri trebuie să permită datagramele: calea către listener și calea de la proxy la backend. Un listener IPv6 nu creează nici o cale IPv4, așa că dacă unii clienți folosesc încă IPv4, acel listener este o intrare separată cu propriile teste. Verificați firewall-ul backendului însuși de la adresa proxy-ului, nu de la laptop.
Timpii de sesiune nu sunt timpi de cerere
Proxy-ul stream păstrează stare pentru o sesiune UDP și o aruncă în funcție de timpul său limită și de setările de răspuns. Un timp limită scurt copiat de la un relay DNS se potrivește prost unui VPN care se așteaptă să schimbe datagrame ore întregi, iar defecțiunea apare ca o conexiune care moare în liniște, nu ca una care refuză să pornească.
Citiți proxy_timeout efectiv al implementării și orice setare de numărare a răspunsurilor, apoi comparați-le cu comportamentul keepalive pe care VPN-ul îl folosește efectiv. Două numere scrise în fișiere diferite de oameni diferiți sunt starea normală a unui sistem care funcționează. Două numere care nu au fost niciodată comparate sunt starea normală a unui sistem intermitent. Scrieți-le pe amândouă în registrul serviciului, ca comparația să aibă loc o singură dată, la lumina zilei.
Ce schimbă relay-ul și ce nu
Proxy-ul stream nu termină canalul de control TLS al OpenVPN și nu îl transformă în HTTPS. Backendul rămâne serviciul VPN, iar relația certificatului rămâne între client și acel serviciu. Păstrarea identității de backend dorite rămâne treaba clientului și a serverului.
Proxy-ul obișnuit schimbă și adresa sursă pe care o vede backendul. Jurnalele vor arăta proxy-ul, iar orice regulă de acces bazată pe IP de pe serverul VPN va evalua acea adresă în loc de cea a clientului. Păstrarea transparentă a sursei este un design separat de rutare și privilegii, nu ceva ce decurge din adăugarea lui udp la un listener. Planificați-o înainte de a fi scrisă o politică ce depinde de adresa clientului.
Verificați de la client, nu de la port
O verificare locală că portul UDP este deschis dovedește că listenerul există. Nu dovedește că un client se poate autentifica prin el sau poate continua să schimbe trafic. Finalizați o conexiune reală de la un client aprobat, apoi confirmați că sesiunea rămâne activă suficient de mult încât să conteze.
Când cineva raportează că Nginx nu poate face UDP pentru că un instrument simplu de relay a funcționat în schimb, cele două fapte nu au legătură. Instrumentul a dovedit că backendul răspunde; nu a spus nimic despre ce acceptă interfața. Ambele pot fi adevărate și doar unul dintre ele este o configurație pentru această implementare.