OpenVPN UDP-д зориулсан Nginx stream релей: юу өөрчлөгдөх вэ
UDP нь HTTP location-д хамаарахгүй. Үүнийг stream түвшинд шилжүүлж, VPN-д зориулж сессийн хугацааг тохируулж, прокси эх сурвалж болно гэж хүлээ.
Таны клиент UDP-д тохируулагдсан, Nginx серверт VPN порт руу заасан location блок байгаа ч юу ч ирэхгүй байна. Энэ нь хүлээгдэж буй зүйл: HTTP location нь UDP датаграм зөөж чадахгүй, фронтыг яаж нэрлэсэн ч хамаагүй. Үүнд Nginx-д stream сонсогч хэрэгтэй бөгөөд тохиргоог тэнд шилжүүлсний дараа сесс амьд үлдэх эсэхийг дэлгэрэнгүй мэдээллийн хоёр дахь бүлэг шийднэ.
Прокси түвшин хаягаас өмнө ирдэг
Nginx-ийн stream модуль HTTP-г задлан шинжлэхгүйгээр TCP ба UDP-г прокси хийдэг. Түүний HTTP модуль хүсэлтийн мөр, толгой, хариу хүлээдэг бөгөөд тэдгээрийн аль нь ч эх OpenVPN датаграмд байхгүй. Тиймээс түвшинг сонгох нь эхний шийдвэр бөгөөд сонсогч IPv4 эсвэл IPv6 эсэхээс хамаарахгүй.
TCP OpenVPN-тэй ажиллаж байгаа мэт харагдах тохиргоо UDP тохиолдлын талаар юу ч хэлэхгүй. Энд тээвэр нь протоколын хэсэг, байрлуулалтын дэлгэрэнгүй биш.
Сонсогч ба backend
nginx -V 2>&1 | tr ' ' '\n' | grep stream
stream {
server {
listen [::]:1194 udp reuseport;
proxy_pass [2001:db8::20]:1194;
}
}
Ямар нэг зүйлийг засахын өмнө build нь stream модулийг агуулж байгаа эсэхийг шалгаарай; түгээх багц үүнийг тусдаа модуль болгон хувааж болох бөгөөд модуль байхгүй бол туннель биш тохиргооны алдаа гарна. Блокыг үндсэн тохиргооны контекстэд байрлуул, http дотор биш, мөн баримт бичгийн хаягийг бодит backend-ээр соль.
Хоёр маршрут болон хоёр галт хана хоёулаа датаграмыг нэвтрүүлэх ёстой: сонсогч хүртэлх зам ба проксигоос backend хүртэлх зам. IPv6 сонсогч нь IPv4 зам үүсгэдэггүй тул зарим клиент IPv4 ашиглаж байгаа бол тэр сонсогч өөрийн туршилттай тусдаа бичлэг юм. Backend-ийн өөрийн галт ханыг проксигийн хаягаас шалга, зөөврийн компьютерээс биш.
Сессийн хугацаа нь хүсэлтийн хугацаа биш
stream прокси нь UDP сессийн төлөвийг хадгалж, өөрийн хугацаа болон хариуны тохиргооны дагуу хаядаг. DNS релейгээс хуулсан богино хугацаа нь цаг цагаар датаграм солилцохоор хүлээж буй VPN-д тохиромжгүй бөгөөд алдаа нь эхлэхээс татгалзсан холболт биш, чимээгүй үхэж буй холболт хэлбэрээр илэрдэг.
Байрлуулалтын бодит proxy_timeout болон хариу тоолох аливаа тохиргоог уншаад, VPN-ийн бодитоор ашигладаг keepalive зан төлөвтэй харьцуул. Өөр хүмүүсийн өөр файлуудад бичсэн хоёр тоо нь ажиллаж буй системийн хэвийн байдал юм. Хэзээ ч харьцуулаагүй хоёр тоо нь хааяа доголддог системийн хэвийн байдал юм. Харьцуулалт нэг л удаа, өдрийн гэрэлд болохын тулд хоёуланг нь үйлчилгээний бүртгэлд бич.
Релей юу өөрчлөх, юу өөрчлөхгүй
stream прокси нь OpenVPN-ийн TLS удирдлагын сувгийг таслахгүй бөгөөд HTTPS болгон хувиргахгүй. Backend нь VPN үйлчилгээ хэвээр байх бөгөөд гэрчилгээний харилцаа клиент ба тэр үйлчилгээний хооронд үлдэнэ. Зорьсон backend-ийн таних тэмдгийг хадгалах нь клиент ба серверийн ажил хэвээр.
Энгийн прокси нь backend-ийн хардаг эх хаягийг ч өөрчилдөг. Бүртгэлүүд проксийг харуулах бөгөөд VPN сервер дээрх IP-д суурилсан аливаа хандалтын дүрэм клиентийнх биш, тэр хаягийг үнэлнэ. Эх сурвалжийг тунгалаг хадгалах нь тусдаа маршрутжуулалт ба эрхийн загвар бөгөөд сонсогчид udp нэмснээс үүсдэг зүйл биш. Клиентийн хаягаас хамаарах бодлогыг бичихээс өмнө үүнийг төлөвлө.
Портоос биш, клиентээс баталгаажуул
UDP порт нээлттэй эсэхийг шалгах нь сонсогч байгааг нотолно. Энэ нь клиент түүгээр нэвтрэх эсвэл урсгал солилцоог үргэлжлүүлэх боломжтойг нотлохгүй. Зөвшөөрөгдсөн клиентээс бодит холболтыг дуусгаад, сесс утга учиртай хугацаанд хадгалагдахыг баталгаажуул.
Nginx UDP хийж чадахгүй гэж хэн нэгэн мэдээлэхдээ, оронд нь энгийн релей хэрэгсэл ажилласан гэвэл тэдгээр хоёр баримт хамааралгүй. Хэрэгсэл нь backend хариу өгдөг гэдгийг нотолсон; фронт юу дэмждэг талаар юу ч хэлээгүй. Хоёулаа үнэн байж болох бөгөөд тэдгээрийн зөвхөн нэг нь энэ байрлуулалтын тохиргоо юм.