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í modul multiport

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: