Příklady
Základní filtrování
Pokud se budeme řídit podle pravidla, že "co není výslovně dovoleno, je zakázáno", měl by náš
firewallový skript začínat asi takto:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Povolíme základní ICMP pakety potřebné alespoň pro ping a traceroute (0 - Echo reply, 3 - Destination
unreachable, 8 - Echo request, 11 - Time exceeded):
iptables -A INPUT -p ICMP -i eth0 --icmp-type 0 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 3 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 11 -j ACCEPT
Povolíme také systémový loopback. Dále předpokládejme, že např. máme počítač připojený jedním
rozhraním do důvěryhodné sítě. Pak použijeme:
iptables -A INPUT -p ALL -i lo -j ACCEPT
iptables -A INPUT -p ALL -i eth1 -j ACCEPT
Pokud má být např. na našem počítači ze strany internetu dostupné WWW a SMTP rozhraní, použijeme:
iptables -N tcp_segmenty
iptables -A INPUT -p TCP -i eth0 -j tcp_segmenty
iptables -A tcp_segmenty -p TCP --dport 80 -j ACCEPT
iptables -A tcp_segmenty -p TCP --dport 25 -j ACCEPT
Zde je pěkně vidět tvorba uživatelského řetězce.
Stavové filtrování
Jak již bylo řečeno, při filtrování dokáže netfilter zohledňovat také stavové informace. Rozlišujeme
tyto stavy:
- ESTABLISHED - paket je součástí již existujícího spojení (ve kterém již
proběhly pakety oběma směry)
- NEW - jde o paket, který otvírá nové spojení (nebo je součástí dosud jednostranného spojení)
- RELATED - paket, který se vztahuje k nějakému existujícímu spojení, ale není přímo jeho
součástí (např. ICMP chybová zpráva)
- INVALID - paket který nelze přiřadit žádnému existujícímu spojení
Tohoto lze s výhodou využít, pokud chceme například povolit neomezené směrování
paketů z vnitřní sítě, ale z vnějšku dovnitř pouze již existující spojení:
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
NAT
O NAT jsme si již něco pověděli. Nejčastějším použitím SNAT je IP maškaráda, neboli zamaskování
IP adresy routovaných paketů adresou routeru. Používá se například pokud máme od poskytovatele
přidělenu jedinou IP adresu, a chceme připojit k síti větší množství počítačů. Veřejnou adresu
dáme routeru, ostatním dáme adresy privátní, a použijeme např.:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
U všech paketů dojde tedy při opuštění naší vnitřní sítě přes eth0 k přepsání původní IP adresy na
adresu 1.2.3.4. Lze také uvádět rozsahy adres, což se využívá při rozdělení zátěže (load
balancing - vybere se nejdéle nepoužitá).
Pokud vnější adresu v okamžiku zavádění pravidla ještě neznáme, například proto, že ji teprve
získáme z DHCP serveru, uvedeme trošku jednodušeji:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Příkladem pro DNAT je například přesměrování všech požadavků na jediný WWW server v naší
vnitřní síti, řekněme:
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.2:8080
Speciálním případem DNAT je přesměrování. Například:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
dovoluje přeposílat příchozí HTTP pakety na transparentní proxy (squid) v naší síti.
Rozdíl mezi filtrovací tabulkou a NAT tabulkou je také v tom, že zatímco filtrovací tabulkou
prochází každý paket bez rozdílu, tak NAT tabulka je aktivní pouze pro první paket nového
spojení. Proto tedy není vhodné používat NAT tabulku pro nějaké složité filtrování.
S výhodou však můžeme NAT tabulku často použít prostě proto, že pravidla
stačí zapsat jen jednou a nemusíme je zdvojovat v INPUT a FORWARD. Následující
pravidla nám například zakážou pakety s nesmyslnou zdrojovou adresou přicházející
zvenčí naší sítě:
iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
Nesmíme zapomínat, že pokud paket vyhověl v tabulce nat, ještě to neznamená, že má volný
průchod tabulkou filter. Obzvlášť při restriktivní politice (policy DROP) je nutné
dané spojení vždy ještě povolit v tabulce filter.
Mangle
Tabulka mangle zavádí nový prostředek pro výběr paketu - označení paketu pomocí
MARK. To může být použito v následujících pravidlech. Příklad:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
Mangle také dovoluje měnit například TTL (podobně také TOS) paketu:
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 64