SOCKS5 orqali OpenVPN: versiya, transport va DNS mosligi
SOCKS zanjiri proksi versiyasi, transport yoki DNS yo'li mos kelmasa ishlamaydi. SOCKS5ni moslang, TCP tashang va zanjirni bitta nom maydonida saqlang.
Bu ish stansiyasidan chiqadigan yo'llardan biri SOCKS proksi, va uning orqasidagi OpenVPN hech qanday foydali tafsilotsiz ulanish vaqti tugaganini xabar qiladi. Shu mashinadagi brauzer o'sha proksi orqali ishlaydi, hisob ma'lumotlari to'g'ri va port javob beradi. Uch narsa avval tekshirishga arziydigan darajada tez-tez farq qiladi: proksi gapiradigan SOCKS versiyasi, mijoz tanlagan transport va nom hal qilinadigan joy. Firewallni ayblashdan oldin har birini tasdiqlang.
Firewalldan oldin SOCKS versiyasini moslang
Jamoa OpenVPN socks-proxy uchun SOCKS5 gapiradi. Uni faqat SOCKS4 taklif qiladigan proksiga yo'naltirsangiz, TCP ulanishi ochiladi va keyin to'xtaydi, chunki mijoz narigi tomon hech qachon tahlil qilmaydigan salomga javob kutadi. Tashqaridan bu to'xtash xuddi filtrlangan port kabi ko'rinadi, shuning uchun versiya savoli har qanday firewall qoidasidan oldin turadi. SOCKSni biladigan bitta tortish buni bitta buyruq bilan hal qiladi.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
Tugallangan so'rov bir vaqtning o'zida ikki narsani isbotlaydi: proksi SOCKS so'rovini qabul qildi va nomni hal qildi. URL sxemasi kerak emas, chunki curl yalang'och hostni HTTP deb qabul qiladi va bu bu sinov uchun yetarli.
Bu tortish mijoz jurnali yashiradigan nosozlikni ham istisno qiladi. Proksi brauzerga ruxsat berib, baribir VPN manzilini rad etishi mumkin, unda rad etish CONNECT bosqichida, har qanday VPN autentifikatsiyasidan oldin bo'ladi. OpenVPN faqat vaqt tugaganini xabar qiladi, shuning uchun proksining o'z javobi sizga kerakli dalildir.
Transport ikkala tomonda ham TCP bo'lishi kerak
Bu yerda SOCKS5 TCP oqimini tashaydi, shuning uchun tunnelning o'ziga proto tcp-client kerak. Hali UDPda sozlangan profil bu yo'ldan ishlamaydi, chunki mijoz protokolning UDP assotsiatsiya rejimidan foydalanmaydi. Profilni aylantirish rasmiyatchilik emas, haqiqiy o'zgarish: uzoq tomon o'sha portda TCP tinglashi kerak. Keyin yuk TCP ichidagi TCP bo'ladi, u yerda yo'qolgan segment ikki marta qayta yuboriladi va sur'at pasayadi, buni interaktiv sessiyalar katta uzatishlardan ancha ko'p sezadi.
proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050
Bu direktiva proksi hostini, ixtiyoriy portni va ixtiyoriy hisob ma'lumotlari faylini oladi. Ularni profilning o'ziga qo'ying, shunda boshqa joydagi nusxa xuddi shunday ishlaydi.
Butun zanjirni bitta konteynerga qamang
Zanjirni hostda qilish uning standart marshrutini egallab, hal qiluvchini keyin hech kim tushuntira olmaydigan holatda qoldirish demakdir. Buning o'rniga nom maydoni yoki konteyner uni cheklaydi, shuning uchun host o'z yo'lini saqlaydi, SOCKS qadami va tunnel birga yashaydi. Ichkarida tunnel qurilmasi, uni sozlash huquqi va yetib boradigan proksi bo'lmasa hech narsa ko'tarilmaydi. Compose xizmati buni cap_add: NET_ADMIN va bind bilan ulangan /dev/net/tun orqali oladi.
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
Bu juftlik konteynerni imtiyozli ishga tushirishdan torroq va qurilmaga kirishning barcha zarur qismi shu. Tor mijozi yoki alohida proksi konteyneri tinglovchini berishi mumkin. Ikkala holatda ham uni loopbackka bog'lang va proksini tarmoqqa ochish o'rniga nom maydonidan host orqali unga yetib boring.
Nom hal qilish — izolyatsiya buziladigan joy
Paketlarni tashib, baribir hostning hal qiluvchisidan so'raydigan tunnel hech narsani izolyatsiya qilmagan. Ikki narsa izolyatsiyani haqiqiy qiladi: nom maydonining o'z hal qiluvchisi bor va so'rovlari proksi yoki tunnel orqali o'tadi, hech qachon fizik interfeysdan o'tmaydi. Sinov uchun ikkita nomdan foydalaning: biri faqat tunnel orqasida mavjud, ikkinchisi o'sha yo'ldan borishi kerak bo'lgan umumiy nom.
docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example
Uzoq nom hal bo'lib, umumiy nom hal bo'lmasa, zanjir buzilgan emas, tanlovchan, va farq har bir so'rov qaysi yo'ldan ketganini aytadi. Ikkisi ham hostdan hal bo'lib, konteyner ichida hech biri hal bo'lmasa, konteyner hali ham hostning hal qiluvchisini qarzga oladi. Topgan hal qiluvchi faylini yozib qo'ying, chunki o'zgartirilishi kerak sozlama o'sha.
Har bir qadamni tartib bilan isbotlang
Ro'yxat qisqa. SOCKS5 so'rovi javob oladi, tunnel proksi orqali tinglovchisiga yetadi va nom maydonidan chiqqan paketlar uzoq tomon kutgan manzilni olib yuradi. Ko'proq sozlama yig'ish o'rniga har birini alohida tasdiqlang. Mijoz ulandi deyishi bilan hech narsa qimirlamasa, uzilish deyarli har doim ikkinchi yoki uchinchi faktda bo'ladi.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
docker compose exec vpn ip route get 203.0.113.10
docker compose exec vpn getent hosts internal.lab.example
Ishlagan birikmani yozib qo'ying: SOCKS versiyasi, transport, hal qiluvchi va nom maydoni sozlamalari. Bu zanjirni ikkinchi marta xotiradan hal qilish yozuvdan qimmatroq. O'sha to'rt faktni suhbatda emas, chiptada saqlang.
Ulanganini aytib, hech narsa o'tkazmaydigan zanjir odatda hali isbotlamagan qadamda ishdan chiqqan. Yana bir qatlam qo'shishdan oldin o'sha qadamni sinab ko'ring.