Paketový filtr v jádře Linuxu se jmenuje Netfilter, je standartní součástí jádra řady 2.4(první oficiální stavový firewall v Linuxu), v jádrech 2.2 se používaly starší ipchains, s jádry řady 2.0 se používala utilita ipwfadmin.
Stavový firewall je mnohem silnějším nástrojem než nestavový. Má v sobě jsitou inteligenci, která dovoluje posuzovat pakety v souvislostech. Například povolit průchod jen paketům, které patří do již otevřeného TCP spojení. Podroběnjší popis se můžete dozvědět v článku [2].
Překlad jádra
Potřebujeme mít zapnuto minimálně:
- CONFIG_PACKET
- CONFIG_NETFILTER
- CONFIG_IP_NF_IPTABLES
- CONFIG_IP_NF_FILTER
Pro plné využití všech možností iptables je vhodné zapnout i další volby v sekci
Networking Options - > IP: Netfilter Configuration. Originální jádra z distribucí většinou mají tuto podporu zapnutou.
Princip práce
Základem Netfiltru jsou takzvané chains (řetězce,čejny). Standartní chains jsou INPUT,OUTPUT a FORWARD, které rozhodují o příchozích,přeposílaných a odchozích paketech. Ostatní chainy si může definovat správce systému sám.
Chain je posloupností pravidel, každý chain navíc vždy obsahuje policy, což je pravidlo které se aplikuje na paket, pokud projde všemi předchozími pravidly v chainu. Chain může být i prázdý až na policy. Každé pravidlo provádí s paketem nějakou akci, například ACCEPT,DROP,REJECT, kde už je o jejich osudu rozhodnuto a další pravidla se již neaplikují, nebo je akce například LOG a paket dále pokračuje chainem. Paket také může být pravidlem předán do jiného chainu(správcem vytvořeného), pokud tento nerozhodne o jeho osudu je vrácen do rodičovkého chainu.
Paket propadnuvší všemi pravidly je posuzován prvidlem policy. Policy je standartně nastaveno na ACCEPT, správně vytvořený chain počítá se všemi možnostmi žádoucích dat a policy se nastaví na DROP.
Pro vysvětlení cesty paketu viz schéma :
síť --> input routing-->forward-->postrouting-->síť
| ^
| |
| output routing
v |
input-->local process-->output
POZOR!
Zde můžeme narazit na základní rozdíl mezi ipchains a iptables. V iptables se pakety určené pro náš stroj předávají chainu INPUT, pakety určené k přeposílání přímo chainu FORWARD a neprochází přes INPUT ani OUTPUT. Pakety vzniklé na našem stroji se pak předávají přímo chainu OUTPUT.
Konfigurace iptables
Základním příkazem je iptables. Dobře popsán v manuálové stránce.
Obecný formát příkazu vypadá takto:
iptables -[ADC] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -N chain
iptables -X [chain]
iptables -P chain target [options]
iptables -E old-chain-name new-chain-name
Základní manipulace s chainy:
- vytvořit nový chain -N
- smazat przdný chain -X
- změnit policy pro vestavný chain -P
- zobrazit pravidla v chainu -L
- vymazat pravidla z chainu -F
- vynulovat počítadla paketů a bajtů ve všech pravidlech v chainu -Z
Dále můžeme manipulovat s pravidly v chainu:
- přidat na konec chainu nové pravidlo -A
- vložit na zadané místo do chainu nové pravidlo -I
- nahradit pravidlo na dané pozici v chainu -R
- odstranit pravidlo z chainu (zadáno pozicí pravidla - pořadového čísla, nebo jeho vypsáním) -D
Základní parametry pravidel(určují pdomínky pro paket):
- protokol např. TCP,UDP,ICMP, standartně ALL -p
- zdrojová adresa, doménové jméno, maska podsítě -s
- cílová adresa,doménové jméno,maska podsítě -d
- specifikace vstupního/výstupního interfacu, chain INPUT nemá výstupní interface, chain OUTPUT nemá vstupní interface, FORWARD má oba -i
Některé parametry mohou použít i znak !, což znamená negaci pravidla, což je dobře využitelné s pravidly -d a -s.
A konečně rozhodneme o osudu paketu parametrem -j jump_target
- ACCEPT
- přijetí paketu
- DROP
- zahození paketu, bez upozornění
- REJECT
- zahození paketu,s upozorněním uživatele zprávou ICMP port unreacheable
- LOG
- zapsání záhlaví do logu a propuštění paketu
Další podrobnosti lze nalézt ve zmíněné manuálové stránce a v packet-filtering-HOWTO a netfilter-hacking-HOWTO na adrese [1].
Příklady:
# iptables -A INPUT -s 127.0.0.1 -p ICMP -j DROP
Znamená, že všechny pakety příchazející z adresy 127.0.0.1 protokolu ICMP budou zahozeny. Tedy například nebude fungovat příkaz:
# ping 127.0.0.1
Pravidlo odstraníme použitím:
# iptables -D INPUT 1
NAT v Linuxu
Ve verzi 2.4 byl zahrnut do Netfiltru místo předchozí IP Masquerading. Ale umí toho mnohem více. Lze jej rozdělit do dvou částí SNAT (source network address translation), nahrazuje Masquerading, mění zdrojovou adresu prvního paketu a DNAT (destination network address translation), mění cílovou adresu prvního paketu.
Ke konfiguraci překladu adres použijeme iptables s přepínačem -t. Dále s přepínačem -j SNAT pro překlad zdrojových adres a -j DNAT pro překlad cílových adres. Ostatní práce je stejná jako je uvedeno výše. SNAT se nastavuje v řetězu POSTROUTING, DNAT v PREROUTING. Tedy výhoda je, že vždy pracujeme se skutečnou adresou. Řeší tedy i onu situaci s mapováním cílových portů.
v jádře zapneme podproru pro Full-NAT:
Tedy například:
SNAT:
Změna zdrojové adresy na 1.2.3.4
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
Změna zdrojové adresy na 1.2.3.4, 1.2.3.5 nebo 1.2.3.6
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
Změna zdrojové adresy na 1.2.3.4, porty 1-1023
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023
Masquerading je speciálním případem SNAT a mělo by se používat jen pro dynamicky přidělované adresy, jinak se používá SNAT.
Prováděj masquerading na všem, co odchází z ppp0
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
DNAT:
Změna cílovélov adresy na 5.6.7.8
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8
Změna cílové adresy na 5.6.7.8, 5.6.7.9 nebo 5.6.7.10.
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10
Změna cílové adresy WWW na 5.6.7.8, port 8080.
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
-j DNAT --to 5.6.7.8:8080
Přesměrování je specílní případ DNAT.
Posílej příchozí pakety s portem 80 (WWW) na naši transparentní proxy (squid)
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
-j REDIRECT --to-port 3128
Více najdete v NAT-HOWTO dostupném na adrese [1].