WireGuard DNS DNAT: pidä vastauspolku toiminnassa
DNAT kirjoittaa uudelleen kohteen, ei lähdettä. Päätä, miten ylävirran resolver voi vastata ennen säännön lisäämistä, ja pidä jokainen osuma suppeana.
WireGuard-asiakkaan DNS-kyselyn ohjaaminen toiselle resolverille näyttää yhdeltä säännöltä ja käyttäytyy kuin kolme päätöstä. Kohde on kirjoitettava uudelleen, paketti on välitettävä, ja vastauksen on löydettävä tiensä takaisin yhdyskäytävän luoman käännöstilan läpi. Jätä kolmas väliin, niin kysely lähtee siististi ja asiakas odottaa ikuisesti.
Otetaan esimerkki valtuutetuista asiakkaista 10.77.0.0/24-verkossa, jotka saapuvat wg0-kautta, kysyvät mainostettua osoitetta 10.77.0.1 ja tarvitsevat resolverin osoitteessa 203.0.113.53. Ylävirran osoite on dokumentaation paikkamerkki, ei toimiva palvelu.
Kyselyn uudelleenohjaus muuttaa vain sen kohdetta
PREROUTINGin kohde-NAT-sääntö kirjoittaa osoitteen uudelleen ennen reitityspäätöstä, joten paketti reititetään sen jälkeen uuteen kohteeseen vanhan sijaan. Asiakkaan lähdeosoite jää tästä toimenpiteestä koskemattomaksi. Siksi täydelliseltä näyttävä sääntö voi silti tuottaa hiljaisuuden: pyyntö matkustaa nyt resolverille, joka ei ole koskaan kuullut asiakkaan yksityisestä alueesta. Yhdyskäytävä käänsi yhden kentän ja peri toisen ongelman.
Molemmat DNS-kuljetukset tarvitsevat vastaavat säännöt, koska asiakas palaa TCP:hen, kun vastausta katkaistaan.
Alla olevat säännöt valitsevat yhden saapuvan liittymän, yhden asiakasalueen ja yhden alkuperäisen kohdeosoitteen. Mikään muu yhdyskäytävässä ei muutu, eikä yhdyskäytävän oma kysely osu lainkaan.
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
Vastauspolku on erillinen päätös
Kaksi järjestelyä sallii vastauksen palata, ja yhden valitseminen ajoissa säästää virheenjäljitysistunnon. Joko ylävirran resolverilla on reitti takaisin 10.77.0.0/24-verkkoon tämän yhdyskäytävän kautta, tai yhdyskäytävä kääntää lähteen ulospäin niin, että vastaus saapuu osoitteeseen, jonka ylävirta jo tuntee. Molemmat toimivat; vain toinen vastaa hallintaa, joka sinulla on ylävirtaan.
Reititys ansaitsee ensimmäisen yrityksen, koska se pitää asiakkaan osoitteen resolverin nähtävänä ja välttää toisen käännöskerroksen. Kun ylävirta on hallintasi ulkopuolella, lähteen kääntäminen tietyssä lähtöliittymässä on käytännöllinen valinta.
Rajaa käännös yhtä tiukasti kuin uudelleenohjaus, tai säännöstä tulee yleiskäyttöinen NAT kaikelle, mikä sattuu osumaan siihen:
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
Yhteyksien seuranta pitää kartoituksen parina, joten vastaus kirjoitetaan takaisin asiakkaan alkuperäiseksi monikoksi paluumatkalla. Ilman lähtösääntöä resolver lähettää vastauksensa yksityiseen osoitteeseen, johon se ei pääse, ja asiakas näkee aikakatkaisun virheen sijaan.
Kirjoita säännöt kapeammiksi kuin tehtävä näyttää
Välityslupa kuuluu samaan laajuuteen. Salli asiakkaalta resolverille suuntautuva virta ja paluuliikenne, jonka conntrack jo tunnistaa, sen sijaan että hyväksyisit jokaisen DNAT-yhteyden koneella. Yleinen hyväksyntä valtuuttaa myös porttien välitykset, joilla ei ole mitään tekemistä DNS:n kanssa.
Yhdyskäytävän oma resolver on eri koodipolku. Paikallisesti lähetetty kysely kulkee OUTPUTin kautta, joten yhdyskäytävän kuoresta testaaminen ei harjoita PREROUTING-sääntöä eikä välityskäytäntöä. Siksi paikallinen testi voi mennä läpi, vaikka jokainen asiakas epäonnistuu, ja päinvastoin on yhtä tavallista.
Mikään tässä ei kata DNS:ää HTTPS:n yli portissa 443 tai DNS:ää TLS:n yli portissa 853, eikä mikään kata IPv6:ta. Asiakas, jolla on määritetty IPv6-resolver, jättää koko järjestelyn iloisesti huomiotta.
Mitä tuore kysely todistaa
Yhteyksien seuranta muistaa aiemmat kartoitukset, joten ennen sääntömuutosta lähetetty kysely voidaan vastata vanhasta tilasta ja saada uusi sääntö näyttämään rikkinäiseltä. Aloita uudella lähdeportilla ja, missä asiakas välimuistittaa vastauksia, uudella nimellä.
dig @10.77.0.1 example.com A +short
conntrack -L -p udp --dport 53 | head
Ensimmäinen komento näyttää, ratkeaako asiakaspolku lainkaan, ja toinen näyttää käännöksen, jonka yhdyskäytävä todella asensi, mukaan lukien monikon molemmat suunnat. Oikeaan resolveriin osoittava kartoitus, jonka vastauslaskuri on juuttunut nollaan, on paluupolun ongelma eikä suodatusongelma.
Vahvista, että resolver tuntee odottamasi nimet ennen kuin ohjaat mitään uudelleen. Korvaava ratkaisu, joka vastaa julkisiin nimiin mutta ei yksityiseen vyöhykkeeseesi muuttaa toimivan haun NXDOMAINiksi, joka näyttää rikkinäiseltä tunnelilta. Testaa resolveria suoraan yhdyskäytävästä ennen kuin asiakaspolku on mukana. Ja iptables-laajennusten viite dokumentoi DNAT- ja masquerade-semantiikan, josta nämä säännöt riippuvat.