Presmerovanie portu na peer WireGuard za NAT: DNAT plus SNAT
DNAT doručí požiadavku, ale odpoveď vychádza z nesprávnej adresy. Pridajte zodpovedajúce pravidlo SNAT a obe umiestnite po konfigurácii tunela.
Prehliadač žiada https://203.0.113.10:8443, proxy prijme spojenie a služba na peery WireGuard nikdy neodpovie. Pravidlo DNAT robí svoju prácu; zlyháva časť s odpoveďou. Prejdite paket oboma prekladmi a chýbajúce pravidlo bude zrejmé. Oprava je jeden ďalší príkaz NAT v správnom hooku, nie nový tunel.
Sledujte jednu požiadavku od začiatku do konca
Požiadavka dorazí na verejné rozhranie proxy, so zdrojovou verejnou adresou klienta a cieľovou adresou proxy. V nat PREROUTING pravidlo DNAT prepíše cieľ na adresu tunela peera, 10.90.0.2. Smerovacie rozhodnutie potom pošle paket von cez wg0 a cesta presmerovania je hotová.
Na peery paket teraz nesie pôvodnú verejnú zdrojovú adresu, pretože ju nič neprepísalo. Služba prijme spojenie a odošle odpoveď na svoju vlastnú predvolenú bránu, ktorou je domáci router pred peerom. Ten router nemá stav pre tok, ktorý nikdy nevidel, a buď paket zahodí, alebo ho preloží na svoju vlastnú verejnú adresu, čo klient neprijme.
Asymetria je celý problém: požiadavka ide cez proxy a odpoveď sa snaží ísť priamo. Sledovanie spojení na proxy pomôže len vtedy, keď sa odpoveď vracia cez proxy, a vrátiť sa tam nemôže, kým zdrojová adresa stále ukazuje na pôvodného klienta.
Pridajte spätný preklad
Prepíšte zdroj presmerovaného toku na adresu tunela proxy, skôr než odíde k peerovi. Služba potom odpovie na 10.90.0.1, proxy to prijme a sledovanie spojení obráti oba preklady, kým sa paket vráti klientovi.
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1Pravidlo POSTROUTING je zámerne úzke: zodpovedá preloženému cieľu a rozhraniu tunela, takže neprepisuje nesúvisiacu premávku, ktorá náhodou odchádza cez wg0. Široké pravidlo masquerade by tiež skrylo adresu klienta, ale urobilo by to pre každý tok a sťažilo audit tabuľky NAT.
Umiestnite pravidlá tam, kde tunel existuje
Pravidlá odkazujúce na adresu alebo rozhranie tunela musia bežať po tom, čo ho wg-quick nakonfiguruje. Rozhranie sa vytvorí pred PreUp, ale adresy, MTU, DNS a trasy sa aplikujú až potom a PostUp beží, keď je všetko na mieste. Pridania dajte do PostUp a mazania do PreDown.
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PreDown = iptables -t nat -D POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1Mazania musia zodpovedať pridaniam token po tokene, vrátane zhôd multiport a rozhrania. Mazanie, ktoré sa líši v jednej zhode, nič neodstráni a ďalšie opätovné pripojenie pridá druhú kópiu pravidla. Po niekoľkých opätovných pripojeniach obsahuje tabuľka duplikáty, ktoré sa ťažko priraďujú k riadku konfigurácie.
Výsledok skontrolujte pomocou iptables -t nat -S po opätovnom pripojení. Ak sa to isté pravidlo objaví dvakrát, riadok PreDown nezodpovedá a čistenie ticho zlyháva.
Presmerovanie, filtrovanie a ten druhý NAT
Trvalo zapnite presmerovanie IPv4 a potom povoľte presmerovaný tok v tabuľke filtra. DNAT prebieha pred reťazcom FORWARD, takže pravidlo filtra zodpovedá preloženému cieľu, nie verejnej adrese. Ak firewall spravuje UFW, vyjadrite povolenie ako pravidlo trasy; bežné pravidlo hostiteľa presmerovanú premávku nepokryje.
Dve ďalšie vrstvy NAT môžu cestu stále zlomiť, aj keď sú pravidlá proxy správne. Pri domácom pripojení verejná adresa patrí routeru a otvorenie portu v jeho firewalle nie je to isté ako vytvorenie záznamu presmerovania portu, ktorý ten port pošle na proxy. Port, ktorý zvonku vyzerá otvorený, kým nič neodpovedá, často práve toto mapovanie nemá.
Na NAT VPS poskytovateľ mapuje verejný port na privátnu adresu. Mapovanie musí zodpovedať portu, ktorý inzerujete, a nesúlad vyzerá rovnako ako pokazený tunel. Pred zmenou konfigurácie WireGuard potvrďte mapovanie u poskytovateľa.
Overte spätnú cestu a prijmite cenu
Pripojte sa zo siete, ktorá nie je LAN proxy, a potom preskúmajte dvojicu prekladov, kým je spojenie otvorené:
conntrack -L -p tcp --dport 8080
tcpdump -ni any tcp port 8080Záznam conntrack by mal zobrazovať pôvodný tuple, preložený tuple a smer odpovede. Ak odpoveď chýba, peer neposiela cez tunel, čo zvyčajne znamená, že sa pravidlo SNAT neuplatnilo alebo že vlastný firewall peera tok zahodil.
Raz reštartujte, aby ste dokázali, že PostUp znova aplikuje pravidlá, potom tunel zastavte a potvrďte, že ich PreDown odstránil. Mŕtve pravidlá, ktoré prežijú odpojenie, sú dôvodom, prečo sa neskoršia zmena správa nepredvídateľne.
Nakoniec prijmite, čo SNAT stojí. Služba vidí každú požiadavku ako prichádzajúcu z proxy, takže prístupové logy, limity rýchlosti na klienta a zoznamy povolených adries už používateľov nerozlišujú. Prípad hairpin potrebuje vlastný preklad zdroja pre klientov v LAN proxy. Ak peer potrebuje skutočné adresy klientov, alternatívou je spätná trasa do klientskej siete, čo je viac práce, ale zachováva informáciu.