Prvním z rozšíření, na které se dnes podíváme, slouží logování. LOG nám umožní do výchozího kernel logu ukládat informace o hlavičkách paketů, které vyhoví předem stanovenému pravidlu. Samotný LOG ovšem žádnou akci s paketem neprovede, pouze o něm zapíše informaci. Takže pokud bychom chtěli logovat zahozené pakety, použili bychom na to 2 pravidla.
Nejdůležitější parametry:
--log-level
: určuje, jak „ukecaný“ má být výpis (syntaxe „syslog“)
--log-prefix
: Vlastní poznámka, která se bude zapisovat s informacemi o paketu
--log-tcp-sequence
: Ukládá se i sekvenční číslo TCP spojení. Avšak pozor, je-li log přístupný uživatelům, představuje to bezpečnostní riziko.
--log-tcp-options
: Zapíše se nastavení z hlavičky TCP paketu
--log-ip-options
: Uloží se nastavení z hlavičky IP paketu
Při logování můžeme také využívat rozšíření limit, kterým snadno omezíme frekvenci zapisování logu. Je totiž docela možné, že pokud bychom měli na „blacklistu” nějakého uživatele, kterému bychom zahazovali všechny pakety a logovali je, že by si třeba spustil skenování portů a chudák logger by pomalu nestíhal zapisovat. Navíc za chvilku by ten soubor měl bůhví kolik MB, až by se v něm pomalu nedalo ani číst.
Takže si uvedeme malinký příklad této situace, kdy budeme zahazovat všechna spojení od 192.168.0.2 a logovat je s tím, že se zapíší maximálně 5×3 pakety za hodinu. Pro větší přehlednost si vytvoříme vlastní CHAIN, ve kterém proběhne samotné zapsání a zahození (z programátorského hlediska by se dalo říct, že si uděláme funkci), který budeme volat při kontrole paketu.
#Vlastní řetězec
iptables -N zapis
iptables -A zapis -m limit --limit 5/h --limit-burst 3 -j LOG --log-prefix "BlackList: "
iptables -A zapis -j DROP
#Kontrola
iptables -A INPUT -i eth0 -s 192.168.0.2 -j zapis
Nyní se konečně podíváme na tabulku nat, pomocí které budeme manipulovat s pakety. Na světě totiž pomalu, ale jistě začíná ubývat veřejných IPv4 IP adres (dále zde budu používat zkratku VIP), a tak se tento problém snaží zatím řešit všelijak, než se konečně přejde na ipv6 řešení. Proto například ve velké firmě, kde je mnoho „úředníků”, sekretářek atd., kteří ke své práci potřebují internet, ale zcela jistě se obejdou bez VIP, se pomocí natování dá skrýt celá firemní síť pod 1 IP routeru nebo prostě můžeme „sdílet internet“. Jako první si uvedeme SNAT neboli Source NAT, který umožňuje pozměnit zdrojovou IP adresu za jinou, pod kterou opustí fw. Toto pravidlo je asi jedním z nejpoužívanějších. Příklad využití – viz ta firma s pracovníky, kteří nepotřebují VIP.
SNAT funguje pouze v tabulce nat a v chain POSTROUTING. Jako parametr se mu dává --to-source
nebo i zkráceně –to
a IP adresa, pod kterou se bude maskovat. V případě, že náš server dostává IP z DHCP, docela těžko uhádneme, jakou IP „vyfasujeme”, a proto to jistí maškaráda (MASQUERADE), která je v podstatě to samé jako SNAT, ale maskuje adresy na výchozí v rámci nějakého zařízení na serveru.
Uvedu 2 příklady: v Prvním případě má server napevno IP 192.168.0.1 do internetu na eth0 a má sdílet internet uživatelům.
#Pokud paket chce opustit eth0, zamaskuje se za 192.168.0.1
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.1
Ve druhém případě mi půjde také o sdílení internetu, jenom na serveru ji nemám napevno, ale teprve ji obdržím z DHCP.
#Pokud paket chce opustit eth0, zamaskuje se za výchozí na eth0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Osobně doporučuji používat SNAT, pokud to situace dovolí, můžete potom předejít zbytečným komplikacím. Jestli jsme někde na začátku fw nastavili výchozí politiku FORWARD na DROP, tak by nám SNAT či maškaráda ještě nefungovala. Hodně zjednodušeně řečeno, FORWARD nám ještě říká, kterým směrem se pakety můžou natovat. Ano, kdybyste to nechali všechno povolené, „odpadnou” vám s tím starosti, ale už nemůžete (v případě, že budete mít ještě jiná síťová zařízení) definovat, ze kterých z nich je povolen přístup na internet. Prostě jej budou mít všichni, co si na něj dají bránu. Lze přímo psát do SNATu volbu -s a kontrolovat zdrojovou adresu, která chce odejít, ale je to „prasácké” řešení, ostatně je to skoro to samé jako s HTML a CSS … Naše CSS je onen FORWARD ;).
Takže opět nějaká ukázka, jak příchozí paket z eth1 a zdrojovou IP 192.168.0.22 pustit na net:
#Pokud paket chce opustit eth0, zamaskuje se za 192.168.0.1
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.1
#Zapneme forward
echo "1" > /proc/sys/net/ipv4/ip_forward
#Pokud paket přichází z eth1 s IP 192.168.0.22 chce opustit eth0, povol
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.0.22 -j ACCEPT
Samozřejmě, že na FORWARD můžeme aplikovat mnohem složitější pravidla jako například stavový firewall, kdy budeme forwardovat jenom navázaná spojení, nebo klidně můžeme použít rozšíření ipp2p, kdy nepovolíme p2p programům vstup do netu atd … Záleží na vaší fantazii …
Opakem SNATU je DNAT, ten pro změnu umožní forwardovat porty či celou IP směrem do privátní sítě. Podobně jako source nat, i destination nat používá volby --to-destination
(nebo zkráceně) –to
a též funguje pouze v tabulce nat, ale pro změnu v chain PREROUTING. V podstatě je to úplně to samé. Řekněme, že server má přiděleny 2 IP adresy a jednu z nich chce forwardnout dovnitř site:
#2 ruzne IP
ifconfig eth0 192.168.66.1 up
ifconfig eth0:0 192.168.66.2 up
#Tu druhou forwardneme na mašinu uvnitř sítě s IP 192.168.0.2
#Nejprve příchozí spojení
iptables -t nat -A PREROUTING -d 192.168.66.2 -j DNAT --to 192.168.0.2
#A nezapomenout i na odchozí
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.2 -j SNAT --to 192.168.66.2
Další rozšíření REDIRECT slouží k přesměrování nějakého lokálního portu na jiný. Například máme-li transparentní proxy server squid běžící standardně na portu 3128, veškeré příchozí požadavky uživatelů na port 80(www) přesměrujeme na proxy, která jim teprve poslouží k prohlížení stránek.
iptables -t nat -A PREROUTING -i eth1 --dport 80 -j REDIRECT --to 3128
REJECT zase vrátí slušnou odpověď v podobě icmp o nedostupnosti. Volba --reject-with
může obsahovat icmp-host-unreachable, icmp-port-unreachable či jiné, které najdete v MANu. Jako defaultní se používá ta o nedostupnosti portu. Třeba příklad, jak informovat o nedostupnosti služby auth (443):
iptables -A INPUT -p tcp --dport 443 -j REJECT
Osobně moc příkladů, jak ještě využít reject kromě této služby, která při zahazování paketů bez odpovědí dělá neplechu, nevymyslím.
Poslední tabulka, o které bude řeč, je mangle, která umožňuje modifikovat pakety.
MARK slouží pro nastavení Netfilter značkových hodnot, které jsou přidružené se specifickými pakety. Toto rozšíření lze použít pouze v mangle tabulce. MARK hodnoty mohou být používány spolu s pokročilými routovacími schopnostmi v Linuxu (jako třeba shapování, měření trafficu na úrovní ip atd.)
TOS – Type Of Service je osmibitová hodnota, která udává, jakým stylem mají být pakety doručeny. Jestli třeba mají být doručeny přednostně (s minimální odezvou), s maximální propustností či pro označování neprioritního provozu. S volbou --set-tos
můžeme předat tyto parametry: Minimize-Delay, Maximize-Throughput, Maximize-Reliability, Minimize-Cost a Normal-Service, což je také výchozí volba.
Rošíření TTL (TimeToLive) je užitečná věcička pro měnění TTL v IP hlavičce na stejnou hodnotu na všech odcházejících paketech. Důvod, proč byste to dělali, je například ten, že máte divného ISP, který vám nedovolí mít víc než jeden stroj připojený k internetu a aktivně to sleduje. Nastavení všech TTL hodnot na stejnou hodnotu pak způsobí, že je pro něj složitější „všimnout si“, že používáte víc PC. Můžeme pak resetovat TTL hodnotu pro všechny odcházející balíčky k normalizované hodnotě, jako 64, jak je specifikováno v Linuxovém jádru. Jako parametry uvádíme --ttl-set
, --inc
pro inkrementaci a --dec
pro dekrementaci.
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
Určitě byste ještě našli různé zajímavosti v manuálu jako například rozšíření pro mangle ROUTE, pomocí kterého můžete měnit paketům výchozí bránu a tak dále. Doufám, že se vám tento mini seriál líbil a přinesl vám aspoň pár nových rad, přeji vám mnoho úspěšných chvil se stavbami firewallu.