WireGuard DNS DNAT: жауап жолын жұмысқа қабілетті ұстаңыз
DNAT мақсатты қайта жазады, бастауды емес. Ережені қоспас бұрын жоғарғы resolver қалай жауап бере алатынын шешіңіз және әр сәйкестікті тар ұстаңыз.
WireGuard клиентінің DNS сұрауын басқа resolver-ге бағыттау бір ережеге ұқсайды, бірақ үш шешім сияқты әрекет етеді. Мақсатты қайта жазу керек, пакетті жіберу керек, ал жауап шлюз жасаған аударма күйі арқылы қайта оралу жолын табуы керек. Үшіншісін өткізіп жіберсеңіз, сұрау таза шығады, ал клиент мәңгі күтеді.
10.77.0.0/24 ішіндегі рұқсат етілген клиенттердің wg0 арқылы келіп, жарияланған 10.77.0.1 мекенжайын сұрайтынын және 203.0.113.53 мекенжайында resolver қажет ететінін мысалға алайық. Жоғарғы мекенжай құжаттама үшін орын толтырғыш, жұмыс істеп тұрған қызмет емес.
Сұрауды қайта бағыттау тек оның мақсатын өзгертеді
PREROUTING ішіндегі мақсаттық NAT ережесі маршруттау шешімі қабылданғанға дейін мекенжайды қайта жазады, сондықтан пакет кейін ескінің орнына жаңа мақсатқа бағытталады. Клиенттің бастау мекенжайы бұл операциядан тиіспей қалады. Сондықтан толық көрінетін ереже де үнсіздік тудыруы мүмкін: сұрау енді клиенттің жеке диапазоны туралы ешқашан естімеген resolver-ге барады. Шлюз бір өрісті аударды және екінші мәселені мұра етті.
DNS-тің екі тасымалына да сәйкес ережелер қажет, өйткені жауап қысқартылғанда клиент TCP-ге қайтады.
Төмендегі ережелер бір кіріс интерфейсін, бір клиент диапазонын және бір бастапқы мақсат мекенжайын таңдайды. Шлюзде басқа ештеңе әсер етпейді, ал шлюздің өз сұрауы мүлдем сәйкес келмейді.
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-дің осы шлюз арқылы 10.77.0.0/24-ке қайта оралатын маршруты бар, не шлюз шығыста бастауды аударады, сондықтан жауап жоғарғы жақ бұрыннан білетін мекенжайға жетеді. Екеуі де жұмыс істейді; тек біреуі жоғарғы жаққа қатысты бақылауыңызға сәйкес келеді.
Маршруттау бірінші әрекетке лайық, өйткені ол клиенттің мекенжайын 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-ке қатысы жоқ порттарды жіберуге де рұқсат береді.
Шлюздің өз resolver-і басқа код жолы. Жергілікті шығарылған сұрау OUTPUT арқылы өтеді, сондықтан шлюз 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
Бірінші команда клиент жолының мүлдем шешілетінін көрсетеді, ал екіншісі шлюз шын мәнінде орнатқан аударманы tuple-дің екі бағытымен қоса көрсетеді. Дұрыс resolver-ге нұсқайтын, бірақ жауап санауышы нөлде тұрып қалған бейнелеу — сүзгі емес, қайтар жол мәселесі.
Бірдеңені қайта бағыттамас бұрын resolver сіз күтетін атауларды білетінін растаңыз. Қоғамдық атауларға жауап беретін, бірақ сіздің жеке аймағыңызға жауап бермейтін балама жұмыс істеп тұрған іздеуді сынған туннельге ұқсайтын NXDOMAIN-ға айналдырады. Клиент жолы араласпас бұрын resolver-ді тікелей шлюзден тексеріңіз. Ал iptables кеңейтімдерінің анықтамасы осы ережелерге негіз болатын DNAT және masquerade семантикасын құжаттайды.