WireGuard DNS DNAT: javob yo‘lini ishlab turishini saqlang
DNAT manzilni qayta yozadi, manbani emas. Qoidani qo‘shishdan oldin yuqori oqim resolveri qanday javob berishini hal qiling va har bir moslikni tor tuting.
WireGuard mijozi DNS so‘rovini boshqa resolverga yo‘naltirish bitta qoidaga o‘xshaydi, lekin uchta qaror kabi harakat qiladi. Manzilni qayta yozish, paketni uzatish va javob gateway yaratgan tarjima holatidan o‘tib qaytish yo‘lini topishi kerak. Uchinchisini tashlab ketsangiz, so‘rov toza chiqib ketadi, mijoz esa abadiy kutadi.
10.77.0.0/24 ichidagi ruxsat berilgan mijozlar wg0 orqali kelib, e’lon qilingan 10.77.0.1 manzilini so‘rab, 203.0.113.53 manzilida resolverga muhtoj bo‘lish misolini olaylik. Yuqori oqim manzili hujjatlar uchun joy egallovchi, ishlayotgan xizmat emas.
So‘rovni yo‘naltirish faqat uning manzilini o‘zgartiradi
PREROUTING dagi manzil-NAT qoidasi marshrutlash qarori qabul qilinishidan oldin manzilni qayta yozadi, shuning uchun paket keyin eski manzil o‘rniga yangi manzilga yo‘naltiriladi. Mijozning manba manzili bu amaldan ta’sirlanmaydi. Shuning uchun to‘liq ko‘rinadigan qoida ham sukunat keltirishi mumkin: so‘rov endi mijozning xususiy diapazoni haqida hech eshitmagan resolverga boradi. Gateway bitta maydonni tarjima qildi va ikkinchi muammoni meros oldi.
Ikkala DNS transporti ham mos qoidalarni talab qiladi, chunki javob qisqartirilganda mijoz TCP ga qaytadi.
Quyidagi qoidalar bitta kiruvchi interfeys, bitta mijoz diapazoni va bitta asl manzil manzilini tanlaydi. Gatewayda boshqa hech narsa ta’sirlanmaydi va gatewayning o‘z so‘rovi umuman mos kelmaydi.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i wg0 -s 10.77.0.0/24 -d 10.77.0.1 -p udp --dport 53 -j DNAT --to-destination 203.0.113.53:53
iptables -t nat -A PREROUTING -i wg0 -s 10.77.0.0/24 -d 10.77.0.1 -p tcp --dport 53 -j DNAT --to-destination 203.0.113.53:53
Javob yo‘li alohida qaror
Ikki tuzilma javobning qaytishiga imkon beradi va birini erta tanlash bitta diskash sessiyasini tejaydi. Yo yuqori oqim resolverining ushbu gateway orqali 10.77.0.0/24 ga qaytish marshruti bor, yo gateway chiqishda manbani tarjima qiladi, shunda javob yuqori oqim allaqachon biladigan manzilga yetadi. Ikkalasi ham ishlaydi; yuqori oqim ustidagi nazoratingizga faqat bittasi mos keladi.
Marshrutlash birinchi urinishga loyiq, chunki u mijoz manzilini resolver uchun ko‘rinadigan saqlaydi va ikkinchi tarjima qatlamidan qochadi. Yuqori oqim nazoratingizdan tashqarida bo‘lsa, aniq chiqish interfeysida manbani tarjima qilish amaliy tanlovdir.
Bu tarjimani yo‘naltirish kabi qattiq cheklang, aks holda qoida unga tasodifan mos keladigan har qanday narsa uchun umumiy maqsadli NAT ga aylanadi:
iptables -t nat -A POSTROUTING -s 10.77.0.0/24 -d 203.0.113.53 -o eth0 -p udp --dport 53 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.77.0.0/24 -d 203.0.113.53 -o eth0 -p tcp --dport 53 -j MASQUERADE
Ulanish kuzatuvi xaritalashni juft holda saqlaydi, shuning uchun javob qaytishda mijozning asl tuple iga qayta yoziladi. Chiqish qoidasisiz resolver javobini yetib bora olmaydigan xususiy manzilga yuboradi va mijoz xato o‘rniga vaqt tugashini ko‘radi.
Qoidalarni ish ko‘ringanidan torroq yozing
Uzatish ruxsati ham shu doirada. Mashinadagi har bir DNAT ulanishini qabul qilish o‘rniga mijozdan resolverga oqim va conntrack allaqachon taniydigan qaytish trafigiga ruxsat bering. Umumiy ruxsat DNS bilan hech qanday aloqasi bo‘lmagan port uzatishlariga ham ruxsat beradi.
Gatewayning o‘z resolveri boshqa kod yo‘li. Mahalliy tarzda chiqarilgan so‘rov OUTPUT orqali o‘tadi, shuning uchun gateway shellidan sinash na PREROUTING qoidasini, na uzatish siyosatini mashq qildiradi. Shuning uchun mahalliy sinov o‘tishi mumkin, har bir mijoz esa muvaffaqiyatsiz bo‘ladi, va buning aksi ham shunchalik keng tarqalgan.
Bu yerda hech narsa 443 portida HTTPS ustidagi DNS ni yoki 853 portida TLS ustidagi DNS ni qamrab olmaydi, IPv6 ni ham qamrab olmaydi. IPv6 resolver sozlangan mijoz butun tuzilmani xursandchilik bilan e’tiborsiz qoldiradi.
Yangi so‘rov nimani isbotlaydi
Ulanish kuzatuvi oldingi xaritalashlarni eslab qoladi, shuning uchun qoida o‘zgarishidan oldin yuborilgan so‘rov eski holatdan javob olib, yangi qoidani buzilgandek ko‘rsatishi mumkin. Yangi manba portidan va mijoz javoblarni keshlaydigan joyda yangi nomdan boshlang.
dig @10.77.0.1 example.com A +short
conntrack -L -p udp --dport 53 | head
Birinchi buyruq mijoz yo‘li umuman hal bo‘ladimi-yo‘qmi ko‘rsatadi, ikkinchisi esa gateway haqiqatda o‘rnatgan tarjimani tuple ning ikkala yo‘nalishi bilan birga ko‘rsatadi. To‘g‘ri resolverga ishora qiladigan, ammo javob hisoblagichi nolda qotib qolgan xaritalash filtr emas, qaytish yo‘li muammosidir.
Biror narsani yo‘naltirishdan oldin resolver siz kutgan nomlarni bilishiga ishonch hosil qiling. Ommaviy nomlarga javob beradigan, ammo sizning xususiy hududingizga javob bermaydigan o‘rinbosar ishlayotgan qidiruvni buzilgan tunnelga o‘xshaydigan NXDOMAIN ga aylantiradi. Mijoz yo‘li ishtirok etishidan oldin resolverni to‘g‘ridan-to‘g‘ri gatewaydan sinab ko‘ring. Va iptables kengaytmalari ma’lumotnomasi bu qoidalar tayanadigan DNAT va masquerade semantikasini hujjatlashtiradi.