Přesměrování portu 8080 na port 80 v nftables

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #15 kdy: 24. 02. 2022, 22:28:45 »
Už se motáme v kruhu, to je blbě, to je blbě, to je blbě, klidně si nechám poradit, jak to mám udělat. Když mi nebude fungovat ten NAT nahoře, tak to nechám, jak jsem už napsal a pokud mi nevěříte, že je v tu chvíli 80 filtrovaná (není otevřená), tak s tím nic neudělám. To křížové NATování portu v iptables mi taky funguje asi 5 let, i když tvrdíte, že nemůže.
Nikdy jsem na tohle nebyl, pro iptables jsem používal klikátko http://fwbuilder.sourceforge.net/4.0/quick_start_guide.shtml , ale  chtěl bych přejít na nftables.


robin martinez

  • *****
  • 967
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #16 kdy: 25. 02. 2022, 06:54:14 »
Nikdy jsem na tohle nebyl, pro iptables jsem používal klikátko http://fwbuilder.sourceforge.net/4.0/quick_start_guide.shtml , ale  chtěl bych přejít na nftables.

jako pokud je takhle 'trivialni' vec tak problematicka, tak jsem rad, ze jsem na nft nikdy nepresel.
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #17 kdy: 25. 02. 2022, 08:55:32 »
Už se motáme v kruhu, to je blbě, to je blbě, to je blbě, klidně si nechám poradit, jak to mám udělat.
To už jsem vám napsal. Pokud nemá být port 80 z venku dostupný, musí aplikace naslouchat jen na localhostu a paket se musí přesměrovávat na localhost. Nebo tu komunikaci z venku můžete zakázat i na firewallu, ale primární by mělo být správné nastavení aplikace, firewall je až pojistka.

A nebo ještě daleko jednodušší řešení – prostě té aplikaci nastavte, ať rovnou naslouchá na portu 8080. Přesměrování 80→8080 se dělá proto, aby aplikace nemusela mít práva roota, když někdo nechce řešit capabilities. Pro přesměrování 8080→80 není žádný důvod, na portu 8080 může aplikace naslouchat kdykoli.

pokud mi nevěříte, že je v tu chvíli 80 filtrovaná (není otevřená), tak s tím nic neudělám.
Ta pravidla, která jste ukazoval, nemohou zajistit, aby byl port 80 filtrovaný. Může to filtrovat třeba nějaký dřívější firewall – nenapsal jste, jak to zkoušíte. Já jsem vás jenom upozorňoval na to, že Netfilter v Linuxu funguje jinak, než si myslíte. Pokud si dál trváte na té konfiguraci, která nedává smysl a dělá něco  jiného, než si myslíte, je to váš problém, ne můj.

To křížové NATování portu v iptables mi taky funguje asi 5 let, i když tvrdíte, že nemůže.
Já jsem netvrdil, že to fungovat nemůže. Divil jsem se, že to fungovalo, a psal jsem, že sám bych tohle asi nikdy nezkoušel, protože bych si myslel, že to druhé pravidlo přepíše port zase zpátky. A upřímně, po vašich dalších komentářích, kdy se ukázalo, že vůbec nevíte, jak Netfilter funguje, si vůbec nejsem jistý, že vám tohle opravdu funguje. Možná to ve výsledku dělá, co chcete, ale vůbec na tom nemusí mít zásluhu tahle pravidla.

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #18 kdy: 25. 02. 2022, 15:10:43 »
Když použiji tohle pravidlo
Kód: [Vybrat]
ip daddr 192.168.1.22 tcp dport 8080 dnat 192.168.1.22:80
tak mám port 8080 otevřený a když tohle
Kód: [Vybrat]
ip daddr 192.168.1.22 tcp dport 8080 dnat 127.0.0.1:80
tak port 8080 není otevřený, takže to co radíte, tak nefunguje.
Sice mi určitě opět neuvěříte, ale tak to u mě je, i když
Kód: [Vybrat]
curl http://127.0.0.1:80 nebo curl http://192.168.1.22:80ověří oba porty jako funkční.

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #19 kdy: 25. 02. 2022, 16:28:50 »
Když použiji tohle pravidlo
Kód: [Vybrat]
ip daddr 192.168.1.22 tcp dport 8080 dnat 192.168.1.22:80
tak mám port 8080 otevřený a když tohle
Kód: [Vybrat]
ip daddr 192.168.1.22 tcp dport 8080 dnat 127.0.0.1:80
tak port 8080 není otevřený, takže to co radíte, tak nefunguje.
Takže ta aplikace poslouchá na 192.168.1.22:80 a neposlouchá na 127.0.0.1:80. Co vám radím? No to je jedoduché, když chcete, aby ta aplikace naslouchala na 127.0.0.1:80 a ne na 192.168.1.22:80, tak ji tak nakonfigurujte. Vůbec nejlepší bude, když ji nakonfigurujete, aby naslouchala na portu 8080, když to chcete, a nemusíte pak řešit ten NAT.

Samozřejmě pak také nesmíte mít komunikaci zakázanou na firewallu. Což je další věc – když neumíte firewall nakonfigurovat, je pro vás firewall zbytečný, akorát vám to komplikuje život. Tak ho vypněte a nepoužívejte ho.

Pokud tu aplikaci nakonfigurovat neumíte, tak aspoň napište, o jakou aplikaci se jedná.

Sice mi určitě opět neuvěříte, ale tak to u mě je, i když
Kód: [Vybrat]
curl http://127.0.0.1:80 nebo curl http://192.168.1.22:80ověří oba porty jako funkční.
Možná neuvádíte všechny informace, možná něco interpretujete špatně. Např. jste vůbec nenapsal, co podle vás znamená „port otevřený“ a „port není otevřený“.

Nejlepší, co můžete udělat, je nakonfigurovat ten web server, ať poslouchá jen na portu 8080, a úplně zrušit firewall i NAT, protože vám jsou stejně k ničemu, jenom vám překáží.


Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #20 kdy: 25. 02. 2022, 18:58:24 »
Mám funkční řešení a to mi stačí. Potřebuji to pro více služeb a nebudu je pouštět pouze na localhostu, protože v místní síti je potřebuji mít dostupné na defaultních portech a nebudu dělat několika-násobný NAT do různých subnetů.
Dík za snahu, ale s vámi je lepší to vzdát, než se vysilovat.

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #21 kdy: 25. 02. 2022, 19:15:47 »
Mám funkční řešení
Když si to myslíte…

Potřebuji to pro více služeb a nebudu je pouštět pouze na localhostu, protože v místní síti je potřebuji mít dostupné na defaultních portech a nebudu dělat několika-násobný NAT do různých subnetů.
Takže můžeme očekávat další záplavu dotazů. Nebylo by lepší si nastudovat, jak Netfilter funguje?

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #22 kdy: 04. 03. 2022, 10:24:05 »
Zkusil jsem si to na zkoušku ve VBoxu (ať nemusím spouštět testovací PC) a nahodil jsem jen základní pravidla. Takhle to je bez následného zákazu portu 80, ale stejně bych čekal, že povolený port by měl být 8080, ale to se chová jinak. Níže je sken z jiného systému.
Kód: [Vybrat]
nft list ruleset
table ip filter {
        chain input {
                type filter hook input priority filter; policy drop;
                iifname "lo" accept
                tcp dport 22 accept
                tcp dport 80 accept
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}
table ip nat {
        chain prerouting {
                type nat hook prerouting priority filter; policy accept;
                iifname "enp0s3" tcp dport 80 dnat to 192.168.11.19:8080
                iifname "enp0s3" tcp dport 8080 dnat to 192.168.11.19:80
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "enp0s3" masquerade
        }
}

Kód: [Vybrat]
nmap -p 80 192.168.11.19

Starting Nmap 7.60 ( https://nmap.org ) at 2022-03-04 09:58 CET
Nmap scan report for 192.168.11.19
Host is up (0.00026s latency).

PORT   STATE    SERVICE
80/tcp filtered http
MAC Address: 08:00:27:EE:45:7C (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.59 seconds

nmap -p 8080 192.168.11.19

Starting Nmap 7.60 ( https://nmap.org ) at 2022-03-04 09:58 CET
Nmap scan report for 192.168.11.19
Host is up (0.00032s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy
MAC Address: 08:00:27:EE:45:7C (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.56 seconds

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #23 kdy: 04. 03. 2022, 11:10:45 »
Takhle to je bez následného zákazu portu 80
Žádný „následný zákaz portu“ v netfilteru neexistuje. Porty „zakazujete“ v chainu INPUT, kde se ta pravidla prochází jendo po druhém, dokud nějaké pravidlo nevyhoví. Nezáleží na tom, zda jste to pravidlo do chainu vložil dřív nebo později, než pravidlo pro NAT. Pořadí zpracování PREROUTING, INPUT, OUTPTU, FORWARD, POSTROUTING  je pevně dané tím, jak paket prochází síťovým stackem – vy to pořadí nemůžete nijak ovlivnit. Dával jsem vám sem i odkaz na dokumentaci, kde je ten průchod paketu schematicky znázorněný.

ale stejně bych čekal, že povolený port by měl být 8080, ale to se chová jinak
Ano, chová se to tak, jak jsem napsal už asi desetkrát. DNAT se dělá v PREROUTING a ten se provádí dřív, než INPUT.

Takže příchozímu paketu s cílovým portem 8080 se změní cílový port na port 80. Teprve pak jde paket do INPUTu. Tam prochází jednotlivá pravidla, až narazí na povolení portu 80, takže je propuštěn dál.

Příchozímu paketu s cílovým portem 80 se změní cílový port na port 8080. Pak jde paket do INPUT chainu, prochází všechna pravidla, žádné pravidlo nevyhoví, tak se uplatní politika chainu, která je DROP, takže se paket zahodí.

Jediná věc, která není zřejmá, jsou ta dvě NATovací pravidla, protože pakety, které odpovídají prvnímu pravidlu, po provedení NATu odpovídají i druhému pravidlu. Naštěstí pro vás se NetFilter chová buď tak, že první pravidlo, kterému paket vyhoví, procházení ukončí, nebo že se proti pravidlům vyhodnocuje vždy ten původní paket (nechce se mi hledat, která varianta platí – nikdy jsem takovéhle zašmodrchání NATu nepotřeboval).

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #24 kdy: 04. 03. 2022, 12:18:26 »
Budiž, když přepnu apache2 na localhost
Kód: [Vybrat]
netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      1338/apache2
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      635/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      698/sshd: /usr/sbin
tcp6       0      0 :::22                   :::*                    LISTEN      698/sshd: /usr/sbin
udp        0      0 127.0.0.53:53           0.0.0.0:*                           635/systemd-resolve
udp        0      0 192.168.11.19:68        0.0.0.0:*                           587/systemd-network
povolím oba porty 80 a 8080 a přesměruji port 8080 na localhost:80
Kód: [Vybrat]
nft list ruleset
table ip filter {
        chain input {
                type filter hook input priority filter; policy drop;
                iifname "lo" accept
                tcp dport 22 accept
                tcp dport 8080 accept
                tcp dport 80 accept
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}
table ip nat {
        chain prerouting {
                type nat hook prerouting priority filter; policy accept;
                iifname "enp0s3" tcp dport 8080 dnat to 127.0.0.1:80
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "enp0s3" masquerade
        }
}
tak stejně nemám ani jeden port otevřený
Kód: [Vybrat]
nmap -p 80 192.168.11.19

Starting Nmap 7.60 ( https://nmap.org ) at 2022-03-04 12:11 CET
Nmap scan report for 192.168.11.19
Host is up (0.00035s latency).

PORT   STATE  SERVICE
80/tcp closed http
MAC Address: 08:00:27:EE:45:7C (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.56 seconds

nmap -p 8080 192.168.11.19

Starting Nmap 7.60 ( https://nmap.org ) at 2022-03-04 12:11 CET
Nmap scan report for 192.168.11.19
Host is up (0.00026s latency).

PORT     STATE    SERVICE
8080/tcp filtered http-proxy
MAC Address: 08:00:27:EE:45:7C (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.59 seconds


Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #25 kdy: 04. 03. 2022, 12:56:00 »
To, aby Apache běžící na portu 80 nebyl z venku viditelný na portu 80 vám přece zařídila ta předchozí konfigurace, kde jste port 80 DNAToval na port 8080. Myslel jsem, že vám jde o to.

V tomhle případě jde podle mne ještě o to, jak vypadají routovací tabulky a možná rp_filter. Tím DNATem vyrobíte paket, který má odchozí IP adresu někde v internetu a cílovou loopback. Takový paket se normálně nemůže na počítač doručit, takže je možné, že se pro něj nenajde správné pravidlo v routovacích tabulkách, nebo že neprojde přes rp_filter, pokud ho máte zapnutý, nebo možná ještě přes nějakou jinou kontrolu. Pokud tohle nechcete řešit a chcete se vyhnout tomu přesměrování paketů na loopback, nechcete port 80 DNATovat (jako jste to dělal v předchozím příkladu) a chcete zabránit tomu, aby se někdo z venku mohl připojit i na ten port 80 (nechápu proč, když to stejně vystavujete na portu 8080, ale budiž), můžete příchozí provoz na port 80 dropovat už v PREROUTING. Je to sice netypické, ale jde to (a někdy se to používá, hlavně při omezování silného provozu, když je snaha paket zahodit co nejdřív, ať se mu nemusí věnovat další části systému).

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #26 kdy: 04. 03. 2022, 13:26:41 »
Ale PRE/POSTROUTING se neuplatňuje když se připojuješ na lokální server.

Ono je taky možné (Jak psal Naposled Filip Jirsák v dodatku), že ta entanglovaná dvojice pravidel proběhne celá , takže 80 přepíše na 8080 a následně zase na 80.
To jsem si ověřil a není to pravda: zkuste si spustit PHP -S 0.0.0.0:{1811,1822} & s index.php <?php var_dump($_SERVER); a zároveň sledovat iptables -nxvL -t nat s tabulkou
Kód: [Vybrat]


vložit pravidla
 iptables  -I PREROUTING   -p tcp --dport 502 -t nat   -j REDIRECT --to 509
 iptables  -I PREROUTING   -p tcp --dport 509 -t nat   -j REDIRECT --to 502
 sudo iptables  -I PREROUTING   -p tcp --dport 409 -t nat   -j DNAT --to :402
 sudo iptables  -I PREROUTING   -p tcp --dport 402 -t nat   -j DNAT --to :409
#  DNAT --to :port  to je validní zápis - říká že má jen změnit port a ponechat dst_IP


   pkts      bytes target     prot opt in     out     source               destination
       2      120 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:502 redir ports 509
       1       60 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:509 redir ports 502
       4      240 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:409 to::402
       7      420 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:402 to::409



Mimochodem, REDIRECT a DNAT nejdou v INPUT a OUTPUT , je nějak možné docílit analogické změny portu v těchto chainech. ?


Taky je důležité, jak se služba (server apache spouští), jestli v konfiguraci je listen *:80 nebo konrétní_ip:80 nebo *:80 (php to má v parametru -S jako -S IP:port a ekvivalent *:80 je 0.0.0.0:80)


> filip jirsák:
Kdo DNATUJE na 127.0.0.1 se zlou se potáže
divil jsem se proč tcpdump -nti lo nic nezachytí...
"zachytil" to totiž_rp_filtr
d kernel: IPv4: martian destination 127.0.0.1 from 192.168.1.5, dev eth0
« Poslední změna: 04. 03. 2022, 13:36:08 od mikesznovu »

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #27 kdy: 04. 03. 2022, 15:54:56 »
Ale PRE/POSTROUTING se neuplatňuje když se připojuješ na lokální server.
Není mi úplně jasné, co myslíte tím „připojovat se na lokální server“, nicméně my se bavíme o naprosto běžné situaci, kdy pakety přišly normálně ze sítě a míří na aktuální zařízení. Drtivá většina případů, kdy aplikace běží na vysokém portu, aby nemusela mít práva roota (dříve, nebo když se nepoužívají capabilities), a z venku má být dostupná na standardním portu, se řeší právě takhle DNATem (přepisem portu) na cílovém zařízení.

Mimochodem, REDIRECT a DNAT nejdou v INPUT a OUTPUT , je nějak možné docílit analogické změny portu v těchto chainech. ?
Ne, k tomu právě slouží PREROUTING. Je potřeba to rozlišovat, iptables i nftables je víc věcí spojených do jedné – nás zajímá firewall a NAT. Firewall slouží k blokování paketů (ACCEPT, REJECT, DROP), NAT k jejich modifikaci (např. DNAT, SNAT – ale jde tam použít i DROP či REJECT, což by do NATu vlastně patřit nemělo). Firewall se konfiguruje v tabulce filter (je výchozí) má chainy INPUT, OUTPUT, FORWARD. NAT se konfiguruje v tabulce nat a má chainy PREROUTING, POSTROUTING a také OUTPUT, aby v tom byl dostatečný zmatek. Dále existuje třeba ještě tabulka mangle, která má zase své chainy.

Kdo DNATUJE na 127.0.0.1 se zlou se potáže
Nemyslím si. Stačí zhruba chápat, jak síťový stack v linuxu funguje.

"zachytil" to totiž_rp_filtr
Vždyť jsem to psal, že je rp_filter jeden z kandidátů na prověření, jestli to neblokuje.

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #28 kdy: 04. 03. 2022, 16:02:05 »
apache2 jsem nakonfiguroval v /etc/apache2/ports.conf na "Listen 127.0.0.1:80" a tato rada, prolínající se přes několik stran tohoto vlákna, mi od pana Jirsáka nepomohla. Stále jsem neblíže v tom NATování "do kříže", jenže v iptables mi stačilo povolit logičtější port 8080 než v nftables port 80. Zatím si to zkouším na tomhle portu, ale využití bude pro jiné.

Re:Přesměrování portu 8080 na port 80 v nftables
« Odpověď #29 kdy: 04. 03. 2022, 16:49:33 »
tato rada, prolínající se přes několik stran tohoto vlákna, mi od pana Jirsáka nepomohla
Já jsem v předchozím komentáři psal o routovacích tabulkách, psal jsem o rp_filteru. Nějak tu nevidím výpis vašich routovacích tabulek a rp_filteru. Jak vám asi můžu poradit, když tajíte informace, které jsou k vyřešení problému potřeba? V tom posledním výpisu, který jste sem dával, s největší pravděpodobností nestojí za filtrování paketů firewall. Což byste ostatně mohl ověřit třeba tím, že změníte výchozí politiku INPUTu z DROP na REJECT. Jsem přesvědčený, že se na výstupu nmapu nic nezmění a dál bude ukazovat filtered, přestože komunikaci aktivně odmítnutou REJECTem označuje jinak. Třeba pak konečně uvěříte tomu, že ty pakety nezahazuje firewall v INPUTu.

Stále jsem neblíže v tom NATování "do kříže"
Vždyť to je to, co chcete, ne? Ono by hodně pomohlo, kdybyste konečně napsal, jaký problém vlastně řešíte.

jenže v iptables mi stačilo povolit logičtější port 8080 než v nftables port 80
Nikoli, iptables i nftables se chovají stejně. Paket prochází pořád stejným způsobem, rozdíl mezi iptables a nftables je jenom v samotném nástroji, který v konkrétním chainu vyhodnocuje pravidla.

Zatím si to zkouším na tomhle portu, ale využití bude pro jiné.
Pokud potřebujete poradit s tím, jak váš problém vyřešit, to nejrozumnější, co můžete udělat, je konečně ten problém popsat. Hádání na slepo, co asi chcete, nikam nevede.