Fórum Root.cz
Hlavní témata => Sítě => Téma založeno: novak_josef_2019 24. 02. 2022, 11:36:19
-
Potřebuji na wan portu přesměrovat port 8080 na port 80 a nějak se mi to nedaří. Když povolím port 80, tak jsou otevřené oba porty 80 i 8080. Dík za nakopnutí.
#!/sbin/nft -f
### vymazani
flush ruleset
table ip filter {
chain input {
type filter hook input priority 0; policy drop;
### interfacy
iifname eno1 ct state invalid counter drop
iifname eno1 ct state established,related counter accept
iifname enp3s0 accept
iifname wlp2s0 accept
iifname docker0 accept
### loopback
iifname lo accept
### lokalni adresy
ip saddr 172.16.0.0/12 accept
### icmp
ip protocol icmp accept
### porty
tcp dport 22 accept
tcp dport 8080 accept
#tcp dport 80 accept
#tcp dport 443 accept
}
chain forward {
type filter hook forward priority 0; policy accept;
#tcp dport 8080 accept
}
chain output {
type filter hook output priority 0; policy accept;
#tcp dport 8080 accept
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
ip saddr 172.16.0.0/12 oifname eno1 masquerade
}
chain prerouting {
type nat hook prerouting priority 100; policy accept;
tcp dport 8080 redirect to :80
}
}
-
Ještě doplním, že v /etc/sysctl.conf mám
net.ipv4.ip_forward=1
net.ipv4.conf.eno1.route_localnet=1 (tohle jsem zkusil doplnit podle nějakého návodu)
-
neumim nft, ale predpokladam neco jako
tcp dport 8080 dnat :80
-
Myslíme tím přesměrováním portu "8080 na 80" Všichni to samé?
1. Myšlená krabička před routerem, který přepíše u příchozích paketů port 8080 na 80. Co se pak děje s pakety na určitou dst-adresu je další krok problému.
2. Odklonění na lokální počítač (tuším že v pfsense /bsd se to to pravidlo jmenuje DIVERT)
"V originále" man iptables-extensionjs je REDIRECT a volitelný parametr je číslo(rozsah) portu a toto pravidlo nasměruje porty na lokální počítač.
-
V iptables myslím stačilo přesměrovat port 8080 na 80 pomocí IP adresy wan portu 192.168.1.22 a fungovalo to.
V nftables jsem také zkoušel
ip daddr 192.168.1.22 tcp dport 8080 dnat 192.168.1.22:80 nebo 127.0.0.1:80
iifname eno1 tcp dport 8080 dnat 192.168.1.22:80 nebo 127.0.0.1:80
a nejde mi to.
-
Když povolím port 80, tak jsou otevřené oba porty 80 i 8080.
To je v pořádku. Přesměrování portu neřeší žádné „otevření“ či zavření“ portu. Přesměrování portu dělá jenom to, že v příchozím paketu přepíše číslo portu a v odchozím paketu to udělá opačně.
Podle mne ten váš zápis v nftables dělá to, že u paketů, které mají cílový port nastaven na 8080, změní cílový port na 80, IP adresu zachová. Na firewallu pak ale nemáte port 80 povolený, takže se paket zahodí.
Pokud nechcete, aby port 80 byl dostupný „z venku“, musíte zařídit, aby aplikace naslouchala jen na localhostu, v NATu paketům neměnit jen port, ale také je přesměrovat na localhost. A když komunikaci na firewallu zakazujete, musíte pak ten lokální port 80 povolit.
Princip je stejný, jako u iptables – tam byl také NAT nezávislý na firewallu a to, že jste NATem někam paket přesměroval ještě neznamenalo, že projde i firewallem.
-
V iptables jsem to míval do kříže a ve firewallu byl povolený port 8080, který byl otevřený, ale to jsem v nftables taky zkusil.
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.1.22 tcp dpt:8080 to:192.168.1.22:80
DNAT tcp -- 0.0.0.0/0 192.168.1.22 tcp dpt:80 to:192.168.1.22:8080
-
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.1.22 tcp dpt:8080 to:192.168.1.22:80
DNAT tcp -- 0.0.0.0/0 192.168.1.22 tcp dpt:80 to:192.168.1.22:8080
Tohle vám fungovalo? Bál bych se, že se v případě uplatnění prvního pravidla uplatní i to druhé a vrátí to zase zpátky.
ve firewallu byl povolený port 8080, který byl otevřený, ale to jsem v nftables taky zkusil
Povolený musíte mít ten port, na který se DNATuje. Paketu se nejprve v PREROUTING změní port a teprve následně se uplatňují firewallová pravidla v INPUT nebo FORWARD. Takže pravidla musí odpovídat už tomu cílovému portu. (U SNATu je to opačně, ten se aplikuje až v POSTROUTING, takže firewall vidí ještě neupravené pakety.)
Každopádně když máte problém s NATem, je rozumné firewall nejprve úplně vypnout, nakonfigurovat správně NAT, a teprve pak začít konfigurovat firewall. Když řešíte obojí najednou, nevíte, kde dřív hledat chyby – jestli v NATu, nebo ve firewallu, nebo dokonce v aplikaci.
-
Mě by spíše pomohlo a nakoplo, jak změnit konfiguraci z prvního příspěvku, aby byl port 8080 otevřený.
-
Mě by spíše pomohlo a nakoplo, jak změnit konfiguraci z prvního příspěvku, aby byl port 8080 otevřený.
Já bych tam zkusil odkomentovat ten řádek, který povoluje komunikaci na portu 80:
#!/sbin/nft -f
### vymazani
flush ruleset
table ip filter {
chain input {
type filter hook input priority 0; policy drop;
### interfacy
iifname eno1 ct state invalid counter drop
iifname eno1 ct state established,related counter accept
iifname enp3s0 accept
iifname wlp2s0 accept
iifname docker0 accept
### loopback
iifname lo accept
### lokalni adresy
ip saddr 172.16.0.0/12 accept
### icmp
ip protocol icmp accept
### porty
tcp dport 22 accept
tcp dport 8080 accept
################# následující řádek jsem odkomentoval ##########################
tcp dport 80 accept
#tcp dport 443 accept
}
chain forward {
type filter hook forward priority 0; policy accept;
#tcp dport 8080 accept
}
chain output {
type filter hook output priority 0; policy accept;
#tcp dport 8080 accept
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
ip saddr 172.16.0.0/12 oifname eno1 masquerade
}
chain prerouting {
type nat hook prerouting priority 100; policy accept;
tcp dport 8080 redirect to :80
}
}
Samozřejmě pak na tom portu 80 na příslušné IP adrese musí poslouchat nějaká aplikace.
-
Díky, ale asi to mám krkolomě vyřešené. To povolení portu 80 být musí (8080 ne), potom mám přesměrování na stejnou IP a port 80 zakázaný. V tu chvíli mám 8080 otevřený, ale ten konfigurák ještě finálně upravím.
### porty
tcp dport 22 accept
#tcp dport 8080 accept
tcp dport 80 accept
#tcp dport 443 accept
...
ip daddr 192.168.1.22 tcp dport 8080 dnat 192.168.1.22:80
tcp dport 80 drop
-
port 80 zakázaný
Nemůžete mít port zároveň povolený i zakázaný. Linuxový firewall funguje na základě pravidel – ta se postupně procházejí, vyhodnotí se, zda paket pravidlu vyhovuje, a pokud ano, uplatní se akce, která je u pravidla nastavená. Pokud je akce ACCEPT, REJECT nebo DROP, je to už rozhodnutí, co se má s paketem udělat, a další pravidla se už neprochází. Takže vy řádkem
tcp dport 80 accept
říkáte, že příchozí pakety protokolu TCP/IP s cílovým portem 80 se mají pustit do počítače. Tím zpracování paketu firewallem končí, protože už je rozhodnuto, co s paketem. Na pravidlo
tcp dport 80 drop
tudíž nikdy nemůže dojít.
-
Klidně bych to udělal jinak, ale takhle mi to funguje. Když 80 prvně nepovolím, tak 8080 otevřený není, ale když 80 prvně povolím, 8080 přesměruji a poté 80 zakáži, tak mám 8080 otevřený a 80 filtrovaný.
O finální podobě jsem už psal, NAT dám nahoru a potom budu řešit porty.
-
Klidně bych to udělal jinak, ale takhle mi to funguje. Když 80 prvně nepovolím, tak 8080 otevřený není, ale když 80 prvně povolím, 8080 přesměruji a poté 80 zakáži, tak mám 8080 otevřený a 80 filtrovaný.
O finální podobě jsem už psal, NAT dám nahoru a potom budu řešit porty.
Ne, port 80 nezakážete a filtrovaný není.
-
NAT dám nahoru a potom budu řešit porty.
Ještě k tomuhle – je jedno, jestli v konfiguračním souboru bude NAT nahoře nebo dole, pořadí sekcí nemá na nic vliv. Třeba tady je schéma toho, jak packet putuje síťovým stackem linuxu: Nftables - Packet flow and Netfilter hooks in detail (https://thermalcircle.de/doku.php?id=blog:linux:nftables_packet_flow_netfilter_hooks_detail). Pořadí pravidel má význam jenom v jednom konkrétním řetězci, kde se testuje jedno pravidlo za druhým. Putování paketu mezi jednotlivými řetězci je ale pevně dané, vizte ten obrázek.
-
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.
-
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.
-
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.
-
Když použiji tohle pravidlo
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
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ž
curl http://127.0.0.1:80 nebo curl http://192.168.1.22:80
ověří oba porty jako funkční.
-
Když použiji tohle pravidlo
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
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ž
curl http://127.0.0.1:80 nebo curl http://192.168.1.22:80
ověří 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áží.
-
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.
-
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?
-
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.
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
}
}
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
-
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).
-
Budiž, když přepnu apache2 na localhost
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
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ý
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
-
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).
-
Ale PRE/POSTROUTING se neuplatňuje (https://moodle.nic.cz/pluginfile.php/55707/mod_book/chapter/294/tables_traverse.png)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
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
-
Ale PRE/POSTROUTING se neuplatňuje (https://moodle.nic.cz/pluginfile.php/55707/mod_book/chapter/294/tables_traverse.png)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.
-
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é.
-
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.
-
Tak se pokusím znovu. Na WAN interfejsu mám nahozenou maškarádu a potřebuji port 8080 přesměrovat na port 80 za tímto překladem adres. Port 8080 musí být dostupný/otevřený a port 80 ne.
Přišel jsem si zde pro konkrétní radu a spousta teorie je pro mě zbytečná, protože se tím neživím a za měsíc to stejně zapomenu.
Stačí napsat:
- tohle přidej pro nahození nftables
- případně toto zmeň nebo přidej v /etc/sysctl.conf
- taky nezapomeň na ..... atd.
Za tohle rád poděkuji a budu vděčný.
-
Přišel jsem si zde pro konkrétní radu a spousta teorie je pro mě zbytečná, protože se tím neživím a za měsíc to stejně zapomenu.
Najděte si někoho, kdo vám to nakonfiguruje a bude spravovat. Firewall a NAT není něco, co by šlo jen tak nastavit podle rad na internetu, aniž byste tomu rozuměl, a dál se o to nestarat.
Tak se pokusím znovu. Na WAN interfejsu mám nahozenou maškarádu a potřebuji port 8080 přesměrovat na port 80 za tímto překladem adres. Port 8080 musí být dostupný/otevřený a port 80 ne.
Přesně takhle se přece chová příklad, který jste sám posílal (https://forum.root.cz/index.php?topic=25949.msg368373#msg368373). Já bych jenom ten port 80 přesměroval na jiný por, než zrovna 8080, ať to není matoucí. Na libovolný port, kde nic nenaslouchá.
-
Jinak jediné rozumné řešení je samozřejmě vykašlat se na nějaký NAT a nakonfigurovat tu aplikaci, aby neposlouchala na portu 80, ale na portu 8080.
-
Takže podtrženo a sečteno, ještě že jsem si to vyřešil sám, i když jsem si díky vašim zacykleným radám myslel, že to snad umíte lépe.
-
vsechny filipovy rady zde jsou validni. neradi tim vlastne jen tobe ale vsem kdo budou mit podobny problem, za me palec nahoru a dekuju
-
Poradil mi přesměrování na localhost a to nefungovalo, nebo použít přímo port 8080, což v zadání nemám a takhle to nechci.
-
Poradil mi přesměrování na localhost a to nefungovalo
Firewall a NAT fungoval. Jenže vy jste nenastavil správně další věci, které jsou potřeba, aby to fungovalo. Navíc já jsem vám poradil celkem minimálně 4 způsoby, jak to vyřešit.
což v zadání nemám a takhle to nechci.
Problém je právě v tom, že jsou to tři různé věci – co potřebujete vyřešit za problém, co chcete, a na co se ptáte. Co potřebujete vyřešit za problém nevíme vůbec, co chcete mlhavě tušíme.
-
Tak to napíšu potřetí. Na WAN interfejsu mám nahozenou maškarádu a potřebuji port 8080 přesměrovat na port 80 za tímto překladem adres. Port 8080 musí být dostupný/otevřený a port 80 ne.
Rád bych se dozvěděl vaše čtyři způsoby, jak to vyřešit.
-
Mám li vycházet z předchozího příspěvku: Maškaráda dělá 2 věci, že mění adresy spojením zevnitř ven a defacto s tím nesouvisí(možná až na to, že zároveň vytvořit spojení zvenku dovnitř, což není přímo důsledek maškarády, ale obvyklého setupu s maškarádou ,například FORWARD povolen jen ve směru zevnitř ven & ctstateRELATED+EST obráceně). Vy řešíte, jestlitomu dobře rozumím spojení zvenku dovnitř.
A to řeší tabulka pravidlo DNAT/REDIRECT (a ty jdou ostatně jen v tabulce NAT a ta nabízí se jen chain PREROUTING).
Je to prosté, pravidlo bude mít --source-port 8080 (to je číslo cílového portu co než to dorazí do routeru) a --to(-port) bude (127.0.0.1):80 (přepíšu to aby to nebylo na prasáka: -j DNAT --to 127.0.0.1:80, ale jak jsem psal, je lepší -jREDIRECT --to 80)
DNAT v tomtopřípadě bych nepoužil, protože vyžaduje rovnák na ohejbák (že pakety obvykle požere rpfilter nebo že FORWARDOVÁNÍ MEZI loopbackem se nedělá) - REDIRECT je lepší volba (ostatně --to je jen číslo portu)
-
Tak to napíšu potřetí. Na WAN interfejsu mám nahozenou maškarádu a potřebuji port 8080 přesměrovat na port 80 za tímto překladem adres. Port 8080 musí být dostupný/otevřený a port 80 ne.
Rád bych se dozvěděl vaše čtyři způsoby, jak to vyřešit.
Nemusíte to psát potřetí. Stačí, když to napíšete jednou, ale pořádně. Co znamená „za tímto překladem adres“? Ta aplikace na portu 80 běží na stejném zařízení, kde je NAT (tedy vaše maškaráda, a teď k tomu potřebujete přidat ještě DNAT), nebo na jiném zařízení? Já si zkusím zavěštit, že je to ta druhá varianta, a celou dobu to před námi tajíte – tedy že máte třeba nějaký domácí router, tam děláte NAT – a někde v domácí síti máte server, kde běží nějaký web, který má být z venku dostupný na portu 8080.
Varianta č. 1, pro vás jediná reálná – najedete si někoho, kdo tomu rozumí, ať vám to nakonfiguruje.
Varianta č. 2, nejlepší z hlediska sítě – ten web server na domácím serveru nakonfigurujete, aby běžel na portu 8080, na routeru uděláte DNAT, který bude měnit jenom IP adresu cíle, port zůstane neměnný.
Varianta č. 3 – web server necháte na tom portu 80, na NATu uděláte pravidlo, že když je cílová IP adresa IP adresa WAN portu routeru a cílový port 8080, přesměrujete paket na IP adresu serveru a port 80.
Varianta č. 4 měla význam jenom v případě, kdy byl NAT na stejném počítači, jako webový server. Jak jste to celou dobu uváděl.
Všimněte si, že v žádné z variant neřešíte pakety přicházející na port 80 na tom NATu. protože na něm nic neposlouchá, není tam nastavené ani žádné přesměrování, takže se sám OS postará o odpověď, že tam nic není. A nemusíte to nijak řešit.
-
pravidlo bude mít --source-port 8080 (to je číslo cílového portu co než to dorazí do routeru)
Ne, source je zdrojový port. Při DNATu se pro klasické TCP/IP protokoly, jako např. HTTP, chcete rozhodovat podle čísla cílového portu, ne zdrojového – ten je obvykle volen náhodně.
DNAT v tomtopřípadě bych nepoužil, protože vyžaduje rovnák na ohejbák (že pakety obvykle požere rpfilter nebo že FORWARDOVÁNÍ MEZI loopbackem se nedělá) - REDIRECT je lepší volba (ostatně --to je jen číslo portu)
Ty vaše komentáře jsou taková snůška pravdivých tvrzení, nesmyslů a vět, jejichž význam mi uniká. Rozdíl mezi REDIRECTEM a DNATem v iptables je ten, že REDIRECT mění IP adresu cíle na IP adresu aktuálního počítače. Je to tedy opak maškarády – nespecifikujete, na jakou IP adresu se má adresa v paketu přepisovat. Výhodné je to třeba když máte dynamicky přidělované IP adresy. DNAT je naproti tomu obecný, jste to vy, kdo určuje cílovou IP adresu i port. Ovšem musíte je uvést (alespoň jedno z toho) – no, a když bude mít zařízení dynamickou IP adresu, budete ji muset vždy nejprve zjistit a pak do pravidel nastavit správnou IP adresu.
-
vykasli se na nej, tohle je uz trolling :)