Firewall a NAT
Netfilter
iptables
V syntaxi iptables
tato pravidla budou vypadat takto:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.1.10 -j DROP
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp --match multiport --dports 22,80,443 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -P INPUT DROP
iptables
je program, kterým manipulujeme s pravidly Netfilteru. Parametr -A
znamená append, přidáváme jím tedy pravidlo na konec řetězce INPUT
. -P
znamená policy, tedy výchozí pravidlo pro chacin. Chybí zde ovšem specifikace, že manipulujeme s tabulkou filter - to ale psát nemusíme, protože to je výchozí hodnota. Kdybychom například manipulovali s tabulkou nat
, napsat bychom to už za parametr -t
museli:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
K tomu se ale dostaneme za chvíli.
Teď se hodí upozornit na to, že pravidla, která takto zadáme přes příkazovou řádku, se zapíší do kernelu a začnou se okamžitě vynucovat. Ale vydrží v kernelu jen dokud je nezměníme opět přes iptables
nebo do restartu systému. Musíme se tedy pomocí skriptů a dalších utilit - iptables-save
a iptables-restore
postarat o zavedení pravidel po restartu. Některé distrubuce to udělají za nás. V Debian-based distribucích to bylo tradičně na administrátorovi.
Dále je dobré si všimnout, že sémantika pravidel je, že obsah jedno pravidla, to musí platit pro packet zároveň, aby mělo pravidlo shodu. Tedy v případě našeho třetího pravidla:
- vstupní rozhraní je eth0 a zároveň
- zdrojová adresa je ze subnetu 192.168.1.0/24 a zároveň
- packet je TCP segment a zároveň
- cílový port je 22 nebo 80 nebo 443 - tohle je trochu specialita, také se na to v
iptables
musí použít speciální modulmultiport
Bez --match multiport
bychom to museli napsat jako tři pravidla, kde by poučka o AND formě pravidel platila dokonale.
Ještě se bezprostředně hodí vědět, jak pomocí iptables
zobrazíme aktivní pravidla. Je na to příkaz iptables -L -t <table>
. Tabulku pomocí -t
nemusíme specifikovat a v tom případě se opět zobrazí výchozí tabulka filter. Příklad:
root@c1:~# iptables -L -vxn
Chain INPUT (policy DROP 21 packets, 1448 bytes)
pkts bytes target prot opt in out source destination
1 82 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 192.168.1.10 0.0.0.0/0
0 0 ACCEPT tcp -- eth0 * 192.168.1.0/24 0.0.0.0/0 multiport dports 22,80,443
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Parametry -v
(verbose) -x
(exact) -n
(numeric) jsem použil pro zpřehlednění výpisu a zamezení reverzním DNS dotazům na IP adresy ve výpisu, které by neúměrně zdržovaly vygenerování výstupu a stejně by ho v reálné situaci akorát znepřehlednily.
Odkazy: