Bitta port uchun VPNni chetlab o‘tish uchun siyosat marshrutlash kerak
NAT qoidasi manzillarni qayta yozadi, lekin chiqish havolasini tanlamaydi. Mana, bitta TCP portni tunnel tashqarisida ushlab turadigan qoida, jadval va belgi.
So‘rov har doim bir xil jumlaning bir variantidir: ko‘rish uchun VPNni qoldiring, lekin SSH yoki zaxira ishi oddiy ulanishdan foydalansin. Bu haqda aylanib yurgan maslahat, portni iptables NAT qoidalari bilan uzatish, buni qilmaydi. NAT qoidasi oqim ichidagi manzillar va portlarni qayta yozadi; paket qaysi interfeysdan chiqishini hech qachon tanlamaydi. Bu qaror marshrut qidiruviga tegishli, marshrut qidiruvi esa portni ko‘rish uchun yordamga muhtoj.
Nega oddiy marshrut port bilan moslasha olmaydi
Linux jadvaldagi manzilni qidirib marshrut tanlaydi, nomzod jadvallar siyosat qoidalari bilan filtrlanganidan keyin. Bu qoidalar firewall belgisi, manba manzili, kiruvchi interfeys yoki UID bilan moslashishi mumkin. Marshrut yozuvining o‘zida port maydoni yo‘q, chunki marshrut transport sarlavhasi ahamiyatga ega bo‘lishidan oldin tanlanadi.
Hozirgi iproute2 va yadrolar qoida tanlagichni kengaytiradi: ipproto, sport va dport qabul qilinadi, shuning uchun ip rule add ipproto tcp dport 22 table 100 niyatni bitta satrda ifodalaydi. ip rule add help ni haqiqiy xostda ishga tushiring va qurilmangiz dport ni sanab berishini ko‘ring. Agar shunday bo‘lsa, bitta buyruq bilan tugatasiz; bo‘lmasa, quyidagi belgi yo‘li unga teng.
Qanday bo‘lmasin, qoida faqat ko‘rsatkich. 100-jadval hali ham marshrutga muhtoj, va odamlar unutadigan qism shu.
Uch bo‘lak, yoki bitta
Zamonaviy shakl yuqoridagi bitta qoida va muqobil jadvaldagi marshrutdir. Klassik shakl o‘rtaga netfilter qo‘shadi: paketni belgilang, keyin qoidada belgini moslang. Ikkalasi ham bir xil qidiruvda tugaydi; port qayerda o‘qilishida farq qiladi.
Belgi usuli netfilter transport sarlavhasini ko‘rgani, marshrutlash kodi esa tarixan ko‘rmagani uchun mavjud. Bu butun mexanizm va nega zaxira yo‘l bitta aqlli buyruq emas, uchta hamkorlik qiluvchi bo‘lak ekanini tushuntiradi.
Uch bo‘lak tartib bilan
Avval, yo‘naltirmoqchi bo‘lgan oqimlarni belgilang, belgi marshrut qaroridan oldin mavjud bo‘lishi uchun yetarlicha erta ishlaydigan zanjirda:
nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1Ikkinchi, belgilangan paketlarni alohida jadvalga yuboring:
ip rule add fwmark 0x1/0x1 table 100Uchinchi, o‘sha jadvalga jismoniy havola orqali standart marshrut bering. Manzillar misol uchun; o‘zingiznikini qo‘ying:
ip route add default via 192.168.1.1 dev wlan0 table 100Uchinchi qadamni tashlab ketsangiz, belgilangan paket 100-jadvalda marshrut topmaydi, shuning uchun muvaffaqiyatsiz bo‘ladi. Alomat qoida tarmoqni buzgandek ko‘rinadi, aslida esa paketga qolgan yagona yo‘lni olib tashlagan.
Birinchi paketdan keyin uni ishlab turishga nima yordam beradi
Belgilar chiquvchi paketlarga taalluqli. Javob havola bergan manzil bilan jismoniy interfeysga keladi, asosiy jadval esa o‘sha manzil uchun tunnelni afzal ko‘rishi mumkin. Ikki mexanizm javob yo‘lini izchil saqlaydi: havola manzili uchun manbaga asoslangan qoida va oqimning butun umri davomida qarorni saqlaydigan connection tracking. Belgini conntrack’ga saqlab, javobda tiklash holatli istisnoni barqaror qilishning odatiy usuli.
Teskari yo‘l filtrlash boshqa jim qotildir. Agar yadro qaytish yo‘lini qat’iy tekshirsa va javob asosiy jadval tanlamaydigan interfeysga kelsa, paket xabarsiz tashlab yuboriladi. rp_filter standart qiymatlar distributivga va interfeys uzatilishiga qarab farq qiladi, shuning uchun o‘chirilgan deb taxmin qilish o‘rniga amaldagi qiymatni o‘qing.
Tunnelning o‘z transportini belgilamang. WireGuard yoki UDP OpenVPN tunneli TCP 22 emas, shuning uchun yuqoridagi retsept xavfsiz, lekin tunnel manzilidan boshqa hamma narsa deb yozilgan istisno shifrlangan paketlarni ushlab, tunnelni marshrut halqasiga o‘xshash tarzda buzishi mumkin.
Taxmin qilish o‘rniga tekshiring
Yadrodan qaysi yo‘lni tanlashini so‘rang, manzil uchun va port uchun, keyin haqiqiy uzatishni ishga tushiring:
ip route get 203.0.113.10
ip rule show
nft list rulesetBelgi bor bo‘lsa-da hisoblagichlar hech qachon qimirlamasa, qoida moslashmayapti. Hisoblagichlar siz yozgan konfiguratsiya bilan yadro qo‘llayotgan siyosat orasidagi farqdir.
Bu noto‘g‘ri vosita bo‘lganda
Portga asoslangan istisnolar tabiatan mo‘rt. Xizmatlar portlarni ko‘chiradi, HTTP/3 UDP 443 bo‘lib keladi, bitta dastur turli turdagi bir nechta oqim ochishi mumkin. Agar haqiqiy talab bu dastur oddiy havoladan foydalanishi bo‘lsa, marshrutlash qatlami noto‘g‘ri joy; tarmoq nomlar fazosi yoki har bir dastur uchun proksi yaxshiroq mos keladi.
Agar talab bu quyi tarmoq oddiy havoladan foydalanishi bo‘lsa, belgilarni butunlay tashlab, aniqroq marshrut qo‘shing. Bu soddaroq, bitta jadvalda ko‘rinadi va keyingi odam qoidalar to‘plamini o‘qimasdan tekshira oladi.
Firewallga tegishdan oldin uchta talabdan qaysi biri sizda haqiqatan borligini yozib qo‘ying. Yuqoridagi mexanizm aniq, noto‘g‘ri qatlamga qo‘llangan aniqlik esa faqat uzoqroq uzilishdir.