Bitta dasturni Linuxda VPN ga bog'lash asosan marshrutlash muammosi, va firewall qoidasi faqat marshrut tanlangandan keyin nima bo'lishini hal qiladi. Agar tunnel standart marshrutga ega bo'lishidan oldin dasturning UID ini OUTPUT ichida moslashtirsangiz, qoida himoya qilmoqchi bo'lgan trafikning o'zini tashlab yuboradi. Xuddi shu qoida dasturning DNS so'rovlariga javob beradigan resolver jarayonini ham ko'rmaydi. Tartibni to'g'rilang, shunda imtiyozsiz bitta hisob ishonchli bo'lingan tunnel tanlagichiga aylanadi.

Hukmdan oldin hisobga marshrut bering

Egasi mosligi bitta savolga javob beradi: bu UID ga tegishli mahalliy soket paketni qurganmi? U interfeys tanlamaydi va asosiy jadval allaqachon fizik NIC orqali yuborayotgan trafikni ko'chira olmaydi. Shuning uchun mos marshrutsiz UID qoidasi dasturni boshqa tomonga burish o'rniga bloklaydi.

Hisobni avval o'z jadvali orqali o'tkazing, so'ng firewall natijani tasdiqlasin. Bu iproute2 si uidrange ni tushunadigan xostda ishlaydi, uni ip rule help bir satrda xabar qiladi. 100-jadval tunnel orqali standart marshrutni saqlaydi va qoida faqat UID 1000 ni shu jadvalga yuboradi. Qolgan hamma narsa asosiy jadvalda qoladi va fizik aloqadan foydalanishda davom etadi.

ip rule add uidrange 1000-1000 table 100
ip route add default dev tun0 table 100

Boshqa tunnel kerak bo'lgan ikkinchi hisob 101-jadval va o'z qoidasini oladi, chunki ikki profil bir jadvalda standart marshrutga birga ega bo'la olmaydi. NetworkManager profillari tizim miqyosida, shuning uchun bu qism qo'lda qoladi va qayta yuklashda qoidalar yo'qoladi, agar biror narsa ularni tiklamasa. Jadvallarni tunnel ta'rifi yonidagi yuklash skriptiga yozing, toki qayta ulanish bitta hisobni noto'g'ri yo'lda qoldirmasin.

Nega loopback istisnosi tunnelni o'ldiradi

Qoidaning ko'chirilgan variantlarining ko'pchiligi loopback orqali chiqmaydigan har bir paketni tashlaydi. Tunnel loopback emas, shuning uchun bu shakl tunnel trafigini ham tashlaydi va natija firewall xatosi emas, o'lik VPN kabi ko'rinadi.

OUTPUT ishlayotganda yadro chiqish interfeysini allaqachon tanlagan, shuning uchun -o paket sarlavhasi bilan emas, marshrutning javobi bilan solishtiriladi. Egasi mosligi faqat OUTPUT va POSTROUTING da ko'rib chiqiladi va uzatilgan paketlarda u o'qiy oladigan soket bo'lmaydi. Bu birikma istisno loopbackni inkor qilish o'rniga tunnel interfeysini nomlashi va bu moslikni inkor qilishi kerakligini bildiradi.

loopback hali ham DROP ustida o'z ACCEPT iga loyiq, chunki dasturning birinchi DNS paketi lo orqali mahalliy stub ga boradi. Ikki qoidani shu tartibda qo'ying, hisob stub ga yetadi, so'ng tunnelga, boshqa joyga emas.

iptables -I OUTPUT 1 -o lo -m owner --uid-owner vpnapp -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner vpnapp ! -o tun0 -j DROP

IPv6 alohida qoidalar to'plami, va faqat v4 uchun qilingan juftlik ip6tables ni daxlsiz qoldiradi. AAAA yozuvlarini afzal ko'radigan dastur o'shanda DROP ga hech yetmasdan fizik aloqa orqali chiqib ketadi. Ikki qoidani ham ip6tables da aks ettiring yoki tunnel v6 manzilini olib yurmasa, xostda IPv6 ni o'chiring. Qo'lda qo'shilgan qoidalar ham qayta yuklashda yo'qoladi, shuning uchun ularni netfilter-persistent save bilan saqlang yoki xuddi shu mantiqni yuklash birligi yuklaydigan nftables jadvali sifatida qayta quring.

DNS javoblari boshqa jarayondan keladi

Dasturning 127.0.0.53 manziliga so'rovi loopback ACCEPT dan o'tadi va aynan shu yerda UID mosligi to'xtaydi. Stub resolver o'z xizmat hisobidan yuqoriga uzatadi, shuning uchun vpnapp ga bog'langan qoida ikkinchi so'rovni hech qachon ko'rmaydi. Agar resolver aloqa uchun LAN serverini tanlasa, javoblar fizik NIC orqali qaytadi, dasturning o'z paketlari esa tunnelda qoladi. Ko'rinadigan natija nomlari buzilgan ishlaydigan tunnel yoki siz tanlamagan server javob beradigan nomlardir.

Nomlarni hal qilishni dasturda emas, tunnel aloqasida tuzating. Tunnel profiliga DNS server va marshrutlash domeni bering, so'ng resolvectl query va resolvectl status tun0 bilan resolver muhim nomlar uchun undan foydalanishini tasdiqlang. Tarmoq nomlar fazosi ichida muammo yo'qoladi, chunki fazo resolveri faqat tunnelni biladi.

Qoidani hisobning o'zidan tekshiring

Yadrodan UID qanday marshrut olishini so'rang, so'ng shu hisob sifatida so'rov yuboring va chiqish manzilini o'z hisobingiz manzili bilan solishtiring. Ikkisi ham bir xil manzilni xabar qilsa, qoida siz sinagan trafikdan boshqa narsaga mos keladi. Quyidagi birinchi buyruq paket yubormasdan marshrut qidiruvini ko'rsatadi, bu marshrutlash xatosini firewall xatosidan ajratadi.

ip route get 1.1.1.1 uid 1000
sudo -u vpnapp curl -s https://ifconfig.co

Hisoblagichlar qoida qachonlardir ishga tushganini ko'rsatadi. iptables -vnL OUTPUT buyrug'ini bajaring, har bir qoida yonidagi paket sonini o'qing va haqiqiy trafikdan keyin DROP yonidagi nolni moslik xatosi deb hisoblang.

Uzatilgan trafik bu dizayndan tashqarida. Ko'prik ortidagi konteyner yoki VM da vpnapp ga tegishli mahalliy soket yo'q, shuning uchun egasi mosligi hech qachon ishga tushmaydi va bu paketlar o'rniga FORWARD siyosatiga bo'ysunadi. Agar bu yukni qoplash kerak bo'lsa, uni alohida sinab ko'ring va ko'prik yoki konteyner manziliga bog'langan siyosat yozing. Dizayn jadval, interfeys istisnosi, resolver va v6 qoidalari bir yo'nalishga ishora qilganda turadi; ulardan birini tashlab ketsangiz, hisob yo oqib ketadi yoki aloqani yo'qotadi.

O'xshash maqolalar