Butun mashinani jalb qilmasdan bitta ilovani VPN orqali yo‘naltirish
Hech bir boshqarilmaydigan ish stoli har bir jarayon uchun VPN kalitini taklif qilmaydi. Trafikni tanlaydigan qatlamni tanlang: bog‘langan soket, UID qoidasi, xavfsizlik devori profili yoki SOCKS sakrashi.
VPN mijozi ulanadi, brauzer ishlaydi va sizga haqiqatan muhim bo‘lgan yagona buyruq hanuz uy ulanishi orqali chiqadi. Yoki buning aksi yuz beradi: tunnel standart marshrutni egallaydi va mahalliy fayl serveri ish stolidan yo‘qoladi. Men buni ichki artefakt ko‘zgusiga yetishi kerak bo‘lgan build agentida uchratdim, xostning qolgan qismi ofis LANida qolgan edi, mijoz esa aynan ikkita tanlov taklif qildi, butun trafik yoki hech narsa. So‘rov ikkala yo‘nalishda ham bir xil, bu dastur va butun mashina emas, va ko‘p mijozlarda buning uchun katakcha yo‘q, chunki marshrutlash jadvali dastur nima ekanini hech qachon bilmagan.
Nega marshrutlash jadvali dasturingizni ko‘rmaydi
Jarayon paket yuborganda, stek marshrutlash jadvalida manzilni qidiradi. Na bajariladigan fayl nomi, na port bu qidiruvga kiradi. Domen nomlari ham xuddi shu sababdan ishlamaydi: tunnel trafikni manzilga olib boradi va nom manzilga aylanganda yadroda qolgan yagona dastak marshrutlashdir. Shuning uchun "VPN faqat shu sayt uchun" oxir-oqibat proksini, "VPN faqat shu dastur uchun" esa kichik mexanizmlar to‘plamidan birini anglatadi.
| Mexanizm | Nimani tanlaydi | Nimani qamraydi | Tunnel uzilganda |
|---|---|---|---|
| Soketni bog‘lash | manba manzili | siz boshqaradigan mijoz | ulanishlar muvaffaqiyatsiz bo‘ladi |
| UID qoidasi (Linux) | egasi bo‘lgan foydalanuvchi | bitta hisobning har bir jarayoni | ulanishlar muvaffaqiyatsiz bo‘ladi |
| Xavfsizlik devori profili (Windows) | adapter profili | bitta dastur | yopiq holatda ishlamaydi |
| Tarmoq nomlar fazosi | nomlar fazosiga a’zolik | ichkarida boshlangan hamma narsa | ulanishlar muvaffaqiyatsiz bo‘ladi |
| SOCKS sakrashi | ilovaning proksi sozlamasi | bitta ilova yoki bitta brauzer profili | ulanishlar muvaffaqiyatsiz bo‘ladi |
Ularning hech biri jarayon uchun marshrut emas. Har biri qarorni dasturni, foydalanuvchini yoki ilovaning o‘z konfiguratsiyasini ko‘ra oladigan qatlamga o‘tkazadi.
Bitta manzil hanuz marshrut, dastur qoidasi emas. macOSda odatiy usul "Barcha trafikni VPN orqali yuborish" belgisini olib tashlab, xost marshrutini qo‘shishdir: sudo route add -host internal-tuner.example -interface ppp0, keyin u bilan olib tashlanadi sudo route delete -host internal-tuner.example -interface ppp0. Avval interfeys nomini shu yerdan o‘qing ifconfig, chunki ppp0 faqat misol. Xost marshrutida joker belgilar ishlamaydi, shuning uchun bir nechta nom bilan gaplashadigan xizmat har bir nom uchun bitta yozuv talab qiladi va qoida mashinadagi har bir jarayonni qamraydi, siz o‘ylaganini emas.
Soketni tunnel manziliga bog‘lang
Mijozni o‘zingiz boshqarsangiz, bog‘lash eng arzon tanlagichdir. Tunnelning mahalliy manziliga bog‘langan soket, u yerda manzil uchun marshrut mavjud ekan, shu interfeys orqali chiqadi va mashinadagi qolgan hamma narsa odatiy yo‘lini saqlaydi. Nozik jihat shundaki, bog‘lash manba manzilini tanlaydi, marshrutlash jadvali esa chiqishni tanlashda davom etadi. Bog‘lashning o‘zi marshrutsiz trafikni tunnelga olib kirmaydi, va "bog‘ladim, baribir noto‘g‘ri yo‘ldan chiqadi" degan hisobotlarning ko‘pchiligi ortidagi xato shu.
import socket
s = socket.socket()
s.bind(("10.8.0.2", 0))
s.connect(("build.internal.example", 443))Yuqori darajadagi vositalar xuddi shu g‘oyani ko‘rsatadi: curl --interface 10.8.0.2, CURLOPT_INTERFACE PHPda va source_address argumenti Pythonning HTTP mijozlarida. Manzil tunnelga tegishli bo‘lishi kerak va bu yerdagi terish xatosi marshrutlash shikoyati emas, oddiy ulanish xatosi sifatida namoyon bo‘ladi. Manzil o‘rniga qurilma nomiga bog‘lash Linux imtiyozi va Windows yoki macOSga o‘tmaydi, shuning uchun ko‘chma skriptlar manzilni uzatadi.
Linux: dastur nomini emas, egasini moslashtiring
Yadro soketning egasi bo‘lgan foydalanuvchini moslashtira oladi, shuning uchun alohida hisob tanlagichga aylanadi. Tunnelni o‘z marshrutlash jadvaliga joylang va faqat shu hisob trafigini u yerga yuboring:
ip rule add uidrange 1001-1001 lookup 100
ip route add default dev tun0 table 100Bu faqat tunnel allaqachon standart marshrut bo‘lmasa ishlaydi. Mijozni --route-nopull bilan ishga tushiring yoki itarilgan qayta yo‘naltirishni --pull-filter ignore "redirect-gateway" bilan OpenVPN 2.4 va undan keyingilarida filtrlang, so‘ng jadval yozuvini o‘zingiz qo‘shing. Aks holda ikkita standart mavjud bo‘ladi va pastroq ustuvorlikdagisi yutadi. Buning qasddan qilingan varianti standart marshrutni tunnel shlyuziga qaratish yoki buni uzilish skriptidan qilishdir: tunnel uzilganda trafikni internetdan uzoq tutadi, lekin bu o‘chirish kaliti, tanlagich emas va kimdir olib tashlamaguncha qoladi.
Kuchliroq variant tarmoq nomlar fazosi. Uni yarating, mijozni ichkarida ishga tushiring va ilovani ip netns exec bilan boshlang. Nomlar fazosidan tashqarida hech narsa tunnel interfeysini ko‘rmaydi, shuning uchun ilova tasodifan xost marshrutiga qaytmaydi. Narx haqiqiy: nomlar fazosiga jismoniy tarmoqqa chiqish uchun veth jufti va o‘z resolver fayli kerak, chunki mount nomlar fazosi xostning nom hal qilish sozlamalarini bo‘lishmaydi.
Ikki nosozlik rejimi ko‘p oqishlarni tushuntiradi. Nom hal qilish hanuz xostning resolverida bo‘ladi, shuning uchun TCP ulanishi ichkariga kirsa ham so‘rov tunneldan tashqariga chiqadi. IPv6 esa o‘zining ip -6 rule qoidasini talab qiladi, chunki v4 qoidasi uni qamramaydi.
Windows va macOS: xavfsizlik devorini cheklang yoki proksini topshiring
Windowsda ham ilova uchun marshrut tanlagichi yo‘q, lekin xavfsizlik devori qoidalari profil bilan cheklanishi mumkin va VPN adapteri Ommaviy deb tasniflanishi mumkin, uy LANi esa Xususiy qoladi. Dastur uchun Xususiy va Domen profillarida chiqishni bloklash qoidalarini yarating, Ommaviyni ochiq qoldiring va ilova tarmoqqa faqat tunnel orqali chiqadi. Avval ulanishning tarmoq toifasini belgilang, so‘ng xavfsizlik devorining kuzatuv panelida qoida mos kelganini tasdiqlang. Bu blok, marshrut emas: tunnel uzilganda yopiq holatda ishlamaydi va xavfsizlik devorini e’tiborsiz qoldiradigan ilovani to‘xtata olmaydi.
macOS xuddi shu mantiqni boshqa vositalar bilan izlaydi. SSH orqali yetib boriladigan SOCKS tinglovchisi eng kam aralashuvchi variant, chunki ssh -D 1080 user@host bitta mahalliy port yaratadi va faqat undan foydalanish uchun sozlangan ilovalar shu yo‘ldan ketadi. pf qoidasi dasturni foydalanuvchi yoki guruh bo‘yicha bloklashi mumkin, lekin baribir faqat shu dastur uchun tunnelni tanlay olmaydi. Tunnelblick domen bo‘yicha umuman filtrlay olmaydi, chunki marshrutlar manzillar bilan ishlaydi; OpenConnect foydalanuvchilari server juda keng prefiks ro‘yxatini itarganida vpn-slice ga murojaat qiladi.
Ikki vaqtinchalik yechim platforma vositalari yetisha olmagan narsani qoplaydi. Proksini domen bo‘yicha almashtiradigan brauzer kengaytmalari "faqat shu sayt" uchun amaliy javob, chunki ular nomlar hali mavjud bo‘lgan ilova qatlamida ishlaydi; ular bitta brauzerni qamraydi, boshqa hech narsani emas. Qo‘pol usul sotuvchi mijozini virtual mashinada ishga tushirish, mehmon marshrut o‘zgarishiga egalik qiladi, xost o‘z yo‘lini saqlaydi, evaziga ikkita tarmoq stekini parvarishlash.
Bog‘lash imkoniyati yo‘q vositalar uchun SOCKS sakrashi
Aksariyat ilovalarni HTTP yoki SOCKS proksisiga qaratish mumkin, hatto ular interfeyslar haqida hech narsa bilmasa ham. SSH mijozi server tomonida hech qanday o‘zgarishsiz bittasini beradi:
ssh -N -D 127.0.0.1:9999 [email protected]Shu portdan foydalanish uchun sozlangan hamma narsa bastionda chiqadi, ish stolining qolgan qismi odatiy ulanishini saqlaydi. Tunnel manziliga bog‘langan mahalliy 3proxy nusxasi SSHsiz bitta port uchun xuddi shunday qiladi va stunnel TLS bilan o‘ralgan bitta portni qamraydi. Cheklovlar amaliy: proksi faqat undan foydalanishni biladigan protokollarni tashiydi, UDP uchun SOCKS5 UDP assotsiatsiyasi kerak, uni ko‘p mijozlarning "SOCKS5" sozlamasi yoqmaydi va DNS proksi tomonidan hal qilinishi kerak (socks5h curl da), aks holda nom mahalliy resolverga oqib ketadi.
Tinglovchini loopbackda saqlang, agar boshqa mashinaga kerak bo‘lmasa.
Yo‘lni holat xabari bilan emas, ushlash bilan tekshiring
Ilova holat oynalari sozlamani tasvirlaydi, paketni emas. Ikkala interfeysda trafikni ushlang va solishtiring:
tcpdump -i any -n port 443
ss -tnp | grep 443Agar ulanish jismoniy interfeysda ko‘rinib, tunnelda unga mos yozuv bo‘lmasa, mijoz nima deb xabar bermasin, tanlagich kuchda emas. IPv6 va resolverni alohida tekshiring va ikkinchi yo‘lni qidiring, masalan yordamchi jarayon yoki meros qolgan tizim proksisi.
So‘ng talabga mos chegarani tanlang: bitta sayt uchun proksi yetarli, bitta hisob uchun UID qoidasi yetarli, ulanish yopiq holatda ishlamaydigan bo‘lishi kerak bo‘lsa xavfsizlik devori profili yetarli va nomlar fazosi tunnelni undan tashqaridagi hamma narsadan yashiradigan yagona variantdir.