WireGuard DNS DNAT: хариу өгөх замыг ажиллагаатай байлгах
DNAT нь очих хаягийг дахин бичдэг, эх үүсвэрийг биш. Дүрмийг нэмэхээс өмнө дээд resolver хэрхэн хариулж чадахыг шийдэж, тохирол бүрийг нарийн байлга.
WireGuard клиентийн DNS асуулгыг өөр resolver руу чиглүүлэх нь нэг дүрэм мэт харагдах боловч гурван шийдвэр мэт ажилладаг. Очих хаягийг дахин бичих, пакетыг дамжуулах, хариулт нь gateway-ийн үүсгэсэн орчуулгын төлөвөөр дамжин буцах замаа олох ёстой. Гурав дахь алхмыг алгасвал асуулга цэвэрхэн явчихна, харин клиент үүрд хүлээх болно.
10.77.0.0/24 доторх зөвшөөрөгдсөн клиентүүд wg0-ээр ирж, зарласан 10.77.0.1 хаягийг асууж, 203.0.113.53 дээр resolver хэрэгтэй байх жишээг авч үзье. Дээд хаяг нь баримтжуулалтын орлуулагч бөгөөд ажиллаж буй үйлчилгээ биш.
Асуулгыг дахин чиглүүлэх нь зөвхөн очих хаягийг өөрчилнө
PREROUTING дахь очих-NAT дүрэм нь маршрутын шийдвэр гарахаас өмнө хаягийг дахин бичдэг тул пакет дараа нь хуучин очих хаяг руу биш, шинэ хаяг руу маршрутлагдана. Клиентийн эх хаяг энэ үйлдлээр хөндөгдөхгүй. Тиймээс бүрэн мэт харагдах дүрэм ч дуугүй байдал үүсгэж болно: хүсэлт одоо клиентийн хувийн хүрээний тухай хэзээ ч сонсож байгаагүй resolver руу явж байна. Gateway нэг талбарыг орчуулж, хоёр дахь асуудлыг өвлөж авлаа.
DNS-ийн хоёр тээвэрт тохирох дүрэм хэрэгтэй, учир нь хариулт тасрагдвал клиент TCP руу буцдаг.
Доорх дүрмүүд нэг ирж буй интерфейс, нэг клиентийн хүрээ, нэг анхны очих хаягийг сонгоно. Gateway дээр өөр юу ч нөлөөлөхгүй бөгөөд gateway-ийн өөрийн асуулга огт тохирохгүй.
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
Хариу өгөх зам нь тусдаа шийдвэр
Хариултыг буцаах хоёр зохион байгуулалт байгаа бөгөөд нэгийг нь эрт сонговол нэг дибаг сесс хэмнэгдэнэ. Нэг бол дээд resolver нь энэ gateway-ээр дамжин 10.77.0.0/24 руу буцах маршруттай, эсвэл gateway гарц дээр эх үүсвэрийг орчуулж, хариулт нь дээд талын аль хэдийн мэддэг хаяг руу хүрнэ. Хоёулаа ажиллана; дээд тал дээрх таны хяналтад зөвхөн нэг нь нийцнэ.
Маршрутлалт эхний оролдлогыг хүртэх ёстой, учир нь клиентийн хаягийг resolver-т харагдахуйц байлгаж, хоёр дахь орчуулгын давхаргаас зайлсхийдэг. Дээд тал таны хяналтаас гадуур бол гарцын тодорхой интерфейс дээр эх үүсвэрийг орчуулах нь практик сонголт.
Тухайн орчуулгыг дахин чиглүүлэлт шиг нарийн хязгаарла, тэгэхгүй бол дүрэм түүнд санамсаргүй тохирох бүх зүйлд зориулагдсан ерөнхий NAT болно:
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
Холболтын хяналт зураглалыг хосоор нь хадгалдаг тул хариулт буцах замд клиентийн анхны tuple руу дахин бичигдэнэ. Гарцын дүрэмгүй бол resolver хариугаа хүрч чадахгүй хувийн хаяг руу илгээж, клиент алдааны оронд хугацаа дуусахыг харна.
Дүрмүүдийг даалгавар харагдахаас нарийн бич
Дамжуулах зөвшөөрөл мөн адил хүрээнд хамаарна. Машин дээрх бүх DNAT холболтыг хүлээн авахын оронд клиентээс resolver руу урсгал болон conntrack-ийн аль хэдийн таньдаг буцах урсгалыг зөвшөөр. Бүх нийтийн зөвшөөрөл нь DNS-тэй ямар ч холбоогүй порт дамжуулалтыг ч зөвшөөрдөг.
Gateway-ийн өөрийн resolver нь өөр кодын зам. Локалд гаргасан асуулга OUTPUT-оор дамждаг тул gateway-ийн shell-ээс турших нь PREROUTING дүрмийг ч, дамжуулалтын бодлогыг ч дадлагажуулахгүй. Тиймээс локал тест тэнцэж байхад бүх клиент бүтэлгүйтэх нь элбэг, эсрэгээр нь ч мөн адил түгээмэл.
Энд юу ч 443 порт дээрх HTTPS дээрх DNS-ийг, 853 порт дээрх TLS дээрх DNS-ийг хамардаггүй, IPv6-г ч хамардаггүй. IPv6 resolver тохируулсан клиент бүх зохион байгуулалтыг баяртайгаар үл тоомсорлоно.
Шинэ асуулга юуг нотолдог
Холболтын хяналт өмнөх зураглалыг санадаг тул дүрэм солихоос өмнө илгээсэн асуулга хуучин төлвөөс хариу авч, шинэ дүрмийг эвдэрсэн мэт харуулж болно. Шинэ эх портоос эхэлж, клиент хариултыг кэш хийдэг газарт шинэ нэрээр эхэл.
dig @10.77.0.1 example.com A +short
conntrack -L -p udp --dport 53 | head
Эхний команд нь клиентийн зам огт шийдэгдэж байгаа эсэхийг, хоёр дахь нь gateway-ийн бодитоор суулгасан орчуулгыг tuple-ийн хоёр чиглэлийн хамт харуулна. Зөв resolver руу заасан ч хариултын тоолуур тэг дээр гацсан зураглал нь шүүлтүүрийн бус, буцах замын асуудал юм.
Ямар нэг зүйлийг дахин чиглүүлэхийн өмнө resolver таны хүлээж буй нэрсийг мэддэг эсэхийг баталгаажуул. Нийтийн нэрсэд хариулдаг ч таны хувийн бүсэд хариулдаггүй орлуулагч ажиллаж буй хайлтыг эвдэрсэн туннель мэт харагдах NXDOMAIN болгон хувиргана. Клиентийн зам оролцохоос өмнө resolver-ийг gateway-ээс шууд турш. Харин iptables өргөтгөлүүдийн лавлагаа эдгээр дүрэм тулгуурладаг DNAT болон masquerade-ийн утга зүйг баримтжуулна.