Hlavní navigace

Jak na filtrování paketů pro dialup

25. 7. 2000
Doba čtení: 8 minut

Sdílet

Žijeme v době, kdy bez ochrany nelze bezpečně dělat skoro nic - ani připojit svůj počítač k Internetu (natož provozovat jiné, pro většinu populace ještě příjemnější činnosti - ale to už je téma pro jiná média :). V dnešním článku se podíváme na to, jak poněkud vylepšit ochranu počítače připojovaného vytáčenou linkou.

Začneme trochu oklikou a než se pustíme do vlastního filtrování paketů, vysvětlíme si, k čemu slouží firewall. Zjednodušeně řečeno, firewall se používá ke kontrole a filtrování provozu mezi lokální sítí a Internetem. Typicky je firewall připojený mezi lokální síť a Internet a veškerý provoz z a do Internetu je kontrolován (a případně omezován) firewallem. A jednou z možností realizace firewallu je právě paketový filtr.

Asi si teď řeknete k čemu je mi to dobré, když mám doma jenom jeden počítač a žádnou síť. Klidně čtěte dál, protože se budeme zabývat právě tím, jak si postavit malý jednoduchý domácí firewall pro domácí použití. A nebudete k tomu potřebovat ani žádný počítač navíc, protože paketový filtr je přímo součástí linuxového kernelu.

Teď si v krátkosti řekneme, jak vlastně probíhá komunikace po síti. Všechny informace mezi počítači jsou předávány pomocí paketů. Součástí každého paketu je hlavička, ve které jsou uloženy různé provozní informace jako IP adresy zdrojového a cílového počítače, typ protokolu, v případě TCP a UDP protokolu čísla zdrojového a cílového portu atd. Zbytek paketu jsou vlastní přenášená data.

Paketový filtr funguje tak, že zkoumá obsah hlavičky každého paketu a podle předem daných pravidel se rozhodne, zda jej propustí dále, zahodí, případně provede nějakou jinou akci.

Nejčastější použití paketového filtru je k omezení přístupu ke službám poskytovaným serverem jen pro „důvěryhodné“ počítače podle IP adresy. Vezměme si například XServer, který běží doma prakticky každému. Ten naslouchá obvykle na portu 6000, kde poskytuje své služby ostatním počítačům. Bohužel ve většině XServerů (hlavně verze 3.3.5, 3.3.6 a 4.0) je chyba, kterou může kdokoliv zneužít k vyřazení vašeho XServeru z provozu tím, že vytvoří sekvenci soketových spojení na port 6000 (více viz http://www.kec­zy.cz/cti.phtml?id=62­).

Jednou z možností jak se tomu bránit je filtrovat pakety přicházející na port 6000 z Internetu. K tomu je potřeba mít v kernelu zakompilovanou podporu pro filtrování paketů (CONFIG_FIREWALL=y a CONFIG_IP_FIRE­WALL=y), což předkompilované kernely snad ve všech distribucích standardně obsahují a nainstalovat balíček ipchains.

Balíček ipchains se používá k nastavení a kontrole filtrovacích pravidel. Tyto pravidla se dělí do tří hlavních skupin na vstupní (input), výstupní (output) a přesměrovávací (forward). Je možné vytvořit si libovolný počet dalších skupin filtrovacích pravidel, které se používají hlavně pro přehlednost ve větších sítích a pro naše účely je nebudeme potřebovat.

Ještě něž se pustíme do vlastní konstrukce pravidel, podíváme se, co se děje s každým paketem, který prochází linuxovým kernelem. Každý příchozí paket (například z modemu přes interface ppp0 nebo i z lokálního interface lo) je nejprve kontrolován podle vstupních pravidel. Pokud paket přežije tento krok, kernel se podívá na cílovou adresu paketu a když je ho třeba poslat na jiný počítač a paket nebyl vytvořen lokálním procesem, aplikují se na něj pravidla pro přesměrování. A konečně když má být paket vyslán do sítě, je kontrolován podle výstupních pravidel.

A teď se vraťme k našemu XServeru, který běží na samostatném počítači připojeném do Internetu a chceme jej chránit před útoky zvenčí. To lze zajistit například takto:

ipchains -A input -p TCP -s ! 127.0.0.1 -d 0.0.0.0/0 6000 -j DENY

Podíváme se podrobněji na to, co vlastně znamenají jednotlivé přepínače.

-A
Přidá pravidlo do určené skupiny, v našem případě input, tj. vstupní pravidla

-p
Specifikuje protokol paketu, v našem případě TCP

-s
Přepínačem -s se určuje zdrojová adresa paketu. Může být zadána IP adresa nebo jméno počítače. Lomítkem můžeme za IP adresou zadat tzv. masku, která udává, které bity IP adresy jsou významné. Například zápis -s 127.0.0.0/24 říká, že významných je pouze prvních 24 bitů IP adresy a vyhoví mu tedy IP adresy 127.0.0.. Tomu je zcela ekvivalentní zápis 127.0.0.0/255­.255.255.0, kterým lze specifikovat jednotlivé bity. Vykřičník před IP adresou znamená negaci, tj. že paket nesmí pocházet z určité IP adresy, aby vyhověl pravidlu. V případě TCP a UDP protokolu lze zadat také číslo portu, ze kterého musí paket pocházet. Zápis -s 127.0.0.1 80 znamená, že paket musí pocházet z adresy 127.0.0.1 a portu 80. Je možné specifikovat také porty v určitém rozsahu, např. zápisu -s 127.0.0.0/8 1:1023 vyhoví všechny pakety pocházející z adresy 127... a z portu v rozmezí 1 až 1023. Místo čísla portu lze psát i jméno služby. I u portů je možné použít vykřičník jako negaci. V případě ICMP paketů lze zadat místo portu typ ICMP paketu (viz ipchains -h icmp).

-d
Specifikuje cílovou adresa paketu. Syntaxe je stejná jako u zdrojové adresy. Našemu případu -d 0.0.0.0/0 6000 vyhoví pakety s libovolnou cílovou IP adresou směřující na port 6000.

-j
Určuje, co se má s paketem stát, pokud vyhoví celému pravidlu. Nejpoužívanější volby jsou:

DENY – kernel paket jednoduše zahodí, jako by nikdy nebyl
REJECT – kernel paket zahodí a na zdrojovou adresu odkud paket přišel pošle ICMP zprávu o tom, že se tak stalo
ACCEPT – paket je propuštěn dále

Takže v našem případě říkáme kernelu, aby zahodil všechny TCP pakety, které nepochází z adresy 127.0.0.1 (lokální interface, tj. náš počítač) a které směřují na port 6000 (XServer).

XServer ale není jediná služba, ke které lze omezit přístup z ostatních počítačů. Pokud vám běží na počítači nějaký Mail Transport Agent (např. sendmail) a poštu vybíráte POP3 protokolem, není důvod povolit pakety přicházející na port 25 z Internetu. Další služby které si přímo říkají o omezení přístupu a mohly by na dialupu běžet jsou tiskový démon na portu 515 a nameserver (fungující jako DNS cache) na portu 53. U nameserveru je třeba počítat s tím, že se ke komunikaci používají dva protokoly TCP a UDP podle toho, který je zrovna výhodnější.

Samozřejmě není účelné zakazovat přístup ke všem službám, které vám na počítači běží. Pokud třeba používáte ident démona poslouchajícího na portu 113, není účelné filtrovat pakety přicházející na tento port, protože by to mohlo způsobit prodlevy při některých činnostech, jako odesílání emailů nebo při přihlašování na FTP servery.

IPCHAINS lze však také použít k nastavení priority odchozích paketů. V hlavičce každého paketu jsou čtyři TOS (Type Of Service) bity, které určují, jak má kernel paket zařadit do fronty. Význam jednotlivých bitů je Minimum Delay, Maximum Throughput, Maximum Reliability a Minimum Cost. Nastaven může být vždy jen jeden z těchto bitů. K manipulaci s TOS bity slouží přepínač -t, který má dva argumenty. Prvním je AND maska a druhým XOR maska. TOS bity paketu jsou modifikovány tak, že se nejdříve provede logický součin s AND maskou a poté logická nonekvivalence s XOR maskou. Nejnižší bit musí podle RFC 1349 zůstat nezměněn. Všechny možnosti jak použít přepínač -t uvádí přehledně následující tabulka

-t 0x01 0x10    Minimum Delay
-t 0x01 0x08    Maximum Throughput
-t 0x01 0x04    Maximum Realiability
-t 0x01 0x02    Minimum Cost

Pro odchozí pakety zajišťující „interaktivní“ služby jako FTP, telnet nebo SSH je vhodné nastavit minimální prodlevu, která zajistí dobrou odezvu těchto služeb i při velkém odchozím zatížení linky.

Podívejme se teď, jak by mohla vypadat vzorová konfigurace počítače na kterém běží SMTP, nameserver, tiskový démon a XServer. Nastavení pravidel provede následující sekvence příkazů.

ipchains -X
ipchains -F
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward DENY
ipchains -A input -p TCP -s ! 127.0.0.1 -d 0.0.0.0/0 25 -j DENY
ipchains -A input -p UDP -s ! 127.0.0.1 -d 0.0.0.0/0 53 -j DENY
ipchains -A input -p TCP -s ! 127.0.0.1 -d 0.0.0.0/0 53 -j DENY
ipchains -A input -p TCP -s ! 127.0.0.1 -d 0.0.0.0/0 515 -j DENY
ipchains -A input -p TCP -s ! 127.0.0.1 -d 0.0.0.0/0 6000 -j DENY
ipchains -A output -p TCP -d 0.0.0.0/0 21:23 -t 0x01 0x10

První dva řádky s přepínači -X a -F zruší případné uživatelem definované skupiny pravidel a odstraní pravidla ze zbylých skupin input, output a forward. Další tři řádky s parametrem -P nastavují, co se má stát s paketem, pokud nevyhověl žádnému pravidlu v jednotlivých skupinách input, output a forward. Pak následují vlastní pravidla, která zakazují přístup k jednotlivým službám z jiné IP adresy než 127.0.0.1. A na­konec je zařazeno pravidlo, které zajistí minimální prodlevu pro odchozí pakety zajišťující služby FTP, telnet a SSH.

Tyto příkazy můžeme zařadit do nějakého init skriptu, nebo použít ipchains-save a ipchains-restore, pro uložení a načtení souboru s pravidly.

Pokud potřebujeme filtrování paketů zcela vypnout, provede se to příkazy

ipchains -X
ipchains -F
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT

Co je ještě dobré vědět a jinam se to nevešlo

Paket může být po síti poslán v několika částech. Problém takových paketů je, že zdrojový a cílový port obsahuje pouze první část paketu a ostatní fragmenty podle nich nelze filtrovat. Proto je vhodné nastavit kernel tak, aby prováděl automatickou defragmentaci paketů. To lze provést příkazem

echo 1 >/proc/sys/net/ipv4/ip_always_defrag

Je vhodné bránit se proti IP spoofingu, což je technika, kdy útočník pošle paket, který má falešnou zdrojovou adresu a mohl by tak projít přes filtrovací pravidla. Ochranu proti IP spoofingu lze provádět už na úrovni kernelu, což lze zajistit příkazem

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 1 > $f
done

a kernel bude provádět u každého paketu kontrolu, zda je možné, aby přišel z daného síťového interface. Pokud jsou však používány ve filtrovacích pravidlech pouze adresy 127..., není nutné tuto ochranu zapínat, protože kernely od řady 2.1 automaticky zahazují pakety, které mají zdrojovou adresu 127... a které nepochází z interface lo.
  

A na závěr několik rad

Když přestane po zařazení filtrovacích pravidel něco fungovat, použijte přepínač -l pro logování paketů. Všechny pakety které vyhověly určitému pravidlu jsou potom kernelem logovány (např. do /var/log/messages) a lze dohledat, proč určitá služba nefunguje.

Pokud „zamrzne“ výpis aktivních pravidel (ipchains -L), máte špatně nakonfigurovaný nameserver. Ipchains se snaží při výpisu převést IP adresy na jména strojů a to se z nějakého důvodu nedaří. Zkuste ipchains -L -n

CS24_early

Nefiltrujte ICMP pakety, pokud opravdu nevíte, co děláte. ICMP pakety se používají mimo jiné k předávání informací o selhání jiných protokolů a tyto není vhodné blokovat. Navíc se filtrováním ICMP paketů můžete snadno dostat do rozporu s RFC.

A úplně na závěr jedna poznámka. Všechno co zde bylo napsáno se týká kernelů řady 2.2. V kernelech 2.0 se k nastavení paketového filtru používá starší ipfwadm a v kernelech 2.4 budou místo ipchains nové iptables.

Byl pro vás článek přínosný?

Autor článku

Jaroslav Gratz vystudoval VUT v Brně a v současné době pracuje ve společnosti Seznam.cz jako programátor senior, kde se věnuje fulltextovému hledání. Používá především programovací jazyky C++, Rust a Python.