WireGuard DNS DNAT: hoidke vastusetee töös
DNAT kirjutab ümber sihtkoha, mitte allika. Otsustage, kuidas ülemvoolu resolver saab vastata, enne reegli lisamist, ja hoidke iga sobivus kitsas.
WireGuardi kliendi DNS-päringu suunamine teisele resolverile näeb välja nagu üks reegel ja käitub nagu kolm otsust. Sihtkoht tuleb ümber kirjutada, pakett tuleb edasi saata ja vastus peab leidma tee tagasi läbi lüüsi loodud tõlkeoleku. Jätke kolmas vahele ja päring lahkub puhtalt, samal ajal kui klient ootab igavesti.
Võtke näide 10.77.0.0/24-s asuvatest volitatud klientidest, kes saabuvad läbi wg0, pärib reklaamitud aadressi 10.77.0.1 ja vajab resolverit aadressil 203.0.113.53. Ülemvoolu aadress on dokumentatsiooni kohatäide, mitte töötav teenus.
Päringu ümbersuunamine muudab ainult selle sihtkohta
Sihtkoha-NAT-i reegel PREROUTING-is kirjutab aadressi ümber enne marsruutimisotsuse tegemist, nii et pakett marsruuditakse seejärel vana asemel uue sihtkoha suunas. Kliendi lähteaadress jääb selle toimingu käigus puutumata. Sellepärast võib täielikuna näiv reegel siiski vaikust tekitada: päring rändab nüüd resolveri juurde, kes pole kunagi kliendi privaatsest vahemikust kuulnud. Lüüs tõlkis ühe välja ja päris teise probleemi.
Mõlemad DNS-transpordid vajavad sobivaid reegleid, sest klient läheb TCP-le üle, kui vastust kärbitakse.
Allolevad reeglid valivad ühe sissetuleva liidese, ühe kliendivahemiku ja ühe algse sihtkoha aadressi. Midagi muud lüüsis ei mõjutata ja lüüsi enda päring ei sobi üldse.
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
Vastusetee on eraldi otsus
Kaks lahendust lasevad vastusel tagasi tulla ja ühe varajane valimine säästab silumisseansi. Kas ülemvoolu resolveril on marsruut tagasi 10.77.0.0/24-sse läbi selle lüüsi, või tõlgib lüüs allika väljundil, nii et vastus jõuab aadressile, mida ülemvool juba teab. Mõlemad töötavad; ainult üks vastab kontrollile, mis teil ülemvoolu üle on.
Marsruutimine väärib esimest katset, sest see hoiab kliendi aadressi resolverile nähtavana ja väldib teist tõlkekihti. Kui ülemvool on väljaspool teie kontrolli, on allika tõlkimine konkreetsel väljundliidesel praktiline valik.
Piirake seda tõlget sama kitsalt kui ümbersuunamist, muidu muutub reegel üldotstarbeliseks NAT-iks kõige jaoks, mis sellega juhtumisi sobib:
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
Ühenduste jälgimine hoiab vastenduse paaris, nii et vastus kirjutatakse tagasiteel ümber kliendi algseks korteežiks. Ilma väljundreeglita saadab resolver oma vastuse privaatsele aadressile, kuhu ei jõua, ja klient näeb vea asemel aegumist.
Kirjutage reeglid kitsamalt, kui ülesanne paistab
Edasisaatmise luba kuulub samasse ulatusse. Lubage klient-resolveri voog ja tagastusliiklus, mida conntrack juba tunneb, selle asemel et masinas iga DNAT-ühendust vastu võtta. Üldine lubamine annab loa ka portide edasisaatmisele, millel pole DNS-iga midagi pistmist.
Lüüsi enda resolver on teine kooditee. Kohapeal väljastatud päring läbib OUTPUT-i, nii et lüüsi shellist testimine ei harjuta ei PREROUTING-reeglit ega edasisaatmispoliitikat. Sellepärast võib kohalik test läbida, samal ajal kui iga klient ebaõnnestub, ja vastupidine on sama tavaline.
Siin ei käsitleta DNS-i üle HTTPS-i pordil 443 ega DNS-i üle TLS-i pordil 853, samuti mitte IPv6-t. IPv6 resolveriga konfigureeritud klient eirab kogu lahendust heameelega.
Mida tõestab värske päring
Ühenduste jälgimine mäletab varasemaid vastendusi, nii et enne reeglimuudatust saadetud päring võib saada vastuse vanast olekust ja panna uue reegli katkisena näima. Alustage uue lähteportiga ja, kus klient vastuseid vahemällu salvestab, uue nimega.
dig @10.77.0.1 example.com A +short
conntrack -L -p udp --dport 53 | head
Esimene käsk näitab, kas klienditee üldse laheneb, ja teine näitab tõlget, mille lüüs tegelikult paigaldas, sealhulgas korteeži mõlemat suunda. Õigele resolverile osutav vastendus, mille vastuseloendur on nulli juurde kinni jäänud, on tagasitee probleem, mitte filtreerimise probleem.
Enne millegi ümbersuunamist kinnitage, et resolver teab nimesid, mida ootate. Asendus, mis vastab avalikele nimedele, aga mitte teie privaatsele tsoonile muudab töötava otsingu NXDOMAIN-iks, mis näeb välja nagu katkine tunnel. Testige resolverit otse lüüsist, enne kui klienditee mängu tuleb. Ja iptablesi laienduste viide dokumenteerib DNAT-i ja masquerade'i semantika, millest need reeglid sõltuvad.