Hlavni know-how pri vytvareni firewallu neni v tom,
jak se ta pravidla pisou, ale v tom do jakych casti
vlastne to filtrovani rozdelit. Prijde mi napriklad
naprosto zbytecne filtrovat cokoli v retezci OUTPUT. Take nevim, proc vsichni rozdeluji zvlast UDP a zvlast TCP provoz - tady zadnou funkcnost zavedenim dalsiho chainu neziskame. Naproti tomu kdybychom treba zavedli retezec "spoof", ktery by delal ochranu pred IP spoofingem a treba zahazovani RFC1918 IP adres na vstupu, tak tady se uz zvlastni chain vyplati - jednak muzeme misto ACCEPT/DROP rozhodovat stylem RETURN/DROP a pak zpracovavat dal, a jednak tento chain lze volat jak z INPUT tak z FORWARD (ja vim, ze zrovna tohle lze udelat i pomoci route path filteru, ale jsou situace, kdy rp_filter nelze pouzit - treba IPsec).
Dalsi poznamka je, ze vam to nebude fungovat, aspon pokud mate dostatecne novy BIND - ten pro odchozi dotazy nepouziva zdrojovy port 53, ale neco nahodneho nad 1023 (lze ho ovsem direktivou query-source prinutit k pevnemu portu). Takze odpovedi na vlastni DNS dotazy zahazujete v INPUT (i v INPUT je treba pouzit stavovou filraci, pripadne povolit packety z portu 53 na port query-source).
-Yenya
Ad: rozdělení TCP a UDP.
TCP je vhodné oddělit například tehdy, když chceme
filtrovat TCP pakety s příznakem SYN, které zároven
nejsou ve stavu NEW. Jistě to lze udělat i jinak, ale
tohle mi připadá jako dobrá motivace. Více bude v přpravovaném třetím díle článku.
Ad BIND:
Ano, funkční firewall by měl povolovat --state
ESTABLISHED,RELATED i v řetezci INPUT.
V uvodu mi trochu chybi informace, ze se tyka pouze 2.4 rady (prip 2.3), protoze ve 2.2 prochazi routovany paket vsechny tri chainy. Autor pouziva pro FORWARD modul state, coz je dobre, ale nepouziva ho pro INPUT. Tam se ale hodi mnohem vic, protoze pomoci nej muzeme firewall zjednodusit a predevsim omezit napr. skenovani portu ruznymi stealth technikami. Nema ani negativni dopad na vykon, protoze pokud je uz zapnuto sledovani konexi v kernelu, samotny test moc casu nezabere. K povolenym ICMP by se jeste dala pridat ICMP source-quench. Trideni provozu na UDP a TCP mi take unika, stejne jako filtrovani na OUTPUT. No a co mi prijde uz ponekud uplne mimo, tak mi tam chybi v INPUT nejake pravidlo, ktere by mi umoznilo jinou komunikaci nez je www a smtp. Treba tam obcas budu potrebovat stahnout nejaky update. Ale protoze nemam povoleny zadne pakety na jine nez www a smtp porty, tak si je asi nestahnu. Posledni drobnost, kterou bych autorovi vytknul, ze SNAT neni MASQUERADE. Hlavni rozdil je v tom, ze maskarada modifikuje zdrojovy port do oblasti nad 60000 (podle konfigurace), zatimco SNAT se snazi port zachovat.
Dekuji za reakci. Podrobnejsi informace o NATu budou
naplni druheho pokracovani clanku, stejne jako dalsi
priklady na stavovy firewall budou uvedene ve treti
casti, kde jiz by take mela byt uvedena take finalni
podoba sady firewallovych pravidel, pouzitelna v praxi.
Myslim, ze source-quench neni v soucasne dobe prilis
pouzivan a v RFC 1122 se pise: "routers should discard
them".
Filtrovani v OUTPUTu nema zadne velke vyuziti (coz
ostatne v clanku zaznelo), ovsem da se na nem snadno
demostrovat mechanismus tvorby filtrovacich pravidel,
stejne jako rozdeleni TCP a UDP provozu naznacuje
moznosti tvorby vlastnich retezcu, coz bylo zamerem
tehle casti.
Pokud narazite na to, ze v RH 7.x je zaroven sluzba,
ktera se nazyva iptables, tak vezete, ze tato se stara
o nastavovani/zhazovani filtrovacich pravidel. Neni to
tedy demon, ale nadstavba nad iptables.
Pokud nechcete, nemusite ji pouzivat a pravidla si
nastavovat primo, pomoci skriptu s primym volanim
iptables.
Konkretne budem riesit obmedzenie asi na routeri, nie na koncovom pocitaci, inak s ingres som mal problem, vypisalo mi, ako keby neexistoval ten modul, zrejme som nieco nedokompiloval do jadra. Co sa tyka modulu limit, ten neviem, ci umoznuje kontrolovat priamo pocet pretekajucich bytov, skor pocet packetov (zatial som to vyuzival na obmedzenie vytvarania velkych logov). Ak sa mylim, opravte ma, pripadne skuste uviest nejaky jednoduchy priklad.
No, z maskarady ano, zdrojovy port se toula mezi 61000 a 65000, u bezneho nemaskovaneho spojeni je mezi 1024 a 5000 (linux, u win jsem v zivote nevidel tak vysoky port jako je 4000). U SNAT je to uz vetsi problem, porty jsou vetsinou stejne. Nejjednodussi je, pokud na masine bezi identd. Na dotazy na maskovana spojeni odpovida chybovym hlasenim, na spojeni primo z masiny vrati jmeno uzivatele, kteremu spojeni patri. Trosku slozitejsi metoda by asi spocivala v pokusu vnutit do spojeni vadny paket, ktery by prosel NAT kodem, ale maskovany stroj by vratil chybovou ICMP zpravu. Ve 2.2 kernelu (tedy maskarada) nebyly tyto chybove zpravy zpetne maskovany, takze v nich bylo skutecne ip maskovaneho pocitace. Jak je to v NAT kodu 2.4 jsem zatim nezkoumal. Otazkou ale zustava, nakolik je mozne takovy vadny paket protlacit.
Tak mě napadá, že ve článku by ještě mohl být odkaz
na to, jak vypadá hotový firewallový skript. Nebo
spíše jak bude vypadat po dokončení tohoto seriálu.
Napsal jsem tedy ukázková pravidla, hojně jsem je
okomentoval a vystavil na:
http://www.petricek.cz/mpfw/mpfw.sh.txt
Pokud to někomu pomůže budu rád :)
Radek
$IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 113 -j REJECT #AUTH server
je dobre mit, bohuzel kernel vraci nevhodnou ICMP chybovou zpravu (tusim ze no route to host). Ta u vetsiny serveru, ktere se o ident pokouseji, zpusobi stejnou prodlevu. Druha vec je ta, ze je videt, ze je pocitac chranen firewallem, coz muze nekdy vadit. Myslim, ze nejvhodnejsi je:
$IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 113 -j REJECT #AUTH server --reject-with icmp-port-unreachable
Zdravim!
Predem diky za clanek.
Vrta mi hlavou co se stane s pakety na vstupu kdyz projdou do 'retezce' tcp_segmenty, ale uz nesplni ani jedno pravidlo pro tento 'retezec'. Kernel se k nim zachova dle implicitni politiky pro INPUT (a) ci je pro nove zalozene 'retezce' treba nastavovat imlicitni politiku (b)?
Z cteni mezi radky jsem vydedukoval, ze a) je spravne, pricemz varianta b) mi pripada o neco logictejsi. Omlouvam se za dotaz na neco co bych mohl nacist v man ci info, ale momentalne nemam moznost si to vyzkouset. Dik.
Martin Trtusek
Zavedte modul ip_conntrack_ftp a povolte prichozi ESTABLISHED a RELATED konexe na INPUTu, resp. FORWARDu.
Podivejte se do http://www.petricek.cz/mpfw/mpfw.sh.txt nebo pockejte na treti dil tohoto clanku ve kterem je problematika aktivniho/pasivniho rezimu rozebrana podrobneji.