Port forward na Wireguard klienta

Port forward na Wireguard klienta
« kdy: 14. 09. 2022, 11:35:20 »
Zdravím páni, potrebujem poradiť lebo som sa nejak zasekol.

Mám VPS s Ubuntu na ktorom beží Wireguard server. Na ten Wireguard server sa pripojím z Wireguard klienta vo Widnows 10, ktorý beží na prípojke s privátnou IP. Na windowse je potom program, ktorý ma WebUI na porte 8080. Mojim cieľom je forwardnúť port 8080 z verejnej IP VPS na IP Wireguard klienta vo Windowse aby WebUI daného programu bolo dostupné z internetu. Ping z WG klienta na WG server a naopak mi beží.

Verejná IP VPS: 144.10.20.30.
VPS nemá verejnú adresu priamo na svojom rozhraní. Medzi VPS a verejnou IP je ešte akýsi network manager s firewalom, kde je NAT 1:1 a vo firewale sú otvorené všetky porty. Toto funguje.
IP na sieťovke VPS: 10.1.1.1/24
IP WG servera: 10.2.3.1/24
IP WG klienta: 10.2.3.2/24

Služba vo windows beží na porte 8080 a pomocou "curl 10.2.3.2:8080" z VPS sa na ňu dostanem.
Rovnakú službu som nainštaloval aj na VPS (na testovanie priechodnosti) ale na porte 9090. Na tú sa z Widowsu cez 10.2.3.1:9090 nedostanem.

Vygooglil som, že aby som sa dostal z verejnej IP na službu za WG klientom, musím do iptable pridať pravidlo:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -d 10.1.1.1 -p tcp --dport 8080 -j DNAT --to-dest 10.2.3.2:8080
iptables -t nat -A POSTROUTING -d 10.2.3.2 -p tcp --dport 8080 -j SNAT --to-source 10.2.3.1

Po pridaní sa na službu ale nedostanem, tak som skúsil pridať pravidlo vďaka ktorému by som sa mal dostať na WebUI služby bežiacej priamo na VPS pod portom 9090:
iptables -A INPUT -p tcp --dport 9090 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 9090 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Táto služba nie je dostupná na Windowse cez 10.2.3.1:9090 ani cez 144.10.20.30:9090. Ak ale pridám do iptables pravidlo:
iptables -I INPUT -j ACCEPT
tak sa na WebUI bežiacom na VPS pod portom 9090 dostanem cez 10.2.3.1:9090 aj cez 144.10.20.30:9090. Na službu na WG klientovi sa ale nedostanem. Dokonca ani cez "curl 10.1.1.1:8080" alebo "curl 144.10.20.30:8080"

Viete ma prosím nasmerovať, kde robím chybu alebo ako diagnostikovať na čom to stojí? S iptables robím prvý krát, samozrejme ich zadávam so sudo. Celé sa mi to javí ako by žiadne z tých pravidiel okrem "iptables -I INPUT -j ACCEPT" nemalo žiaden účinok.

Ďakujem
« Poslední změna: 14. 09. 2022, 11:39:22 od Daevid »


Re:Port forward na Wireguard klienta
« Odpověď #1 kdy: 14. 09. 2022, 13:08:56 »
UPDATE, koukám, že krok 3 jsi zkoušel, ale mazat už to nebudu. Taky zálečí, odkud to zkoušíš, logicky připojit se na 10.3.2.1, půjde z vps, pokud na 144.xxx, tak to pujde odkudkoli (z VPS je to diskutabilní, když má ten WTF NAT)

Opravdu bych koukl na nutnost keepalive a na allowed-ips, a jaké adresy ti chodí.

Z pohledu Wireguarda žádné rozlišování server/klient není. Jen na to upozorňuji, samozřejmě, sématnicky  to je lepší pro orientaci.

Mohou tu být problémy:
1.  připojení na internet windows počítače nemá asi veřejnou IP. Kdyby mělo, tak nepotřebuješ žádný VPS. Proto v konfiguraci klienta(WIN) je potřeba u peera VPS zadat wg set persistent-keepalive (v příkazu wg)( PersistentKeepalive = N v wg.conf) N ( obvykle o fous méně než 120), protože obvykle se udp spojení po cestě rozpadne do 2 minut.
Jak se to pozná:  z klienta se na VPS připojíš, ale z VPS na klienta ne, nebo jen do dvou minut, co naposled klient komunikoval a to ty potřebuješ, protože vps bude vytáčet klienta

Další věc, kromě generického sysctl ip forward 1 taky je potřeba(na tom serveru se podívat na iptables -L FORWARD jestli povolen FORWARD mezi   eth0 a wg0  a FORWARD mezi wg0 a eth 0 (liší se to prohozením -i a -o  nebo  záleží jestli to třeba řešíš pomocí IP adres)
 Nebo můžeš dát rovnou iptables -P FORWARD ACCEPT (což je takový vtípek bezpečnostní), ale pro zkoušku můžeš, jinak není moudrý si na serveru takhle FORWARD otevřít bez omezeníJestli se pletu, opravte mě, stejně i best practice, jestli pro forwarding uvádět radši -i/-o nebo -dst/-src/obojí


3.věc ve wireguarduale přečti si to celé ! tohle  taky nejde udělat jen tak bez dalších navazujíchích kroků z hlediska bezpečnosti na klientovi je třeba povolit allowed-ips (u peera) 0.0.0.0, protože se k ti na ten port bude připojovat kdokoli, má li jít o veřejnou službu. COž s sebou nese 2 problémy - wireguard to vyhodnotí jako výchozí bránu (při wg-quick tuším, při ručním vytvoření wg0 přes ip, konfiguraci wg set a ip rooute add ne)  a taky by bylo  dobro záhodno  následně si ve firewallu (FORWARD)  omezit, co se bude forwardovat, (všiml sis že tohle můžeš nastavit na serveru i na klientu, kde to má asi lepší smysl? když to nastavíš na klientovi, tak ti do to dunelu budou proudit i data, která bys zařízl rovnou na serveru)
--- ALTERNATIVA- udělat na serveru NAT . Pak ti budou ale chodit všechny requesty z jedné IP.
Uvedu příklad, je trochu jiný( port 8080 směruje na 443)
Kód: [Vybrat]
iptables -I POSTROUTING  -t na
t  -p tcp --dport 443 -o wgT -d 192.168.1.KOMP -j SNAT --to
 10.9.0.X                 
iptables -I PREROUTING  -t nat  -p tcp
--dport 8080 -j DNAT --to 192.168.1.KOMP:443

Návod není uplně šitý na míru, jelikož to používám trochu jinak (wireguard klient není přímo koncový PC, ale router, takže tam jsou ještě nějaký čachry )

Klidně mi rozmluvte co se vám nezdá, navrhněte lepší řešení .

« Poslední změna: 14. 09. 2022, 13:12:56 od Ħαℓ₸℮ℵ ␏⫢ ⦚ »

_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Port forward na Wireguard klienta
« Odpověď #2 kdy: 14. 09. 2022, 14:10:39 »
Viete ma prosím nasmerovať, kde robím chybu alebo ako diagnostikovať na čom to stojí?
Potřebuješ si spustit "tcpdump -ni wg0 port 80" na VPS a na WG klientovi (pro Windows je Wireshark) a koukat jak pakety tečou. Podle mě zjistíš, že VPS spojení DNATuje, ale nemaškaráduje, tj. na WG klienta přijde paket se src adresou nikoli VPS ve WG tunelu, ale venkovního klienta co se snaží na tu službu dostat. A WG klient se pokusí odpovědět přímo na tuto adresu, ale protože paket bude mít jinou zdrojovou adresu než VPS kam klient leze, tak se nepřiřadí k navazovanému TCP spojení a zahodí se.

A řešení je maškarádovat: iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

Jak píše komentář nade mnou je ještě potřeba mít povolený forward, ale ten je defaultně povolený myslím; případně sem pošli výstup iptables-save

Předpokládám že takové věci jako "WG klient z VPS pingá" sis už ověřil
« Poslední změna: 14. 09. 2022, 14:12:51 od _Jenda »

Re:Port forward na Wireguard klienta
« Odpověď #3 kdy: 14. 09. 2022, 16:30:50 »
Ďakujem Vám za vaše rady. Bez nich by som to veru nerozbehal.

V prvom rade som pomocou uvedeného príkazu tcpdump zistil že sa mi packety nepreklápajú do WG0 rozhrania.
Problém bol v tom že som veru nemal spravený forward medzi rozhraniami ale aj pravidlá pre iptables ktoré som použil boli nesprávne. Následne keď už sa mi packety preklápali do WG0, tak som pomocou Wiresharku zistil presne spomínaný jav, že packety prichádzali s verejnou IP VPS ako zdrojovou IP (kde sa tam dostala mi je záhada). Toto vyriešilo pravidlo pre maškarádu.

Pre úplnosť teda pridávam použité pravidlá:
sudo iptables -I FORWARD -i wg0 -o enp0s3 -j ACCEPT
sudo iptables -I FORWARD -i enp0s3 -o wg0 -j ACCEPT
sudo iptables -I PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to 10.2.3.2:8080
sudo iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
V tomto stave mi to funguje.

K pôvodnému dotazu ešte dodám, že pôvodný príkaz iptables -I INPUT -j ACCEPT som nahradil týmto:
sudo iptables -I INPUT -p tcp --dport 9090 -j ACCEPT
sudo iptables -I OUTPUT -p tcp --dport 9090 -j ACCEPT
aby neostali všetky porty otvorené.

Ak v uvedenej konfigurácii uvidíte ešte nejaký problém, budem rád ak ma opravíte.

Re:Port forward na Wireguard klienta
« Odpověď #4 kdy: 28. 09. 2022, 11:57:42 »
Pokud je přesměrování jen dočasné, raději použí k tomu socut, protože to je mnohem jednodušší než přes nftables nebo iptables.

Na serveru spustím:
 socat TCP-LISTEN:444,fork TCP:192.168.0.205:80

A udělá to to, že port 444 to přesměruje na uvedenou ip adresu a port. Stačí aby byla ze serveru dostupná ze serveru.
Tím, že si to pustím jen na tu chvíli kdy to potřebuji, to může být též bezpečnější. Ukončím to pomocí CTRL+C.


_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Port forward na Wireguard klienta
« Odpověď #5 kdy: 28. 09. 2022, 21:21:01 »
Ještě reuseaddr. Každopádně jsem to taky používal a problém je při dlouhodobějším použití že tam je hromada dětí co jsou zaseknuté a nechtějí skončit. Používáme to v práci na náhodné SSHčkování a za poslední měsíc vidím 50 procesů co vytuhly. Nevím jestli se to stane když protistrana vytimeoutuje a proč to nevytimeoutuje po čase celé a neskončí to.

Re:Port forward na Wireguard klienta
« Odpověď #6 kdy: 29. 09. 2022, 13:12:20 »
Celý problém bude v tom, že windows klient má výchozí bránu na lokálním připojení. Tedy požadavek skrze VPS projde na klienta, ale odpověď odchází ne skrze wg tunel, ale skrze lokální připojení k internetu.
Řešení mohou být 2:
1) změnit routování na klientovi tak, aby to síťově fungovalo (static routa skrze lokální připojení k vps a GW skrze wg0), což ale pravděpodobně bude mít další konsekvence - nicméně nedávno jsem to třeba použil v jednom LABu
2) nedělat portforward, ale udělat na VPS reverzní proxy a ten provoz odbavovat pomocí jí (nejspíše dlouhodoběji udržitelné řešení)

EDIT: koukám, že Jenda již zmínil maškarádu. Také řešení, ale pro webový provoz mi přijde lepší ta reverzní proxy.
« Poslední změna: 29. 09. 2022, 13:15:08 od Pheella »

Re:Port forward na Wireguard klienta
« Odpověď #7 kdy: 29. 09. 2022, 13:54:05 »
Pozor s Wireguardem to není jen o iptables, ale je nutné upravit i config u peera
já to mam v podobném duchu takto

[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 192.168.22.5/32, 10.0.0.0/19