Paketové filtry

Peter Krutý, xkruty@fi.muni.cz


Obsah


Typy Firewallov

V zásade rozoznávame 3 druhy firewallov, ktoré sa môžu objavovať v rôzných variantách a kombináciach:

Packet-filtering firewall

Tento typ je najpoužívajší. Môže to byť zariadenie (router) alebo počítač nakonfigurovaný na filtrovanie paketov. Paketový filter spracuváva pakety podľa informacií obsiahnutých vo svojej hlavičke (zdrojová-cielová adresa, protokol, zdrojový a cieľový port, typ paketu atď). Pracuje na sieťovej vrste OSI modelu. Zvyčajne na rozhodovanie sa požíva nejakú formu tabuľky, ktorý zhora-dolu prechádza a ak nájde zhodu uplatňuje akcie, ktoré v tabuľke nájde. Ak v tabuľke nenájde odpovedajúci záznam, tak sa použije implicitná politika pre tabuľku.

Tabuliek môže (a zvyčajne aj je) viacero, každá sa aplikuje na pakety, ktoré chodia z určitého smeru. Napríklad na zariadenie zo siete, von zo zariadenia, z lokálnej aplikácie atď.

Riadky tabuľky obsahujú jednotlivé pravidlá, kde môžme definovať čo sa má diať s paketmi ktoré vyzerajú tak a tak. Napríklad zakázať všetky pakety z určitej IP adresy, ktoré sa snažia nadviazať spojenie na porte 80.

Hlavná výhoda paketových filtrov spočíva v relatívne malej režií pre filtrovanie a teda nespôsobuje takmer žiadne zdržanie sieťovej dopravy. Naopak nevýhodou je to, že vôbec nepracujú s obsahom packetu a teda nie je možné jemnejšie filtrovanie napríklad na základe uživateľov. Firewally všeobecne väčšinou nie sú schopné zabrániť "tunelovaniu" protokolov.

Application-level gateway

Aplikačné brány (resp. Proxy servery) pracujú na vyššej úrovni ako paketové filtre. Prevážne ovládajú iba jeden protokol, čo je ich hlavná nevýhoda. Pracujú na aplikačnej vrstve OSI modelu. Ďalšou nevýhodou je, že často vyžadujú spoluprácu na strane klienta narozdiel od paketových filtrov, ktoré pracujú transparantne. Toto sa dá vyriešiť prostredníctvom transparetnej proxy. Ich výhoda je, že môžu robiť filtrovanie jemnejšie na základe uživateľov, prípadne príkazov pre daný protokol, ktorý poznajú.

Stateful inspection firewall

Stavový firewall sa používa v kombincií s paketovým filtrom. Paketový filter sám o sebe robí rozhodovanie o osude každého paketu zvlášť. V kombinácií so stavovým firewallom je schopný zapamätať si informáciu o vzniknutom spojení a udržiavať si jeho stav a ďalej rozoznávať pakety, ktoré do neho patria a podla toho s nimi nakladať.

Linux Firewally

Existujú 3 verzie paketových filtrov pre Linux. Ich vývoj súvisí s verziami jadra. Úplne prvá verzia ipfw bola portom z BSD.

  1. jadrá 2.0.x : ipfwadm
  2. jadrá 2.2.x : ipchains
  3. jadrá 2.4.x : Netfilter (iptables)

Pre tích, ktorí sa nemôžu vzdať ipfwadm a ipchains existujú skripty, ktoré používajú syntax týchto nástrojov a fungujú nad ipchains alebo iptables (ipfwadm-wrapper a podobne). Paketový filter je na Linuxe zabudovaný do jadra, vďaka čomu je celý proces rýchlejší, keďže sa nemusí ísť do uživateľského priestoru. Pre zachovanie nastavenia firewallu je nutné dať príkazy pre nastavnie do štartovacích skriptov, poslúžiť môžu aj utiliky ipchains-save (iptables-save) a ipchains-restore (iptables-restore). Použitie:

    # ipchains-save > /etc/ipchains.rules

Pomocou nástrojov na firewalling vieme v Linuxe robiť aj NAT, Maškarádu alebo port-forwading.


IP Chains

IP Chains používajú user-space nástroj ipchains. V jadre sa nachádzajú tri reťazce (chains) pravidiel:

Pravidlá (rules) v príslušnom reťazci sa prechádzajú jedno po druhom a keď sa nájde vyhovujúce uplatní sa na paket akcia v danom pravidle. Ak žiadne pravidlo nevyhovuje použije sa implicitná politika pravidla. Obrázok:

                         +---->( Local Process )->---+
                         ^                           |
      +-------------+    |     +---------------+     v    +--------------+
----->| INPUT Chain |-+--+---->| FORWARD Chain |-----+-+->| OUTPUT Chain |--->
      +-------------+ |        +------+--------+       |  +--------------+
            |         |               |                ^         |
        Deny/Reject   |           Deny/Reject          |    Deny/Reject
                      |                                |
                      +------->( Demasquerading )->----+
Syntax príkazu ipchains sa prechodom na iptables čiastočne, ale nie radikálne zmenila. Podrobnosti v manuálovej stránke ku ipchains a iptables. Príklad skriptu s nastavením firewallu pomocou ipchains je
tu. Oproti ipfwadm vie pracovať s IP fragmentami alebo aj NAT 1:N (maškaráda). Je bezstavový.


Netfilter

Nás zaujíma hlavne Netfilter, ktorý je modulárnejší ako IP Chains. Je už stavový. User-space nástroj na konfigurovanie sa volá iptables. Pribudli v ňom ďalšie dva body na kotrolu toku paketov PREROUTING a POSTROUTING. Obrázok:
               Deny/Reject                          Deny/Reject
                    |                                    |
                +---+---+                           +----+---+
                | INPUT |->---( Local Process )--->-| OUTPUT |
                +---+---+                           +----+---+
                    |                                    |
                    ^                                (routing)
                    |                                    |
   +------------+   |         +---------+         +------+------+
-->| PREROUTING |-(routing)-->| FORWARD |->------>| POSTROUTING |-->-
   +-----+------+             +----+----+         +------+------+
         |                         |                     |
     Deny/Reject               Deny/Reject          Deny/Reject

Základná syntax príkazu iptables je:

    # iptables [table] <command> <match> <target/jump>
kde, jednotlivé položky znamenajú:

table : tabuľka s ktorou manipulujeme
command : čo chceme s tabuľkou/pravidlom robiť
match : popis paketu, pre ktorý pravidlo vyhovuje
target/jump : čo sa má urobiť s paketom

Table

Tabuľka sa špecifikuje prepínačom -t. Implicitne sa používa tabuľka filter. Typy tabuliek sú:

nat Používa sa pre NAT (Network Address transalation). Nemala by sa používať na filtrovanie.
Obsahuje reťazce PREROUTING pre pakety príchodzie na zariadenie, OUTPUT pre pakety z lokálnych aplikácií a POSTROUTING pre pakety odchádzajúce na zariadenie.
mangle Používa sa na zmeny v hlavičkách paketov (TTL, TOS a podobe), ale nie na NAT alebo maškarádovanie, na to slúži tabuľka nat
Obsahuje reťazce PREROUTING pre pakety, ktoré práve prišli zo zariadenia a ešte sa neviem kam ďalej pôjdu (routing decision) a OUTPUT pre pakety, ktoré sa generovali lokálne a opäť ešte smerovaním.
filter Používa sa na filtrovanie paketov všeobecne, teda na akcie typu DROP, LOG, ACCEPT, REJECT a iné.
Obsahuje reťazce FORWARD pre pakety, ktoré neboli generované lokálne a nie sú určené pre localhost. INPUT pre pakety určené pre lokálnu aplikáciu a OUTPUT pre lokálne vygenerované pakety.

Commands

Príkazy špecifikujú čo sa s daným pravidlom ide robiť (pridať, zmazať, zmeniť..). Niektoré pravidlá sú:

-A pridá nové pravidlo na koniec reťazca
-D zmaže definované pravidlo
-R zmení definované pravidlo
-L vypíše všetky pravidlá daného reťazca
-P definuje implicitnú politiku reťazca
-F zmaže všetky pravidlá v danom reťazci

Matches

Príklady prepináčov popisujúcich paket:

-p Protokol
-s Zdrojová IP adresa
-i Vstupný interface
--sport Zdrojový port
--tcp-flags Typ paketu
--icmp-type Typ ICMP paketu

Target

Príklady akcií/spracovania paketu:

DROP Paket sa zahodí
ACCEPT Paket sa akceptuje
SNAT Preklad zdrojovej adresy
MASQUERADE Maškaráda
REDIRECT Presmerovanie

Príklady použitia iptables:

    # iptables -A INPUT --dport 80 -j DROP
    # iptables -D INPUT 1
    # iptables -R INPUT 1 -s 192.168.0.1 -j DROP
    # iptables -I 1 --dport 80 -j ACCEPT
    # iptables -L OUTPUT
    # iptables -P INPUT REJECT
    # iptables -p tcp --tcp-flags SYN,ACK,FIN ...

Ukážka ako paket "cestuje" tabuľkami a reťazcami pravidiel:

Forwardovaný paket

  1. Paket prichádza z Internetu
  2. Prichádza na interface
  3. mangle PREROUTING
  4. nat PREROUTING
  5. Rozhodnutie smerovanie (localhost/forwading?)
  6. filter FORWARD
  7. nat POSTROUTING
  8. Paket odchádza na interface
  9. Späť do Internetu

Paket určený pre localhost

  1. Paket prichádza z Internetu
  2. Prichádza na interface
  3. mangle PREROUTING
  4. nat PREROUTING
  5. Rozhodnutie smerovanie (localhost/forwading?)
  6. filter INPUT
  7. Lokálny proces

Paket generovaný lokálne

  1. Lokálny proces
  2. mangle OUTPUT
  3. nat OUTPUT
  4. filter OUTPUT
  5. Rozhodnutie smerovanie (localhost/forwading?)
  6. nat POSTROUTING
  7. Odchádza na interface
  8. a do Internetu

Nakoniec doplním, že je možné si vytvárať vlastné reťazce pravidiel, pakety medzi reťazcami presmerovávať alebo robiť účtovanie.


*BSD (Irix, Solaris ...) Firewally

Okrem Linuxového Netfiltru sa na Unixoch najčastejšie používa IP Filter (IPF) od Darrena Reeda a IP Firewall (IPFW). (systémy {Free,Net,Open}BSD, Solaris, Irix, AIX atď). Tak ako som to pochopil používajú všetky spomenuté systémy IP Filter okrem FreeBSD, ktorý používa aj IPFW.

IP Filter

User-space nástroj sa volá ipf. Pri štarte počítača sa pravidlá čítajú zo súboru /etc/ipf.rules. Príklad obsahu súboru /etc/ipf.rules:
    pass out from any to any
    pass in from any to any
    block in on fxp0 from any to any port = 3306
Pravidlá sa prechádzajú jedno po druhom zhora dole, ale na rozdiel od reťazcov pravidiel napr. v IP Chains paket prechádza cez všetky pravidlá a uplatní sa posledné, ktoré vyhovuje!, teda v uvedenom príklade prejdú všetky okrem paketov smerovaných na port 3306 (MySQL), ale v tomto príklade:
    pass out from any to any
    block in on fxp0 from any to any port = 3306
    pass in from any to any
prejdú všetky pravidlá, pretože posledné vyhovujúce je posledné uvedené! Toto chovanie sa dá zmaniť tým, že na riadku pre pravidlo, ktoré má ako posledné paket spracovať uvedieme kľúčové slovo quick:
     block in quick on fxp0 from any to any port = 3306
IP Filter vie v podstate všetko to čo Ip Chains. Podrobný popis syntaxe príkazu ipf nájdete vo forme podobnej BNF v ipf(5) alebo ipf.conf(5). Výborný (český) návod viď
OpenBSD FAQ - IP Filter.

IP Firewall

User-space nástroj sa volá ipfw. IPFW vie robiť filtovanie a úctovanie. Jeho syntax pre manipulovanie s pravidlami je:
    # ipfw [-N] command [index] action [log] protocol addresses [options]
Parameter -N spôsobuje preklad adries a služieb použitých v pravidlách pri výpise. Voľba log spôsobí vypisovanie pravidiel, ktoré vyhovujú pre príchodzie pakety na konzolu (požíva sa pri ladení nastavenia firewallu).

Command

add Pridá položku do zoznamu pravidiel
delete Zmaže položku zo zoznamu pravidiel

Index

Ak je použité číslo na mieste indexu pravidlo sa vloží na daný index. Ináč sa vloží za posledné pravidlo na index o 100 väčší.

Action

reject Zahodí paket a späť pošle ICMP `host or port unreachable'
allow Paket pošle ďalej
deny Zahodí paket a nič neoznamuje
count Účtovanie - zapína počítanie paketov, ale pokračuje na ďalšom pravidle

Protocol

all
icmp
tcp
udp

Address

Syntax adresy je:
    from address/mask [port] to address/mask [port] [via interface]
Kde address/mask môže mať jeden z tvarov:

Options

Príklady volieb, ktoré sú obdoba matches z Netfiltru sú:
frag Súhlasí ak paket nie je prvý fragment z datagramu
in Súhlasí ak paket je na ceste dnu
out Súhlasí ak paket je na ceste von
setup Súhlasí pre pakety pokúšajúce sa vytvoriť spojenie (SYN flag)

Syntax pre výpisy pravidle:

    # ipfw [-a] [-t] [-N] l  
pre význam prepínačov viď man stránku. Syntax pre zmazanie všetkých pravidiel:
    # ipfw flush
Syntax pre zmazanie stavu účtovania pre dané "počítadlo":
    # ipfw zero [index]

Príklady použitia ipfw:

    # ipfw add deny tcp from evil.crackers.org to nice.people.org 23
    # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org   
    # ipfw add deny tcp from any to my.org/28 6000 setup 
    # ipfw -a list
    # ipfw -a l 
    # ipfw -at l


Príklad skriptu s nastavením firewallu pomocou ipchains:
    #!/bin/sh
    
    [ -f /etc/ipchains.rules ] || exit 0

    case "$1" in
        start)
            echo -n "Turning on packet filtering:"
            /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
            echo 1 > /proc/sys/net/ipv4/ip_forward
            echo "." ;;
        stop)
            echo -n "Turning off
            packet filtering:"
            echo 0 >
            /proc/sys/net/ipv4/ip_forward
            /sbin/ipchains -F
            /sbin/ipchains -X
            /sbin/ipchains -P input ACCEPT
            /sbin/ipchains -P output ACCEPT
            /sbin/ipchains -P forward ACCEPT
            echo "." ;;
        *)
            echo "Usage: /etc/init.d/packetfilter {start|stop}"
            exit 1 ;;
    esac
    exit
    0


Odkazy