Původní význam slova firewall je „protipožární stěna“. Pro nás je to počítač (software) který odděluje 2 sítě (typicky Internet a Intranet), provádí logování, filtrování či upravování dat, jež mezi sítěmi protékají, zajišťuje autentizaci uživatelů nebo strojů. Firewall může chránit třeba i jen jeden počítač. Jde o tzv. „host-based firewall“. Firewall nás na jednu stranu chrání před útoky zvenku a snižuje riziko zneužití chyb v softwaru síťových služeb, ale na druhou stranu obtěžuje a může vézt k podcenění útoku zevnitř.
Zpět na obsahRozhoduje se pouze podle IP hlaviček. Nezkoumá nic nad 3 vrstvu OSI modelu. Tzn. nerozumí souvislostem mezi pakety. Neumí určit, které pakety patří do jednoho spojení.
Funguje na aplikační vrstvě. Zájímá ho význam paketu v kontextu spojení. Autentizuje každé připojení zvlášť.
Kombinace obou přístupů. Obvykle budován jako nádstavba paketového filtru.
Analyzuje procházející pakety a podává varovná nebo chybová hlášení.
Zpět na obsahJak vyplývá z názvu, jde o překlad adres. Rozděluje se na DNAT a SNAT. Destination NAT je přepísování cílových adres a cílových portů v paketech a Source NAT je analogie pro zdrojové adresy a zdrojové porty. Nejčastěji se využívá tzv. „maškaráda“ (druh SNATu), kdy se v paketech odcházejících z vnitřní sítě přepisuje zdrojová IP adresa na adresu routeru. Tak se skryje vnitřní struktura podsítě je možné celé podsíti přiřadit jednu veřejnou adresu. Router si samozřejmě pamatuje všechna spojení a tak odpověď zvenku doručí zase zpátky na stroj, ze kterého přišel dotaz. Hlavní nevýhodou je, že spojení tak jdou iniciovat pouze zevnitř.
Zpět na obsahPrvní firewall ipfw portoval do jádra 1.1 z BSD v roce 1994 Alan Cox. V jádře 2.0 přibyl nástroj ipfwadmin pro nastavování pravidel. Od jádra 2.2 přibyl nástroj ipchains, který rozšiřoval možnosti ipfw (zavedl řetězy pravidel). Pro jádro 2.4 byl firewall kompletně přepsán. Jaderná část se jmenuje netfilter. Pro nastavení jeho pravidel se používá uživatelský program iptables.
Zpět na obsah________ _____ _________ / \ / \ / \ příchozí-->|PREROUTING|-->[směrovací ]---->|FORWARD|---->|POSTROUTING|--> odchozí pakety \________/ [rozhodnutí] \_____/ \_________/ pakety | ^ v ____ | _|_ / \ | / \ |OUTPUT|-->[směrovací ] |INPUT| \____/ [rozhodnutí] \___/ ^ | | `--> lokální proces --'Zpět na obsah
Existují tři nezávislé tabulky, které může iptables upravovat. FILTER je tabulka obsahující filtrovací pravidla, NAT je tabulka obsahující pravidla překladu adres a MANGLE je tabulkou pro pravidla úpravy hlavičky paketů, manipulace s TOS, TTL, značkování, etc. V případě, že tabulku neuvedete, použíje se implicitní FILTER.
iptables -t <tabulka> ...
Chain je řetězec pravidel. Paket prochází řetězcem a když nezabere žádné pravidlo, použije se implicitní akce řetězce. Řetězce se dají řetězit. :-) Předdefinované řetězce jsou INPUT - pakety určené pro lokální systém, OUTPUT - pakety z lokálního systému odchozí, FORWARD - pakety přeposílané, POSTROUTING a PREROUTING. Viz. diagram Cesta paketů. Ne všechny jsou však dostupné ve všech tabulkách. Například v tabulce FILTER nejsou dostupné řetězce PREROUTING a POSTROUTING a v tabulce NAT nejsou dostupné řetězce INPUT a FORWARD.
iptables (-L [<řetězec>] | --list [<řetězec>]) # vypíše pravidla v určeném řetězci iptables (-F [<řetězec>] | --flush [<řetězec>]) # odstraní pravidla z určeného řetězce iptables (-Z [<řetězec>] | --zero [<řetězec>]) # vynuluje čítače v řetězci iptables (-X [<řetězec>] | --delete-řetězec [<řetězec>]) # smaže uživatelský řetězec # nesmí v něm být skoky do jiných řetězců # pokud řetězec neuvedeme, akce se uplatní na všechny řetězce iptables (-N <chain> | --new-chain <chain>) # vytvoří nový uživatelský řetěz
Pravidlo stanovuje vlastnosti které musí paket splňovat. Když je splňuje, použíje se akce specifikovaná na konci pravidla.
iptables (-A | --append) <řetězec> <pravidlo> # připojit pravidlo na konec řetězce iptables (-D | --delete) <řetězec> (<pravidlo> | <čislo>) # smazat pravidlo z řetězce, jde i číslem od 1 iptables (-I | --insert) <řetězec> [<čislo>] <pravidlo> # vložit pravidlo na začátek řetězce nebo na určenou pozici iptables (-R | --replace) <řetězec> [<čislo>] <pravidlo> # přepíše pravidlo v řetězci iptables (-P | --policy) <řetězec> <pravidlo> # nastaví implicitní akci
Akce určuje osud paketu. Může být buď název řetězu nebo jedna z následujících hodnot: ACCEPT - paket je přijat, DROP - paket je zahozen, RETURN - když jsme ve vestavěném řetězci, tak skok na jeho konec nebo návrat do předchozího řetězce, QUEUE - paket je předán ke zpracování do uživatelskému programu. V připadě rozšiřujících modulů jsou dostupné i akce: DNAT - přepsání cílové adresy nebo portu, SNAT - přepsání zdrojové adresy nebo portu, MASQUERADE - přepsaní zdrojové adresy, adresou tohoto počítače, REJECT - viz. DROP navíc je odesilateli zaslána ICMP zpráva, LOG - některé pakety jsou logovány a mnohé další. Viz. manuálová stránka programu iptables sekce „TARGET EXTENSIONS“.
iptables ... (-j | --jump) <akce>
Netfilter je stavový firewall a s modulem state dokáže pakety rozdělit do celkem 4 kategorií. NEW - paket otevírající spojení, ESTABLISHED - paket náležející do již existujícího spojení, RELATED - paket nějakým způsobem související s již existujícím spojením. Pakety které se nepovede identifikovat náleží do skupiny INVALID.
Další volby: (vykřičník znamená negaci)
-p [!]<protokol> -s [!]<zdroj/maska> -d [!]<cíl/maska> --sport [!]<port> # číslo nebo /etc/services --dport [!]<port> -i [!]<rozhraní> -o [!]<rozhraní> -v # ukecanostZpět na obsah
Mít zapnutou ochranu před IP spoofingem (falšování zdrojové IP adresy). Blokuje takové adresy, které by měly podle routovací tabulky přijít z jiného rozhraní.
echo "1" > /proc/sys/net/ipv4/conf/eth0/rp_filter
Nastavit implicitní politiku. Je dobré všechno zakázat a explicitně povolovat vyjímky. Implicitní politiky jdou vytvářet jen pro vestavěné řetězce. Z těch uživatelský se v případě, že nesedí žádné pravidlo vracíme zpět.
iptables -P INPUT DROP # všechny příchozí pakety budeme zahazovat iptables -P OUTPUT ACCEPT # všechny odchozí pakety budeme pouštět iptables -P FORWARD DROP # všechny přeposílané pakety budeme zahazovat
Všechny příchozí pakety, které jsou součástí nebo nějak souvisí s již existujícím spojením povolit.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Nezapomenout povolit zpětovazebné rozhraní.
iptables -A INPUT -i lo -j ACCEPT
Abychom nemuseli opisovat stejná pravidla do dvou řetězců, vytvoříme si nový, do něho nadefinujeme pravidla a pak se do něj odkážeme.
iptables -N retez iptables -A retez -m mac --mac-source 00:4F:4E:60:AC:84 -j ACCEPT iptables -A retez -s 10.0.50.2 -j ACCEPT iptables -A INPUT -j retez iptables -A FORWARD -j retez
Existuje spousta modulů, jež jsou v manuálové stránce programu iptables popsány pod „MATCH EXTENSIONS“. Modul použijeme tak, že ho přidáme za přepínač -m.
iptables -A INPUT -i eth1 -m ttl --ttl-lt 3 -j ACCEPT iptables -A INPUT -p tcp -m multiport --detination-ports 80,110 iptables -A OUTPUT -m owner --uid-owner 1002 -j DROP
Source NAT (POSTROUTING) - známe adresu.
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.0.50
Source NAT - neznáme adresu.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Nezapomenout povolit v tabulce filter!!
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT# výpis maskovaných spojení # netstat -aM nebo cat /proc/net/ip_conntrack
Destination NAT (PREROUTING) Přesměrování portů.
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 10.0.50.2:80 iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j REDIRECT --to-ports 3128Zpět na obsah
Existují tři rozdílné firewally.
IPFILTER (IPF)
IPFIREWALL (IPFW)
PacketFilter (PF)
Firewall z OpenBSD. Od FreeBSD 5.3-RELEASE je soucasti zakladniho systemu. V predchozich verzích rady 5.x byl v portech.
V /etc/rc.conf zajisti po startu systemu spusteni prislusnych sluzeb.
pf_enable="YES" # spusti firewall pf_rules="/etc/pf.conf" # soubor s pravidly pf_flags="" # volby pro pfctl pflog_enable="YES" # spusti pflogd (povoli logovani) pflog_logfile="/var/log/pflog" # soubor, do ktereho se bude logovat pflog_flags="" # volby pro pfctl gateway_enable="YES" # asi chceme preposilat
Par užitečných příkazů:
pfctl -f <soubor_s_pravidly> # rucni nahrani pravidel pfctl -d # deaktivuje firewall pfctl -e # aktivuje firewall
Syntaxe:
<akce> [<smer>] [log] [quick] [on <rozhrani>] [proto <protokol>] \ [from <adresa> [port <port>]] [to <adresa> [port <port>]] [flags <tcp_priznaky>] [<stav>] akce - pass (povolení paketu), block (zahození paketu) smer - in, out log - příznak, zda se má logovat quick - když pravidlo pasuje, nepojede se dal protokol - tcp, udp, icmp, icmp6 nebo něco jiného z /etc/protocols adresa - samotná nebo CIDR, může být FQDN (resolvuje se v době nahrání pravidla) nebo název rozhraní port - čislo, názvy z /etc/services jde určit rozsah relačními operátory !=, <, >, <=, >=, <> - rozsah od do >< - negace předchozího : - rozsah od do včetně tcp_priznaky - SYN, ACK... stav - má se pamatovat stav?
Paket prochází všemi pravidly a o osudu rozhoduje až poslední vyhovující. Pokud to chceme změnit, musíme uvést klíčové slovo quick.
Můžeme vytvářet jednoduché proměnné a seznamy.
vnejsi = "xl0" vnitrni = "xl1" erigona = "10.0.0.1" doto-alpha = "{ 10.0.50.1 10.0.0.50 } cmd = "pass in on xl0"
Pamatování stavu. První paket utvoří spojení, od té doby do něj náleží všechny pakety v obou směrech.
pass out on xl0 proto tcp from 10.0.50.0/24 to any keep state pass in on xl0 proto tcp from $erigona to xl0 port { ssh telnet } keep state
Povolíme zpětovazebné rozhraní.
pass quick on lo all
Ochrana před IP Spoofingem. Obdoba rp_filteru v Linuxu.
antispoof quick for $vnejsi inet
Zakážeme jinak všechen provoz:
block all
Přesměrování portů:
rdr on xl0 proto tcp from any to any port 80 -> 10.0.50.2 rdr on xl0 proto tcp from 10.0.0.1 to 10.0.0.50 port 80 -> 10.0.50.2 port 8000
NAT ...
Zpět na obsah