Fórum Root.cz
Hlavní témata => Sítě => Téma založeno: waclaw 02. 01. 2024, 07:37:45
-
Ahoj,
rád bych požádal o radu jak provést přesměrování portu pomocí iptables v následujícím příkladu.
Zařízení RPi4 (libreelec) má dvě rozhraní eth0 (192.168.34.0/24) - lokální ethernet a wg0 (10.9.0.33) - VPN tunel do jiné sítě. Na zařízení není žádný firewall, porty nejsou nijak blokované, forwarding je zapnut.
Chtěl bych přesměrovat port 8007 na wg0, na zařízení s adresou 192.168.34.7:80.
Pokoušel jsem se, ale bohužel se mi to nedaří.
Jak se zdá, tak následující nestačí:
iptables -t nat -A PREROUTING -i wg0 -p tcp --dport 8007 -j DNAT --to-destination 192.168.34.7:80
Z wireguard sítě je port 8007 filtrován...
# nmap 10.9.0.33 -p 8007
Starting Nmap 7.93 ( https://nmap.org ) at 2024-01-02 07:35 CET
Nmap scan report for 10.9.0.33
Host is up (0.0084s latency).
PORT STATE SERVICE
8007/tcp filtered ajp12
Předem děkuji za postrčení.
-
A ses si jistej, ze ten nmap posila data na ten spravnej stroj?
-
Jak se zdá, tak následující nestačí:
iptables -t nat -A PREROUTING -i wg0 -p tcp --dport 8007 -j DNAT --to-destination 192.168.34.7:80
Zajímavá by byla informace, kam až se pakety dostanou, cestou tam a zpátky. Od pantáty vedou dráty.
Otevřete si několik terminálových relací (SSH?) a pusťte si v nich tcpdump na jedno a druhé rozhraní. Je dobré, zároveň si odstranit z výhledu záclonu SSH provozu.
tcpdump -n -i wg0 port not 22
Pak zkuste nějaký provoz. Než nmap, radši používám telnet na port.
telnet 10.9.0.33 8007
K ukončení slouží: do navázání CTRL+C, po navázání CTRL+] a následně povel quit.
Dále by byl zajímavý výstup "iptables -L" . Jakoupak "policy" má chain Forward?
Jo a pokud byste hledal své NATové pravidlo, tak "iptables -t nat -L".
Případně, pro vypsání skutečně všech opšen na každém řádku doporučuji přidat ještě -v (verbose).
Obvyklá chyba je, že cíl uvnitř za NATem nemá správně default gateway resp. specifický route.
-
A ses si jistej, ze ten nmap posila data na ten spravnej stroj?
Ano, wg0 na RPi4 ma 10.9.0.33. Jine sluzby, ktere tam bezi v dockeru, jsou normalne dostupne na 80xx, jen se mi nedari udelat to presmerovani na jiny stroj v eth0 siti za RPi4.
-
Diky za tipy, tady jsou vysledky...
telnet 10.9.0.33 8007 z wg site na RPi4 ukaze
# tcpdump -n -i wg0 port not 22
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on wg0, link-type RAW (Raw IP), snapshot length 262144 bytes
09:16:48.015476 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656499737 ecr 0,nop,wscale 9], length 0
09:16:49.052739 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656500775 ecr 0,nop,wscale 9], length 0
09:16:50.076939 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656501799 ecr 0,nop,wscale 9], length 0
09:16:51.100906 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656502823 ecr 0,nop,wscale 9], length 0
09:16:52.124965 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656503847 ecr 0,nop,wscale 9], length 0
09:16:53.148508 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656504871 ecr 0,nop,wscale 9], length 0
09:16:55.197662 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656506920 ecr 0,nop,wscale 9], length 0
09:16:59.232050 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656510951 ecr 0,nop,wscale 9], length 0
09:17:07.293972 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656519016 ecr 0,nop,wscale 9], length 0
09:17:23.676975 IP 10.9.0.1.46968 > 10.9.0.33.8007: Flags [S], seq 1552326368, win 33120, options [mss 1380,sackOK,TS val 3656535399 ecr 0,nop,wscale 9], length 0
# iptables -v -L
Chain INPUT (policy ACCEPT 18207 packets, 19M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 22 packets, 1224 bytes)
pkts bytes target prot opt in out source destination
715 370K DOCKER-USER all -- any any anywhere anywhere
715 370K DOCKER-ISOLATION-STAGE-1 all -- any any anywhere anywhere
342 263K ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
5 260 DOCKER all -- any docker0 anywhere anywhere
346 106K ACCEPT all -- docker0 !docker0 anywhere anywhere
0 0 ACCEPT all -- docker0 docker0 anywhere anywhere
Chain OUTPUT (policy ACCEPT 13987 packets, 1706K bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
5 260 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:8036
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
346 106K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 anywhere anywhere
715 370K RETURN all -- any any anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any docker0 anywhere anywhere
346 106K RETURN all -- any any anywhere anywhere
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
715 370K RETURN all -- any any anywhere anywhere
vypada, ze FORWARD ma drop, ale jak mu nastavit pravidlo pro muj pripad netusim
# iptables -v -t nat -L
Chain PREROUTING (policy ACCEPT 33 packets, 10833 bytes)
pkts bytes target prot opt in out source destination
110 22768 DOCKER all -- any any anywhere anywhere ADDRTYPE match dst-type LOCAL
22 1224 DNAT tcp -- wg0 any anywhere anywhere tcp dpt:8007 to:192.168.34.7:80
Chain INPUT (policy ACCEPT 31 packets, 10443 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 142 packets, 26198 bytes)
pkts bytes target prot opt in out source destination
129 43730 DOCKER all -- any any anywhere !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 132 packets, 21388 bytes)
pkts bytes target prot opt in out source destination
67 22088 MASQUERADE all -- any !docker0 172.17.0.0/16 anywhere
0 0 MASQUERADE tcp -- any any 172.17.0.2 172.17.0.2 tcp dpt:8036
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 any anywhere anywhere
5 260 DNAT tcp -- !docker0 any anywhere anywhere tcp dpt:8036 to:172.17.0.2:8036
-
po vygoogleni jsem zkusil
iptables -P FORWARD ACCEPT
ale to bohuzel nepomohlo
-
jeste jsem zkusil z wg site v prohlizeci http://10.9.0.33:8007/....
# tcpdump -n -i eth0 port 80
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
09:37:05.126530 IP 10.9.0.2.8053 > 192.168.34.7.80: Flags [S], seq 3420858225, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:05.375540 IP 10.9.0.2.8054 > 192.168.34.7.80: Flags [S], seq 3092928337, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:06.126564 IP 10.9.0.2.8053 > 192.168.34.7.80: Flags [S], seq 3420858225, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:06.389736 IP 10.9.0.2.8054 > 192.168.34.7.80: Flags [S], seq 3092928337, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:08.128171 IP 10.9.0.2.8053 > 192.168.34.7.80: Flags [S], seq 3420858225, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:08.391808 IP 10.9.0.2.8054 > 192.168.34.7.80: Flags [S], seq 3092928337, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:10.881720 IP 192.168.34.2.33208 > 192.168.34.7.80: Flags [S], seq 1900770907, win 64240, options [mss 1460,sackOK,TS val 877797696 ecr 0,nop,wscale 7], length 0
09:37:10.887848 IP 192.168.34.7.80 > 192.168.34.2.33208: Flags [S.], seq 254474778, ack 1900770908, win 31000, options [mss 1460,wscale 0,eol], length 0
09:37:10.887960 IP 192.168.34.2.33208 > 192.168.34.7.80: Flags [.], ack 1, win 502, length 0
09:37:10.888232 IP 192.168.34.2.33208 > 192.168.34.7.80: Flags [P.], seq 1:98, ack 1, win 502, length 97: HTTP: GET /device HTTP/1.1
09:37:10.898141 IP 192.168.34.7.80 > 192.168.34.2.33208: Flags [.], ack 98, win 31000, length 0
09:37:10.904178 IP 192.168.34.7.80 > 192.168.34.2.33208: Flags [P.], seq 1:270, ack 98, win 31000, length 269: HTTP: HTTP/1.0 200 OK
09:37:10.904293 IP 192.168.34.2.33208 > 192.168.34.7.80: Flags [.], ack 270, win 501, length 0
09:37:10.905230 IP 192.168.34.2.33208 > 192.168.34.7.80: Flags [F.], seq 98, ack 270, win 501, length 0
09:37:10.912154 IP 192.168.34.7.80 > 192.168.34.2.33208: Flags [.], ack 99, win 31000, length 0
09:37:10.915722 IP 192.168.34.7.80 > 192.168.34.2.33208: Flags [FP.], seq 270, ack 99, win 1, length 0
09:37:10.915847 IP 192.168.34.2.33208 > 192.168.34.7.80: Flags [.], ack 271, win 501, length 0
09:37:12.143091 IP 10.9.0.2.8053 > 192.168.34.7.80: Flags [S], seq 3420858225, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:12.393042 IP 10.9.0.2.8054 > 192.168.34.7.80: Flags [S], seq 3092928337, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:13.703118 IP 192.168.34.2.44088 > 192.168.34.7.80: Flags [S], seq 1191321109, win 64240, options [mss 1460,sackOK,TS val 877800517 ecr 0,nop,wscale 7], length 0
09:37:13.709180 IP 192.168.34.7.80 > 192.168.34.2.44088: Flags [S.], seq 272676370, ack 1191321110, win 31000, options [mss 1460,wscale 0,eol], length 0
09:37:13.709324 IP 192.168.34.2.44088 > 192.168.34.7.80: Flags [.], ack 1, win 502, length 0
09:37:13.709500 IP 192.168.34.2.44088 > 192.168.34.7.80: Flags [P.], seq 1:98, ack 1, win 502, length 97: HTTP: GET /device HTTP/1.1
09:37:13.719013 IP 192.168.34.7.80 > 192.168.34.2.44088: Flags [.], ack 98, win 31000, length 0
09:37:13.725286 IP 192.168.34.7.80 > 192.168.34.2.44088: Flags [P.], seq 1:270, ack 98, win 31000, length 269: HTTP: HTTP/1.0 200 OK
09:37:13.725391 IP 192.168.34.2.44088 > 192.168.34.7.80: Flags [.], ack 270, win 501, length 0
09:37:13.726136 IP 192.168.34.2.44088 > 192.168.34.7.80: Flags [F.], seq 98, ack 270, win 501, length 0
09:37:13.733182 IP 192.168.34.7.80 > 192.168.34.2.44088: Flags [.], ack 99, win 31000, length 0
09:37:13.739337 IP 192.168.34.7.80 > 192.168.34.2.44088: Flags [FP.], seq 270, ack 99, win 1, length 0
09:37:13.739438 IP 192.168.34.2.44088 > 192.168.34.7.80: Flags [.], ack 271, win 501, length 0
09:37:20.156984 IP 10.9.0.2.8053 > 192.168.34.7.80: Flags [S], seq 3420858225, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
09:37:20.401814 IP 10.9.0.2.8054 > 192.168.34.7.80: Flags [S], seq 3092928337, win 64860, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
vypada, ze to komunikuje, ale prohlizec skonci na timeout :(
-
uz to frci :D
bylo treba navic k puvodnimu prispevku pouzit pravidlo pro FORWARDING a hlavne maskaradu, aby se adresy zpetnych packetu z eth0 rozhrani prekladaly na wg0 adresy
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -d 192.168.34.7 -j MASQUERADE
diky moc za nasmerovani!
-
Koukám chytrému napověz :-) Není zač.
Pokud má policy zůstat "DROP", stačilo by vložit na začátek (-I) nebo na konec (-A) chainu FORWARD specifické pravidlo resp. dvě pro Váš provoz. Pozor, s adresami po DNATu. Matchovat můžete na adresy (-s , -d) nebo na rozhraní (tuším -i, -o). Target "-J ACCEPT".
Ohledně toho, aby v DNATu fungoval překlad taky opačným směrem... poněkud mě překvapuje, že je třeba kvůli tomu zapnout maškarádu, čekal bych, že tohle ošetří DNAT na bázi connection trackingu. Ale pravda je, že jsem zatím DNAT provozoval vždycky v kombinaci s maškarádou (měl jsem takové konkrétní scénáře). Inu člověk se pořád něco učí...
-
... poněkud mě překvapuje,...
To neni prekvapivy, dela to jen co tomu reknes. Ale ...
Tohle
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -d 192.168.34.7 -j MASQUERADE
je uplny nesmysl ....
Tohle dela to, ze to veme src IP (predpokladam 10.x) a prepise ji na 192.168.34.x. Takze ten cilovy stroj si mysli, ze komunikuje s tim routerem. Coz naprosto nesmyslne resit. Co hur, bude mit problem s identifikaci protistrany - v libovolnem logu bude mit prave jen a porad IPcko toho routeru.
Tohle pravidlo ma byt na wg0
iptables -t nat -A POSTROUTING -o wg0 -s 192.168.0.0/16 -j SNAT --to-source 10.9.0.33
Pri tyhle konstelaci uvidi webserver ty 10tkove IPcka klientu. A samozrejme je lepsi se jakymukoli natovani vyhnout, takze pokud nehrozi kolize, tak tu 192.168 ... proste odroutovat.
BTW: Proc NE maskarada, protoze to je ohybak na dynamicky se menici IPcko, za ktery platis spoustou ruznych nechutnosti.
-
Tohle
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -d 192.168.34.7 -j MASQUERADE
je uplny nesmysl ....
To je pravda, musel jsem to opravit na
iptables -t nat -A POSTROUTING -j MASQUERADE
Tohle pravidlo ma byt na wg0
iptables -t nat -A POSTROUTING -o wg0 -s 192.168.0.0/16 -j SNAT --to-source 10.9.0.33
S timto to nefunguje.
-
Pokud to s maškarádou do vnitřní sítě funguje a bez ní ne, tak to vypadá na problém s routováním. To RPi je výchozí brána pro koncové zařízení (192.168.34.7)? Pokud není, tak v tom případě koncové zařízení (192.168.34.7) neví kam poslat pakety pro wg síť (10.9.0.0/24). Bude třeba mu to říci routou.
-
Pokud to s maškarádou do vnitřní sítě funguje a bez ní ne, tak to vypadá na problém s routováním. To RPi je výchozí brána pro koncové zařízení (192.168.34.7)? Pokud není, tak v tom případě koncové zařízení (192.168.34.7) neví kam poslat pakety pro wg síť (10.9.0.0/24). Bude třeba mu to říci routou.
RPi (192.168.34.2) neni brana, vychozi je 192.168.34.1 na routeru ISP.
Koncove zarizeni 192.168.34.7 (radio) nevi nic o wg siti, to bude tim :D
-
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -d 192.168.34.7 -j MASQUERADE
Tohle pravidlo ma byt na wg0
[facepalm] joo... souhlas, nevšiml jsem si :-)
BTW: Proc NE maskarada, protoze to je ohybak na dynamicky se menici IPcko, za ktery platis spoustou ruznych nechutnosti.
No však. Na můj vkus trochu široký smeták, kvůli jednomu forwardovanému portu.
Tohle pravidlo ma byt na wg0
iptables -t nat -A POSTROUTING -o wg0 -s 192.168.0.0/16 -j SNAT --to-source 10.9.0.33
S timto to nefunguje.
Heh. Ne že by mě to překvapovalo. Jak už jsem říkal, měl jsem pocit, že když zadám pravidlo nahazující DNAT, tak jakmile DNAT jednou nějaký paket přeloží, vyrobí zároveň conntrack entry, která zařídí odpovídající překlad opačným směrem. Přijde mi nadbytečné, vyrábět opačným směrem komplementární SNAT. Možná to dokonce nedosáhne kýženého výsledku (klient neuvidí vracející se pakety se správnou kombinací IP+port). Toto navrhuji ověřit tcpdumpem. On (libpcap) mimochodem lapá pakety těsně nad druhou vrstvou, až poté, co prošly NATem a vůbec všemi chytristikami iptables.
Pokud to s maškarádou do vnitřní sítě funguje a bez ní ne, tak to vypadá na problém s routováním. To RPi je výchozí brána pro koncové zařízení (192.168.34.7)? Pokud není, tak v tom případě koncové zařízení (192.168.34.7) neví kam poslat pakety pro wg síť (10.9.0.0/24). Bude třeba mu to říci routou.
Dobrý nápad, k tomuto se vlažně přikláním...
Já to teď honem nemám na čem testnout.
Off topic: Jednou jsem se snažil zlomit DNAT, aby forwardoval UDP dotazy na multicast destination. Potíž byla, že mi nedokázal zpátky párovat pakety odpovědí z individuálních unicast sources. A když tyto prolétly routerem zpátky bez překladu, tak je zase nepoznával protokolový master, který ty původní dotazy rozesílal :-)
-
RPi (192.168.34.2) neni brana, vychozi je 192.168.34.1 na routeru ISP.
Koncove zarizeni 192.168.34.7 (radio) nevi nic o wg siti, to bude tim :D
=> tobe kdyz dojde paket, ktery ma src 10.x, tak odpoved putuje na default GW, ktera nevi co s ni. Respektive ji posle na svuj default, nejkam k ISP a ten to pokud to ma dobre, zahodi.
Proto ti nechodi ani ten SNAT co jsem psal vejs, protoze se ten paket proste nevrati. A proto ti to chodi s tou maskaradou, protoze i kdyz do ni nic nezapises, tak se nahodi na prvni iface, coz bude eth0.
Coz ale neznamena, ze to takhle je idealni. Lepsi bys mel, kdyby sis pridal routu na ten cilovej webserver, ze 10.x ma posilat na 192.168.34.2. A kdybys opacnou routu pridal na tu protistranu (tzn pokud je protistrana default GW pro klienty, staci aby byla routa tam = ze ma 192.168.34 posilat na 10.9.0.33, jinak per klient), nemusis tam vymejslet ty naty.
A jeste lip bys to udelal tak, ze na obou stranach zprovoznis IPv6, a pouzijes uplne normalni verejny IPcka.
BTW: Port 80 je nesifrovanej vis to?
-
Coz ale neznamena, ze to takhle je idealni. Lepsi bys mel, kdyby sis pridal routu na ten cilovej webserver, ze 10.x ma posilat na 192.168.34.2. A kdybys opacnou routu pridal na tu protistranu (tzn pokud je protistrana default GW pro klienty, staci aby byla routa tam = ze ma 192.168.34 posilat na 10.9.0.33, jinak per klient), nemusis tam vymejslet ty naty.
Je to trochu slozitejsi nez si myslis. Pro zajimavost vysvetlim.
Mam dve site v ruznych mistech s jinymi ISP, prvni ma verejnou IP, vlastni zelezo a tam bezi wg "server" a dalsi sluzby (Home Assistent a pod).
A druha sit (192.168.34.0/24), kde neni verejna IP (router ISP 192.168.34.1) a potrebuju se tam dostat na ruzna zarizeni. Na RPi (192.168.34.2) jsem tam nahodil pripojeni do wg, takze se na nej z privni site dostanu. V tehle siti je taky internetove radio (192.168.34.7), ktere je dostupne na portu 80 a cilem dotazu bylo se na nej nejak dostat z prvni site. Jedine misto, kde lze neco nastavit je RPi.
A jeste lip bys to udelal tak, ze na obou stranach zprovoznis IPv6, a pouzijes uplne normalni verejny IPcka.
Bohuzel tohle neni realny, ten cilovej stroj (radio) nema IPv6 a neumi nastavit zadny routovani.
BTW: Port 80 je nesifrovanej vis to?
Vim, ale to radio ma jen nesifrovanej endpoint.