Autor: Jiří Hnídek / jiri.hnidek@tul.cz
“Pojem firewall označoval původně protipožární zeď, která slouží pro oddělení ohně v budově, aby se nešířil dále.”
“The authority to represent someone else, especially in voting.”
Netfilter definuje 5 záchytných bodů, kde se volají callback funkce:
NF_IP_PRE_ROUTING
: při přijetí paketu před tím, než se rozhodne, jak se bude paket směrovatNF_IP_LOCAL_IN
: paket má cíl na daném strojiNF_IP_FORWARD
: paket se má předat dálNF_IP_IP_LOCAL_OUT
: paket byl vytvořen na daném strojiNF_IP_POST_ROUTING
: před odesláním mimo stroj.Než paket dorazí do socketu, tak jeho cesta může být hodně komplikovaná:
Iptables obsahují 5 základních řetězců pravidel:
PREROUTING
je spouštěn: NF_IP_PRE_ROUTING
INPUT
je spouštěn: NF_IP_LOCAL_IN
FORWARD
je spouštěn: NF_IP_FORWARD
OUTPUT
je spouštěn: NF_IP_LOCAL_OUT
POSTROUTING
je spouštěn: NF_IP_POST_ROUTING
Iptables obsahují 5 tabulek s řetězci pravidel
filter
: výchozí tabulka k filtrování paketů. Obsahuje základní řetězce pravidel: INPUT, OUTPUT a FORWARDnat
: tabulka pro NAT. Základní řetězce pravidel: PREROUTING, OUTPUT, POSTROUTINGmangle
: tabulka pro změnu paketů: PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTINGraw
: pravidla před tabulkou filter. Řetězce: PREROUTING, OUTPUTsecurity
: pro SELinux. Řetězce: INPUT, OUTPUT, FORWARDTeď se to trochu komplikuje, ale v praxi si člověk většinou vystačí s tabulkou filter a řetězcem INPUT.
Pravidla (pro IPv4) můžeme vypsat pomocí:
iptables -t filter -L -v -n --line-numbers
Pro IPv6 pomocí:
ip6tables -t filter -L -v -n --line-numbers
Může vypsat spoustu pravidel. Jedním z nich bude třeba:
Chain IN_public_allow (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
ACCEPT
: paket je v dané tabulce řetězců přijatDROP
: paket je zahozenRETURN
: paket již neprochází daným řetězcem pravidel a jeho zpracování se vrací do nadřazeného řetězceman iptables-extensions
firewall-cmd
příkaz pro definici pravidel.firewall-config
dost nepovedený program s GUI.Uvažujeme nastavení na serveru, kde chceme povolit: ping, spojení na webový server (port 80) a vzdálenou správu pomocí SSH (port 22). Budeme tudíž nastavovat pouze tabulku filter a řetěz pravidel INPUT.
Začneme tím, že smažeme všechna pravidla (IPv4):
iptables -t filter -F INPUT
Toto musíme udělat i pro protokol IPv6:
ip6tables -t filter -F INPUT
Kopírování příkazů pro IPv6 je pěkná otrava. Další příklady příkazů budou pouze pro IPv4.
Jelikož tabulka filter je defaultní, tak není nutné psát neustále parametr: -t filter.
Implicitní cíl je v základním řetězci ACCEPT. Změníme ho na DROP:
iptables -P INPUT DROP
Začneme povolením ICMP paketu se zprávou "Echo Request":
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Povolíme TCP pakety přicházející na porty (80 a 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Tím jsme získali bezestavová firewall.
Iptables se většinou používají ve funkci stavového firewallu. K tomu účelu slouží module conntrack.
Tento modul si pamatuje všechna TCP spojení. Příklad:
iptables -F INPUT
iptables -P INPUT DROP
# Povolíme pakety patřící k existujícím spojením
iptables -A INPUT -m conntrack --state ESTABLISHED,RELATED -j ACCEPT
# Povolíme ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Povolíme SYN pakety pro nová spojení na povolené služby
iptables -A INPUT -m conntrack -ctstate NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m conntrack -ctstate NEW -p tcp --dport 80 -j ACCEPT
Existující spojení lze vypsat pomocí:
cat /proc/net/nf_conntrack
Například v případě SSH nechcete, aby bylo možné se na daný stroj přihlásit z celého internetu. Možnost připojit se je vhodné omezit na nějakou (důvěryhodnou) podsíť:
iptables -A INPUT -m conntrack -ctstate NEW -s 147.230.0.0/16 \
-p tcp --dport 22 -j ACCEPT
Spojení lze omezit jen na vybrané síťové rozhraní:
iptables -A INPUT -i eth0 -m conntrack -ctstate NEW \
-p tcp --dport 80 -j ACCEPT
Počet požadavků za časové období (sekunda, minuta, atd.) lze omezit například pomocí modulu limit:
iptables -A INPUT -p icmp --icmp-type echo-request \
-m limit --limit 1/s --limit-burst 10 -j ACCEPT
Omezí počet ICMP paketů "Echo Request" na 10 za sekundu.
V případě zahlcení od většího množství strojů z nějaké podsítě je možné použít modul connlimit:
iptables -p tcp --syn --dport 80 -s 147.230.0.0/16 \
-m connlimit --connlimit-above 16 -j REJECT
Pozor: Používat s rozmyslem, aby nedošlo k omezení regulárního provozu.
Další informace k nalezení na http://jirihnidek.github.io.
“Die, IPv4. Die!.”
Stavový firewall není všemocný. Na následujícím kódu si ukážeme, že se lze za určitých podmínek připojit na port, který není na stavovém firewallu explicitně povolen.
https://gist.github.com/jirihnidekSeznam zajímavých odkazů k tomuto tématu: