První z věcí, co se zde nastavuje, je protokol. Jako protokoly můžeme standardně použít ICMP, UDP, TCP nebo ALL, avšak lze použít i ty, co máme v /etc/protocols
. Protokol určíme pomocí přepínače -p
( --protocol
). Pokud napíšeme za přepínačem vykřičník, znamená to negování. Například -p ! tcp
znamená, že pravidlo vyhoví, pokud protokol není TCP. Možnost negování bude ve většině z následujících voleb.
Zdrojová a cílová IP adresa: přepínače pro zdrojovou IP jsou -s
, ( --src
, --source
) a pro cílovou -d
( --dst
, --destination
). Pokud nepoužíváme výchozí masku, můžeme IP adresu napsat také ve tvaru 192.168.0.1/24
či 192.168.0.1/255.255.255.0
.
Pro zjištění, ze kterého zařízení paket přišel či které se právě snaží opustit, použijeme přepínače -i
( --in-interface
) pro vstupní zařízení, anebo -o
( --out-interface
) pro zařízení, které se pokouší opustit. Pozn.: tato volba nefunguje v případě, že máme síťovou kartu v mostu, v takovém případě se používá match (rozšíření) physdev, o kterém bude řeč později.
Předposlední volba -j
( --jump
) nám určuje akci, kterou chceme provést, jestliže pravidlo vyhovělo. Základní akce jsou ACCEPT, která pustí paket dále a DROP, která ho zahodí. Ve skutečnosti je jich samozřejmě více, o nich bude řeč v kapitolce o rozšíření akcí.
Poslední, kterou zde uvedu, bude GOTO -g
( --goto
), možná ji už někteří z vás znáte z programování. Tato volba se používá místo jump, pokud chceme pravidlo testovat v jiných řetězcích, které si nadefinujeme (tedy ne hned vykonat akci). Můžeme mít chain MOJE (jak si ho založit jsem popsal v minulém díle), ve kterém budou nějaká specifická pravidla. V rámci řetězce INPUT si otestujeme, jestli paket vyhovuje nějakému základnímu kritériu, a pak ho pomocí goto pošleme do řetězce MOJE, kde se podle pořadí bude testovat dále, dokud některému z pravidel nevyhoví …
To byly nejčastější volby, které je zde možné použít, nyní bychom přešli k praktickým příkladům. Na těch si vysvětlíme, jak to sepsat a na co si dát pozor.
Uvedu příklad: Chci, aby pakety, které přijdou na eth0 z jiné adresy než 192.168.0.1, byly zahozeny.
1) Takže v tomto případě první věc, kterou uděláme, bude, že si zvolíme tabulku filter, protože chceme aplikovat pravidla na vstupní pakety – chain INPUT.
2) Jako výchozí politiku, pokud by paket nesplňoval ani jedno z našich pravidel, dáme zahodit.
3) Paket vstupuje do síťového zařízení na eth0, takže volba -i eth0, a jeho zdrojová adresa je -s 192.168.0.1, tak ho povolíme: -j ACCEPT. To je vše … složili jsme úspěšně naše první pravidlo:
iptables -P INPUT DROP
iptables -A INPUT -i eth0 -s 192.168.0.1 -j ACCEPT
Pokud jste četli pozorně, tak jsem se předtím zmiňoval o negaci. Dal by se tedy v tomto konkrétním příkladu použít i tento zápis.
iptables -A INPUT -i eth0 -s ! 192.168.0.1 -j DROP
Výsledný efekt bude stejný, ale abychom si dobře uvědomili, jak důležité je pořadí pravidel, zkusíme si povolit ještě jednu IP adresu, např. 192.168.0.3 – a zápis bych napsal takto:
iptables -A INPUT -i eth0 -s ! 192.168.0.3 -j DROP
iptables -A INPUT -i eth0 -s ! 192.168.0.1 -j DROP
Co se stane? Povoleny budou jenom ty z 192.168.0.3. Proč? Protože všechny pakety, které nejsou z 192.168.0.3, vyhoví v tom prvním pravidle – budou zahozeny, a další se už netestují. Možností, jak opravit tento zápis, by bylo více, třeba použít již zmiňovanou výchozí politiku na zahození a obě sítě prostě po jednom povolit. Nebo by šlo udělat i toto:
iptables -A INPUT -i eth0 -s 192.168.0.3 -j ACCEPT
iptables -A INPUT -i eth0 -s ! 192.168.0.1 -j DROP
Teď už by to fungovalo správně. Paket s adresou 192.168.0.3 by prvnímu pravidlu vyhověl a ostatní pakety kromě 192.168.0.1 by se zahodily.
Tímto jsme si zatím vysvětlili tu nejzákladnější část. Když ji nepochopíte, nemá bohužel cenu pouštět se hlouběji do iptables. Doporučoval bych vám kouknout se na některé „vývojáčky” – jak paket cestuje pravidly. Celkem pěkné jsou uvedené v diskuzi předešlého dílu.
MATCH EXTENSIONS
Předposlední kapitolka obsahuje vlastně taková rozšíření pravidel o případy, v nichž nestačí určit pouze IP část a chceme je definovat podrobněji. Určují se přepínačem -m a jako první si uvedeme tcp a udp. Pro pohodlnost hned na začátku uvedu, že pokud jsme si předtím zvolili protokol (-p tcp), nemusíme nastavovat přepínač pro rozšíření.
Takže volby mají --sport
( --source-port
) pro zdrojový port a --dport
( --destination-port
) pro cílový. Můžete zadat jenom jeden port. (Co se týče tcp, má více voleb, ale ty bych sem ze začátku nezatahoval.) Pravidlo pro zahození všech příchozích udp paketů z eth0 na port 199 by vypadalo takto:
iptables -A INPUT -i eth0 -p udp --dport 199 -j DROP
Dalším rozšířením, které zde najdeme, je multiport. Je to myslím velice užitečné rozšíření, zvláště pokud bychom chtěli spojení, která jdou na port 80, 90 a 100 zahodit. Psali bychom to asi nějak takto:
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 90 -j DROP
iptables -A INPUT -p tcp --dport 100 -j DROP
Možná je takový zápis výhodný při vzorném komentování každého pravidla, ale v praxi si myslím, že nám jen zbytečně roste počet pravidel. Proto toto rozšíření dovoluje přidat až 15 portů oddělených čárkou do jednoho pravidla. Volby jsou: zdrojové, cílové porty nebo oba stejné ( --destination-ports
, --source-ports
, --ports
) Náš příklad by vypadal následovně:
iptables -A INPUT -p tcp -m multiport --destination-ports 80,90,100 -j DROP
Jedno z novějších rozšíření, které se nám hodí hlavně pokud bychom si chtěli postavit transparentní firewall, je physdev, který nám definuje, odkud pakety fyzicky přišly. Budeme-li mít 2 síťové karty eth0 a eth1 přemostěné v br0 a chtěli bychom filtrovat pakety, které procházejí přes náš most, použijeme tabulku filter a chain FORWARD, jelikož budeme pakety přesměrovávat.
Jako příklad dáme tuto situaci: Máme firmu s cca 500 PC se spuštěnými netbios pakety, viry či jiným provozem sítě. Já se připojím na jejich server přes VPN, které bude přemostěno do firemní sítě. Tedy bude to jako bych tam seděl, ale problém začne, když se podívám na zatížení linky. Všechny nepotřebné věci, co lítají ve firmě jdou i ke mně domů a mám například 60 KB/s zatížený internet. A to jsem ještě nic nezačal stahovat. Musím tedy použít transparentní firewall, který mi ty nepotřebné věci bude zahazovat, ještě než je pošle do internetu. Dejme tomu, že chci povolit jenom http, jenže následující volba nepůjde použít, protože síťovky jsou v mostu.
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport ! 80 -j DROP
Proto použijeme physdev s volbami --physdev-out
pro odchozí a --physdev-in
pro vstupní síťovku.
iptables -A FORWARD -m physdev --physdev-in eth0 --physdev-out eth1 -p tcp --dport ! 80 -j DROP
Tak, a úkol je vyřešen. Physdev je vůbec stvořený pro práci s přemostěnými síťovými zařízeními, a tak má ještě třeba volby --physdev-is-in
, --physdev-is-out
, které určují, přes který most paket přišel či odešel a jiné, které byste našli v manuálu.
Dnešní díl skončíme s rozšířeními ještě nakousnutými, jelikož je to kapitola poměrně rozsáhlá a podle mě zabere minimálně ještě příští díl.