WireGuard orqali bitta dastur: bog'lash — marshrutlash emas
Dasturni wg0 ga bog'lash faqat uning manba manzilini belgilaydi. Yadroga hali ham tunnel marshrutlari bo'lgan jadval va shu manbani u yerga yuboradigan qoida kerak.
Sozlama har bir dastur uchun alohida kalitga o'xshaydi, shuning uchun odamlar klientni WireGuard interfeysiga bog'laydi va faqat shu klient tunneldan foydalanadi deb kutadi. Bog'lash aslida manba manzilini tanlaydi. Keyin yadro manzil uchun marshrut qidiradi, odatdagi standart marshrutni topadi va paketni tunnel manzili bilan birga fizik kanaldan chiqaradi. Faqat shu manba manzili uchun tanlangan marshrut maqsadni bajaradi.
Mexanizmning ikki yarmi bor: faqat tunnel trafigi ishlatishi kerak bo'lgan marshrutlash jadvali va mos manbani u yerga yuboradigan qoida.
Bog'lash manba manzilini belgilaydi, boshqa hech narsa emas
Linux chiqish interfeysini marshrutlash jadvalida manzilni qidirib tanlaydi, siyosat qoidalari bu qidiruvni boshqa tomonga burish imkoniyatini olgandan keyin. Qoidalar manba manzili, tarmoq devori belgisi, kiruvchi interfeys, UID yoki hatto port bo'yicha tanlashi mumkin; har biri butun trafik emas, shu trafik deyishning boshqa usuli. VPN klient konfiguratsiyasi tunnel marshrutlari joylashgan jadvalni tanlaydi; qoida qaysi trafikka u bilan maslahatlashishga ruxsat borligini tanlaydi. Faqat bog'lash ikkalasini ham bermaydi.
Shuning uchun bu nosozlik juda g'alati ko'rinadi. Dastur aniq tunnel manzilidan foydalanmoqda, tunnel aniq ishlayapti va trafik aniq noto'g'ri interfeysdan chiqmoqda. Har bir gap to'g'ri va birgalikda manzilni marshrutga biriktirgan hech narsa bo'lmagan tizimni tasvirlaydi.
Tunnelga o'z jadvalini bering
wg-quick marshrutlarni profil aytgan joyga o'rnatadi. [Interface] ostiga Table = 40 qo'shish ularni asosiy jadval o'rniga 40-jadvalga ko'chiradi. Interfeysni ko'taring va ular yetib kelganini tasdiqlang: ip -4 route ls table 40 tunnel marshrutlarini ko'rsatishi kerak, ip -4 route get 10.66.127.142 esa yadro hozir ulardan birini qanday hal qilishini ko'rsatadi. Marshrutlar o'z jadvalida bo'lsa, asosiy jadval qolgan hamma narsa uchun ishlayveradi.
Keng prefiksni moslashtirish o'rniga IPv6 uchun ham shunday qiling. ip -6 rule add from fd00::2/128 lookup 40 bitta manzilni mahkamlaydi; fc00::/8 xostdagi boshqa interfeyslar bilan to'qnashib, mo'ljaldan ko'proq mos keladigan qoida yaratishi mumkin.
Manba qoidasini qo'shing va hisoblagichlarni kuzating
Keyin ikki yarmini ulang: ip -4 rule add from 10.66.127.142/32 lookup 40, o'sha manzil WireGuard interfeysiga bog'langan holda. Ikkala qoidani PostUp ichiga qo'ying, qayta ulanish ularni tiklaydi. Sozlama bilan emas, haqiqiy so'rov bilan tekshiring: ip route get 1.1.1.1 from 10.66.127.142 tunnel qurilmasini nomlashi kerak, curl --interface wg0 ifconfig.me esa uy manzili o'rniga tunnel manzilini xabar qilishi kerak.
Hali ham ishlamasa, ip -s rule ni o'qing. Mavjud bo'lib, hech qachon mos kelmagan qoida nol hisoblagichlarni ko'rsatadi va bu noto'g'ri qoidani qoida umuman yo'qligidan ajratadi. Shu bitta buyruq dastur o'z interfeys sozlamasini e'tiborsiz qoldirganmi degan ko'plab taxminlarni tejaydi.
Teskari holat: SSH ni tunneldan tashqarida tuting
Qarama-qarshi muammo ham shunchalik keng tarqalgan: wg-quick standart marshrutga ega va serverga SSH seansi o'rtada uziladi. Uning qoidalari past ustuvorlik raqamida turadi, shuning uchun istisno ulardan oldin baholanishi kerak. ip rule add dport 22 ipproto tcp table main priority 123 buni yangi iproute2 da qiladi; selektor mavjud bo'lmagan joyda oqimni nftables da belgilang va o'rniga belgini moslashtiring.
Javob yo'lini ham tekshiring. O'rnatilib, keyin jim bo'lib qolgan SSH seansida odatda assimetrik marshrutlash bo'ladi: bir yo'nalish tunneldan, ikkinchisi fizik interfeysdan chiqadi. Server manzili uchun ip route get javob qaysi tomonga ketishini aytadi.
Jadval raqami, manba qoidasi va istisnoni profilning o'ziga yozing. Uchalasi ham bitta dizaynga tegishli va birga tahrir qilinadi.