Stavové filtrování s iptables

Tomas123

Stavové filtrování s iptables
« kdy: 19. 11. 2017, 14:12:42 »
Zdarec borci,

nasiel by sa tu niekto, kto by mi nejako jednoducho vysvetlil, na co je "Stavove filtorvanie" v iptables (NEW, ESTABLISHED, RELATED a INVALID)??

Aky je rozdiel, ked to napisem takto, politika INPUT je DROP (prosim, berte to ako priklad...):

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
vs
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
vs
iptables -A INPUT -p tcp --dport 22  -j ACCEPT
iptables -A INPUT -p tcp --dport 80  -j ACCEPT
iptables -A INPUT -j DROP

Aka je teda pointa toho celeho?
« Poslední změna: 19. 11. 2017, 20:38:43 od Petr Krčmář »


Re:iptables
« Odpověď #1 kdy: 19. 11. 2017, 14:35:03 »
Firewall může být buďto stateful nebo stateless.

Třetí příklad je stateless. Každý paket dorazí na firewall je posoudí se pouze to, jestli sedí cílový port.
Ve skutečnosti ale paket může být chybný (v důsledku nezáměrné chyby, ale i jako cílený útok na nějakou slabinu. Např. se může tvářit, že se jedná o určitý paket (Ntý paket) ze spojení, ačkoliv tomu tak není.

Stateless firewall se nestará o to, jestli spojení je navázané, funkční, jestli sedí sekvenční čísla, ..., .... Prostě jen porovná číslo portu (22, 80) a paket pustí.

Statefull firewall oproti tomu spojení začne sledovat a od prvního do posledního paketu kontroluje, jestli všechno sedí.

První dva příklady jsou statefull, třetí je stateless. První dva příklady, zrovna tyto konkrétně, budou na linuxu fungovat totožně. Druhý příklad je trochu správnější, protože podle portu se porovná jen první paket ve spojení (state=NEW), další pakety už projdou hned prvním pravildem (state=ESTABLISHED).

V linuxu je to trochu chaotické na pochopení.

McFly

  • *****
  • 567
    • Zobrazit profil
    • E-mail
Re:iptables
« Odpověď #2 kdy: 19. 11. 2017, 14:47:07 »
Pěkně vysvětleno.  ;)

Re:iptables
« Odpověď #3 kdy: 19. 11. 2017, 15:00:25 »
Mně na linuxu vadí, že se stateful / stateless ovládá konkludentně, tedy tím, jak se poskládají pravidla, případně konkrétní kombinací ESTABLISHED + konkrétní spojení.

OpenBSD to má daleko přehledněji v jejich pf - tam se na konec pravidla dá buďto no state (pak je to stateless), nebo se tam prskne keep/modulate/synproxy state - podle toho, jak moc paranoidně chcete spojení kontrolovat (jen sledovat, nebo  ho modulovat, nebo dokonce syn-proxovat).

Tomas123

Re:iptables
« Odpověď #4 kdy: 19. 11. 2017, 15:51:51 »
Okey, len potom stav = RELATED, je tam vo finale na co?

Citace
RELATED - paket vytváří nové spojení, ale vztahuje se k některému z existujících
- tento stav by mal co zarocuvoat? Nechapem to, ze vytvara nove spojenie, ale vztahuje sa k nejakemu existujucemu, ako moze vytvarat a zaroven sa vztahovat... Keby som mohol poprosit nejaky priklad... Ved vzdy, ked sa vytvara nove spojenie, musi byt stav = NEW. Ci?

Inak zatial jedna z najlepsich odpovedi, co som dostal  :) :)


dada

Re:iptables
« Odpověď #5 kdy: 19. 11. 2017, 18:38:51 »
DD,

typickym prikladem pro uplatneni RELATED je FTP prenos. Ten pouziva 2 kanaly - ridici pro prenos povelu a datovy pro prenos dat (soubory). V puvodni specifikaci FTP protokolu spojeni pro prenos dat navazuje server smerem ke klientovi. Takze v normalnim pripade by je firewall zahodil. Pokud firewall umi analyzovat komunikaci v ridicim spojeni, dozvi se na jakem portu a adrese klient otevrel komunikacni kanal pro data a pokud ma firewall povoleno RELATED, muze povolit spojeni ze serveru na klienta pro prenos dat.

PS: diky vsudypritomnemu NATu dnes FTP klient v pudu sebezachovy hned prepina do pasivniho modu, pak navazuje spojeni pro data klient na server ne naopak.

Tomas123

Re:iptables
« Odpověď #6 kdy: 19. 11. 2017, 18:49:06 »
...
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 29799:29899 -j ACCEPT #datove porty
...
-A INPUT -j DROP

FTP mam v tabulke takto definovany, FTP server je v passivnom mode, funguje dobre bez toho, aby som mal stav ESTABLISHED, RELATED pouzity.

Tiez stav NEW. Ved kazde spojenie, ktore sa navazuje, je NEW, apson teda myslim. Aky ma potom vyzam tento stav pouzivat.

Re:iptables
« Odpověď #7 kdy: 19. 11. 2017, 19:19:25 »
Okey, len potom stav = RELATED, je tam vo finale na co?

Některé protokoly mají víc než jedno spojení a to může být dokonce otevírané z druhé strany. Příkladem je klasické (aktivní) FTP. Tam je otevíráno ftp-control spojení od uživatele k serveru, ale server otevírá zpět druhé spojení k uživateli (ftp-data). V případě pasivního FTP se pak otevírá druhé spojení od klienta k serveru, ale na dynamicky určeném portu. A pro toto je právě ono RELATED. Je to tedy, správně, NEW spojení, ale aby se dalo propustit, má speciální příznak zpřízněnosti - RELATED.

Podobně třeba fungují PPTP VPN, ty otevírají spojení na tcp/1723, ale data pak tečou protokolem GRE.

Na to, aby nějaké spojení mohlo být RELATED, musí na firewalu být jakýsi pumprlík, kterému se říká "helper", který špehuje to první spojení, a z dat, které vykutá ví, které další spojení je RELATED.

asdf123

Re:iptables
« Odpověď #8 kdy: 19. 11. 2017, 21:45:36 »

-A INPUT -p tcp -m tcp --dport 29799:29899 -j ACCEPT #datove porty


hociaky malware ti otvori port na 29799 a hopla, diera do systemu jak vrata :) pekne ho pustis bez opytania. To related je tam prave na to aby si nemusel mat backdoory vo firewalle :)

asdf123

Re:iptables
« Odpověď #9 kdy: 19. 11. 2017, 21:51:14 »
Tiez stav NEW. Ved kazde spojenie, ktore sa navazuje, je NEW, apson teda myslim. Aky ma potom vyzam tento stav pouzivat.

vsimni si, ze ESTABLISHED a RELATED mas stale ako prve v tabulke :) keby si tam mal len new, tak ti kazdy packet musi prejst celou iptables tabulkou kym zisti ktoremu pravidlu patri, ale co , skus si to, bude ti to fungovat aj len s NEW pravidlami, ale uvidis ako ti pojde vykon dole, resp CPU zataz hore.

Re:iptables
« Odpověď #10 kdy: 20. 11. 2017, 07:31:00 »
vsimni si, ze ESTABLISHED a RELATED mas stale ako prve v tabulke :) keby si tam mal len new, tak ti kazdy packet musi prejst celou iptables tabulkou kym zisti ktoremu pravidlu patri, ale co , skus si to, bude ti to fungovat aj len s NEW pravidlami, ale uvidis ako ti pojde vykon dole, resp CPU zataz hore.

Já bych to takto negeneralizoval. Jsou typy provozu, u kterých je zbytečné vůbec plýtvat prostředky na stateful firewall. Např. pokud to není poslední firewall v řadě, nebo pokud je provoz opravdu dobře zpracováván v aplikaci. Příkladem je celý protokol UDP, který je z podstaty stateless.

Takže pokud šetřit prostředky tak v tomto pořadí:
1. určit, k jakému provozu potřebuji (vyžaduji) stateful zpracování,
2. pravidla pro rozpoznání poškozených paketů (např. nepřípustné nebo neočekávaní kombinace TCP flagů),
3. první pravidla pro stateless provoz,
4. druhá pravidla pro established,
5. určit, jestli vůbec potřebuji RELATED, pokud ne, nezavádět toto pravidlo (málokdo dodržuje),
6. pravidla pro stateful firewall (NEW)
7. cílové REJECTY a DROPY.

Co jsou podle mě prohřešky (zbytečné) proti síťové etice:
1. zakazovat úplně ICMP,
2. z LAN mají být nastaveny REJECTY, ne DROPY,
3. z WAN mají být nastaveny DROPY, příp. TARPIT.

Bohužel, většina firewallů založených na linuxu (i dalších free systémech) funguje podle primitivních příkladů na netu, kde se nepracuje dobře ani se statefull / stateless provozem, dost často se ICMP zakazuje by default (prasárna!), a zbytek provozu se bez přemýšlení DROPUJE.
« Poslední změna: 20. 11. 2017, 07:33:12 od Miroslav Šilhavý »

j

Re:iptables
« Odpověď #11 kdy: 20. 11. 2017, 09:45:22 »
...
FTP je zrovna blbej priklad, protoze na to aby ti FTP prelezlo pres nat potrebujes spesl modul (helper) a related ti nepomuze. To obecne plati o vsech protokolech, ktery si vymenujou nejaky informace o navazovanym spojeni v ramci vlastniho protokolu.

Re:iptables
« Odpověď #12 kdy: 20. 11. 2017, 10:21:30 »
FTP je zrovna blbej priklad, protoze na to aby ti FTP prelezlo pres nat potrebujes spesl modul (helper) a related ti nepomuze. To obecne plati o vsech protokolech, ktery si vymenujou nejaky informace o navazovanym spojeni v ramci vlastniho protokolu.

FTP je právě ideální příklad. RELATED naopak vždy vyžaduje helper.
Pokud nepoužíváte žádný protokol, který by potřeboval helper, pak můžete RELATED z konfigurace firewallu vynechat.

Tomas123

Re:Stavové filtrování s iptables
« Odpověď #13 kdy: 20. 11. 2017, 11:17:28 »
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
...
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 29799:29899 -j ACCEPT #datove porty // vylucim pravidlo
...
-A INPUT -j DROP

Pokial vas dobre chapem, tak porty (datove), mozem zavriet. Ked sa client pripoji na 21, tak by packet mal dostat stav (priznak) RELATED, a FTP server (je za routerom, passiv mod), by si mal otvorit datovy port (nejaky nahodny, ci nahodny, ktory mam definovany v konfiguracii?). Zatial to chapem spravne?

Docital som sa, na to potrebujem zaviest modul conntrack, aby si trackoval spojenie. Problem je, ze ked ho zavediem, tak mi to nefunguje. Na servery v logoch vidim, ze uzivatel je pripojeny, len client nedostane vypis adresara a tam to cele dropne.... Teraz citam, je treba modul helper... Trebo ho najeko specialne zaviest?
echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper ??

asdf123

Re:Stavové filtrování s iptables
« Odpověď #14 kdy: 20. 11. 2017, 14:27:01 »
Docital som sa, na to potrebujem zaviest modul conntrack, aby si trackoval spojenie. Problem je, ze ked ho zavediem, tak mi to nefunguje. Na servery v logoch vidim, ze uzivatel je pripojeny, len client nedostane vypis adresara a tam to cele dropne.... Teraz citam, je treba modul helper... Trebo ho najeko specialne zaviest?
echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper ??
kernel si nema odkial "domysliet" ktore spojenia su related, musis mu pomoct prave tymto helperom. Teoreticky by to mohlo byt aj zabudovane, ale takto to je modularne pre lubovolnu sluzbu alebo FTP server ktory moze mat nejaky custom helper.