WireGuard DNS DNAT: ohranite delujočo pot odgovora
DNAT prepiše cilj, ne vira. Odločite se, kako lahko nadrejeni resolver odgovori, preden dodate pravilo, in vsako ujemanje držite ozko.
Usmerjanje poizvedbe DNS odjemalca WireGuard na drug resolver je videti kot eno pravilo in se obnaša kot tri odločitve. Cilj je treba prepisati, paket je treba poslati naprej in odgovor mora najti pot nazaj skozi stanje prevajanja, ki ga je ustvaril prehod. Izpustite tretje in poizvedba mirno odide, medtem ko odjemalec čaka večno.
Vzemimo primer pooblaščenih odjemalcev v 10.77.0.0/24, ki prihajajo prek wg0, poizvedujejo po oglaševanem naslovu 10.77.0.1 in potrebujejo resolver na 203.0.113.53. Nadrejeni naslov je nadomestni znak za dokumentacijo, ne delujoča storitev.
Preusmeritev poizvedbe spremeni samo njen cilj
Pravilo NAT cilja v PREROUTING prepiše naslov, preden je sprejeta odločitev o usmerjanju, zato je paket nato usmerjen k novemu cilju namesto staremu. Izvorni naslov odjemalca s to operacijo ostane nedotaknjen. Zato lahko pravilo, ki je videti popolno, še vedno povzroči tišino: zahteva zdaj potuje k resolverju, ki ni nikoli slišal za zasebni obseg odjemalca. Prehod je prevedel eno polje in podedoval drugo težavo.
Oba prevoza DNS potrebujeta ustrezna pravila, ker odjemalec preide na TCP, ko je odgovor obrezan.
Spodnja pravila izberejo en vhodni vmesnik, en obseg odjemalcev in en prvotni ciljni naslov. Nič drugega na prehodu ni prizadeto in poizvedba prehoda samega se sploh ne ujema.
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
Pot odgovora je ločena odločitev
Dve ureditvi omogočata, da se odgovor vrne, in zgodnja izbira ene prihrani eno sejo odpravljanja napak. Ali ima nadrejeni resolver pot nazaj v 10.77.0.0/24 skozi ta prehod, ali pa prehod prevede vir na izhodu, tako da odgovor prispe na naslov, ki ga nadrejena stran že pozna. Obe delujeta; le ena ustreza stopnji nadzora, ki ga imate nad nadrejeno stranjo.
Usmerjanje si zasluži prvi poskus, ker ohrani naslov odjemalca viden resolverju in se izogne drugemu sloju prevajanja. Ko je nadrejena stran zunaj vašega nadzora, je prevajanje vira na določenem izhodnem vmesniku praktična izbira.
To prevajanje omejite enako tesno kot preusmeritev, sicer pravilo postane NAT splošnega namena za vse, kar se slučajno ujema z njim:
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
Sledenje povezavam drži preslikavo v paru, zato je odgovor na poti nazaj prepisan nazaj v izvirni tuple odjemalca. Brez izhodnega pravila resolver pošlje svoj odgovor na zasebni naslov, ki ga ne more doseči, in odjemalec vidi potek časa namesto napake.
Pišite pravila ožje, kot je videti naloga
Dovoljenje za posredovanje spada v isti obseg. Dovolite tok od odjemalca do resolverja in povratni promet, ki ga conntrack že prepozna, namesto da sprejmete vsako povezavo DNAT na stroju. Splošno dovoljenje tudi dovoli posredovanja vrat, ki nimajo nič skupnega z DNS.
Lastni resolver prehoda je druga kodna pot. Poizvedba, izdana lokalno, gre skozi OUTPUT, zato testiranje iz lupine prehoda ne vadi niti pravila PREROUTING niti politike posredovanja. Zato lahko lokalni test uspe, medtem ko vsak odjemalec ne uspe, in obratno je enako pogosto.
Nič tukaj ne pokriva DNS prek HTTPS na vratih 443 ali DNS prek TLS na vratih 853 in nič ne pokriva IPv6. Odjemalec z nastavljenim resolverjem IPv6 bo veselo prezrl celotno ureditev.
Kaj dokaže sveža poizvedba
Sledenje povezavam si zapomni prejšnje preslikave, zato je lahko poizvedba, poslana pred spremembo pravila, odgovorjena iz starega stanja in novo pravilo je videti pokvarjeno. Začnite z novimi izvornimi vrati in, kjer odjemalec shranjuje odgovore, z novim imenom.
dig @10.77.0.1 example.com A +short
conntrack -L -p udp --dport 53 | head
Prvi ukaz pokaže, ali se odjemalčeva pot sploh razreši, drugi pa pokaže prevajanje, ki ga je prehod dejansko namestil, vključno z obema smerema tuple. Preslikava, ki kaže na pravi resolver s števcem odgovorov, obtičanim na ničli, je težava povratne poti in ne filtriranja.
Preden kar koli preusmerite, potrdite, da resolver pozna imena, ki jih pričakujete. Nadomestek, ki odgovarja na javna imena, ne pa na vašo zasebno cono spremeni delujoče iskanje v NXDOMAIN, ki je videti kot pokvarjen tunel. Preizkusite resolver neposredno, s prehoda, preden se vključi odjemalčeva pot. In referenca razširitev iptables dokumentira semantiko DNAT in masquerade, na kateri te pravila temeljijo.