Přeskočit navigaci webu (1) Přeskočit navigaci sekce (2)

IP Filter

Úvod
Zapnutí paket filtru
Manipulace s pravidly programem ipf / syntaxe
Proces pravidel
Filtrování dle IP adres zdroj/cíl
Filtrování dle zařízení
Filtrování dle zařízení a ip adres
Filtrování dle in/out
Filtrování dle protokolu [/etc/protocols] a portů
Filtrování dle vytvářených skupin
Použití Fastroute
Stavový paket filtr'
Použití Flags a Keep Frags
Odpovídání na blokováné pakety
Logování
Pokročilé logování
Překlad adres (NAT)
Monitorování a ladění
Proměnné jádra
Duplikování paketů
Odkazy

Úvod

IP Filter je malý, portabilní a výkonný softwarový balík, který lze používat k překladu ip adres nebo jako paket filtr.

IPF umožňuje filtrovat dle několika kritérií, například:

  • dle ip adres zdroj/cíl
  • dle portů zdroj/cíl
  • dle zařízení
  • dle protokolů
  • dle předvytvořených skupin pravidel

Manipulace s pravidly programem ipf / syntaxe

IP Filter má 2 sady pravidel, aktivní sada (active set) a neaktivní sada (inactive set). Defaultně jsou všechny operaci prováděny na aktivní sadě pravidel. Manipulovat s inaktivní sadou pravidel můžeme pomocí přepínače -I. Použitelné taktéž s přepínačem -s (přepni aktivní sadu pravidel na "jinou"). Mazání pravidel se provádí přepínačem -r.

Příkazem ipf -Fa -f /etc/ipf.rules nejdříve smažeme aktivní pravidla (flush) a načteme pravidla ze souboru /etc/ipf.rules.

Zadávání/mazání pravidel z stdin: ipf -f -, ipf -rf -

Syntaxe:

    filter-rule = [ insert ] action in-out [ options ] [ tos ] [ ttl ]
                  [ proto ] [ ip ] [ group ] .

    insert      = "@" decnumber .
    action      = block | "pass" | log | "count" | skip | auth | call .
    in-out      = "in" | "out" .
    options     = [ log ] [ "quick" ]
                  [ "on" interface-name [ dup ] [ froute ] ] .
    tos         = "tos" decnumber | "tos" hexnumber .
    ttl         = "ttl" decnumber .
    proto       = "proto" protocol .
    ip          = srcdst [ flags ] [ with withopt ] [ icmp ] [ keep ] .
    group       = [ "head" decnumber ] [ "group" decnumber ] .

    block       = "block" [ return-icmp[return-code] | "return-rst" ] .
    auth        = "auth" | "preauth" .
    log         = "log" [ "body" ] [ "first" ] [ "or-block" ]
                  [ "level" loglevel ] .
    call        = "call" [ "now" ] function-name .
    skip        = "skip" decnumber .
    dup         = "dup-to" interface-name[":"ipaddr] .
    froute      = "fastroute" | "to" interface-name .
    protocol    = "tcp/udp" | "udp" | "tcp" | "icmp" | decnumber .
    srcdst      = "all" | fromto .
    fromto      = "from" [ "!" ] object "to" [ "!" ] object .

    return-icmp = "return-icmp" | "return-icmp-as-dest" .
    object      = addr [ port-comp | port-range ] .
    addr        = "any" | nummask |
                  host-name [ "mask" ipaddr | "mask" hexnumber ] .
    port-comp   = "port" compare port-num .
    port-range  = "port" port-num range port-num .
    flags       = "flags" flag { flag } [ "/" flag { flag } ] .
    with        = "with" | "and" .
    icmp        = "icmp-type" icmp-type [ "code" decnumber ] .
    return-code = "("icmp-code")" .
    keep        = "keep" "state" | "keep" "frags" .
    loglevel    = facility"."priority | priority .

    nummask     = host-name [ "/" decnumber ] .
    host-name   = ipaddr | hostname | "any" .
    ipaddr      = host-num "." host-num "." host-num "." host-num .
    host-num    = digit [ digit [ digit ] ] .
    port-num    = service-name | decnumber .

    withopt     = [ "not" | "no" ] opttype [ withopt ] .
    opttype     = "ipopts" | "short" | "frag" | "opt" ipopts  .
    optname     = ipopts [ "," optname ] .
    ipopts      = optlist | "sec-class" [ secname ] .
    secname     = seclvl [ "," secname ] .
    seclvl      = "unclass" | "confid" | "reserv-1" | "reserv-2" |
                  "reserv-3" | "reserv-4" | "secret" | "topsecret" .
    icmp-type   = "unreach" | "echo" | "echorep" | "squench" | "redir" |
                  "timex" | "paramprob" | "timest" | "timestrep" | "inforeq" |
                  "inforep" | "maskreq" | "maskrep"  | decnumber .
    icmp-code   = decumber | "net-unr" | "host-unr" | "proto-unr" |
                  "port-unr" | "needfrag" | "srcfail" | "net-unk" |
                  "host-unk" | "isolate" | "net-prohib" | "host-prohib" |
                  "net-tos" | "host-tos" | "filter-prohib" | "host-preced" |
                  "cutoff-preced" .
    optlist     = "nop" | "rr" | "zsu" | "mtup" | "mtur" | "encode" | "ts" |
                  "tr" | "sec" | "lsrr" | "e-sec" | "cipso" | "satid" |
                  "ssrr" | "addext" | "visa" | "imitd" | "eip" | "finn" .
    facility    = "kern" | "user" | "mail" | "daemon" | "auth" | "syslog" |
                  "lpr" | "news" | "uucp" | "cron" | "ftp" | "authpriv" |
                  "audit" | "logalert" | "local0" | "local1" | "local2" |
                  "local3" | "local4" | "local5" | "local6" | "local7" .
    priority    = "emerg" | "alert" | "crit" | "err" | "warn" | "notice" |
                  "info" | "debug" .

    hexnumber   = "0" "x" hexstring .
    hexstring   = hexdigit [ hexstring ] .
    decnumber   = digit [ decnumber ] .

    compare     = "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" |
                  "ne" | "lt" | "gt" | "le" | "ge" .
    range       = "<>" | "><" .
    hexdigit    = digit | "a" | "b" | "c" | "d" | "e" | "f" .
    digit       = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" .
    flag        = "F" | "S" | "R" | "P" | "A" | "U" .

Manipulace s pravidly NAT programem ipfnat

-C smaže veškeré aktuální záznamy při výpisu NAT pravidel, -F smaže veškeré aktivní záznamy v aktuální tabulce překladů (active NAT mappings), -l list tabulky překladů, -s NAT statistiky, -r mazání NAT pravidel.

Zapnutí paket filtru

Podporu paket filtru lze zakompilovat do kernelu a nebo zavést do jádra jakožto modul ipl.ko.

  1. Kompilace kernelu s podporou ipfiltru v konfiguračním souboru kernelu musí být následující volby:

        options         IPFILTER                # Ipfilter
    

    Následující dvě volby jsou volitelné

        options         IPFILTER_LOG            # Ipfilter logování
        options         IPFILTER_DEFAULT_BLOCK  # Defaultně blokuj veškerý provoz
                                                # procházející daným strojem
    
  2. Zavedení modulu ipl.ko: kldload ipl.ko

Po kompilaci kernelu, či zavedení modulu ipl.ko můžeme začít pracovat s paket filtrem. Např. zadávat pravidla ipf -f - (stdin).

RC skripty

V /etc/rc.conf (skript spouštěný při startu OS) můžeme zapnout podporu ipfiltru, monitorovacího procesu apod. Veškeré volby nalezneme v /etc/defaults/rc.conf.

    ipfilter_enable="NO"            # YES = zapnutí ipfilteru
    ipfilter_program="/sbin/ipf"    # Program, který se spustí při volbě
                                    # ipfilter_enable="YES"
    ipfilter_rules="/etc/ipf.rules" # Soubor s pravidly
    ipfilter_flags=""               # Případné volby při spuštění programu
    ipnat_enable="NO"               # NAT
    ipnat_program="/sbin/ipnat -CF -f" # Program a jak specifikovat pravidla
    ipnat_rules="/etc/ipnat.rules"  # Soubor s pravidly
    ipnat_flags=""                  # Případné volby při spuštění programu
    ipmon_enable="NO"               # Monitoruje /dev/ipl
    ipmon_program="/sbin/ipmon"     #
    ipmon_flags="-Ds"               # Typicky "-Ds" [-s syslog logging] nebo
                                    # "-D /var/log/ipflog"

Proces pravidel

Pravidla jsou čtena od shora dolů. Většina paketových filtrů zastaví prohledvání pravidel, pokud nalezne vyhovující pravidlo; ipfilter neni jeden z nich. Ipf prohledá pravidla a poslední vyhovující pravidlo pro daný paket v pořadí, se uplatní. Pokud tedy zadáte

    block in all
    pass in all

paket bude povolen, neboť poslední vyhovující pravidlo pro daný paket je pass in all.

Oproti ipfw a jiným pf /paket filtr/ vám toto může připadat trochu zmatené. Ipfilter toto řeší pomocí volby quick. Např.:

    block in quick all
    pass in all

Ipf přečte první pravidlo, paket by měl blokován, zastaví prohledávání pravidel a paket je zamítnut, neboť v prvním pravidle byla použita volba quick.

Filtrování dle IP adres

Ipf umožnuje filtrování dle mnoha kritéií a jednim z nich je filtrování dle IP adres. Vhodné je blokovat pakety z neroutovatelných sítí v internetu (viz příklad), které by mohly být použity pro 'spoofing' (viz Address Allocation for Private Internets).

    block in quick from 192.168.0.0/16 to any
    block in quick from 172.16.0.0/12 to any
    block in quick from 10.0.0.0/8 to any
    pass  in       all

Filtrování dle zařízení

Další možností je například kontrola paketů dle procházejícího zařízení (interface). Využití je u paketových filtrů s více zařízeními, např. firemní firewall s přístupem do LAN a WAN, popř. internetu.

    block in quick on tun0 all
    pass  in               all

Filtrování dle zařízení a ip adres

Následuíjící pravidla blokují pakety se zdrojovými adresami z neroutovatelných sítí na interface označeném xl1.

    block in quick on xl1 from 192.168.0.0/16 to any
    block in quick on xl1 from 172.16.0.0/12 to any
    block in quick on xl1 from 10.0.0.0/8 to any
    block in quick on xl1 from 127.0.0.0/8 to any
    pass in all

Filtrování dle in/out

Filtrování dle in/out se vždy vztahuje k interface/zařízení. Na každém interface můžeme pakety filtrovat dvěma směry - dovnitř/ven - in/out. Pravidla v uvedeném příkladu blokují pakety se zdrojovými adresami z neroutovatelných sítí směrem k interface označeném xl1 (in).

    block in quick on xl1 from 192.168.0.0/16 to any
    block in quick on xl1 from 172.16.0.0/12 to any
    block in quick on xl1 from 10.0.0.0/8 to any
    block in quick on xl1 from 127.0.0.0/8 to any
    pass in all

Filtrování dle protokolu [/etc/protocols] a portů

Filtrování IMCP paketů

Následující pravidlo říká: Blokuj a loguj icmp pakety odkohokoli kamkoli směrem k interface xl1.

    block in log quick on xl1 proto icmp from any to any

Chcete-li povolit traceroute a ping odkudkoli k cílové ip adrese, či adresnímu prostoru a blokovat ostatni ICMP pakety:

    pass in quick on xl1 proto icmp from any to nase_ip_nebo_subnet icmp-type 0 keep state
    pass in quick on xl1 proto icmp from any to nase_ip_nebo_subnet icmp-type 11 keep state
    block in log on xl1 proto icmp from any to any

Filtrování UDP a TCP prokolu

Pravidlo blokuje a loguje příchozí pakety na rozhraní xl1 odkudkoli k cílové ip adrese, či adresnímu prostoru, kde protokol je tcp a port 22.

    block in log quick on xl1 proto tcp from any to nase_ip_subnet port = 22

Ipf taktéž umožňuje kombinaci voleb protokolu tcp a udp dohromady

    block in log quick on xl1 proto tcp/udp from any to nase_ip_subnet port = 111

Filtrování dle vytvářených skupin

Skupiny pravidel vám umožňují psát pravidla ve stromovém tvaru, namísto lineárního listu pravidel. Pokud nemá paket nic společného s pravidly určenými k filtrování paketů, řekňeme na interface xl1, nebudou pravidla prohledávána při provozu na interface např. xl2.

Jednoduchý příklad

    block out quick on xl1 all head 10
    pass out quick proto tcp from any to 20.20.20.64/26 port = 80 flags S keep state group 10
    block out on xl2 all

V tomto krátkém příkladu vidíme využitelnost skupin pravidel. Pokud paket není určen pro rozhraní xl1, nebude proti pravidlům patřící do skupiny 10 (group 10) kontrolován. Pokud paket prochází přes rozhraní xl1, syntaxe quick nám zkrátí budoucí proces na kořenové úrovni (root level, rule group 0) a zaměří se na kontrolu paketu proti pravidlu náležící skupině 10.

Použití Fastroute

Přeposíláme-li, bokujeme-li pakety, typicky se chováme jakou router, který by měl snižovat TTL u procházejících paketů, čímž dáváme na vědomí, že v cestě k cíli je jakýsi další HOP (skok) - router, paket filter forwardující pakety apod. Můžeme skrýt existenci daného stroje na síti, před aplikacemi jakou jsou unixový traceroute, který používá UDP pakety s různými hodnotami TTL k mapování skoků (HOPů) mezi dvěma stranami, pravidlem:

    block in quick on interface fastroute proto udp from any to any port 33434 >< 33465

Syntaxe fastroute signalizuje ipfilteru, aby nepředával pakety k routování Unix IP stack-u, což má za následek snižení TTL. Paket bude poslán na výstupní rozhraní ipfiltrem a k snížení TTL nedojde. Ipfiltr samozřejmě využije systémovou routovací tabulku k zjištění výstupního interface, ale funkci routování přebírá v tuto chvíli ipfiltr. Funkce ipfiltru - fastroute by měla být použita skutečně jenom tam, kde je potřeba, neboť jádra jednotlivých OS disponují dokonalejším/vyspělejším routovacím kódem než ipfiltr.

Stavový paket filtr

Stavový paket filtr - TCP

Většina paket filtrů disponuje volbou 'established', která slouží k povolení již probíhajícího tcp spojení. Kontrola zda se jedná o již probíhající spojení či ne, se provádí čtením 'flagu' v tcp paketu. Proto toto nefunguje u UDP a ICMP protokolu. Tato metoda není nejbezpečnější, neboť kdokoli může flag v tcp paketu zflašovat a tím náš paket filtr zmást.

Tato funkce je v ipf nazývána keep state a funguje jak pro pakety typu TCP, tak i pro UDP a ICMP. Doposud probíhala kontrola paketů takto: Nejprve přijde paket na vstup, následně jsou čtena pravidla vstupní, potom je paket předán na výstup a nakonec jsou čtena pravidla výstupní. Co se stane nyní: paket přijde na vstupní rozhraní, kontrola stavové tabulky (state table), 'možná' budou přečtena vstupní pravidla (záleží na konfiguraci), paket odchází, kontrola stavové tabulky, 'možná' budou přečtena výstupní pravidla (opět záleží na konfiguraci).

Protože má každé spojení začátek, prostředek a konec, postačí když budeme na spojení kontrolovat pouze jeho začátek. Zde je jednoduchý příklad, stroj povoluje pouze tcp pakety určené ssh serveru, nic jiného.

    block out quick on tun0 all
    pass  in  quick on tun0 proto tcp from any to 20.20.20.1/32 port = 22 keep state

Jakmile první SYN paket dorazí k ssh serveru, status je vytvořen a spojení povoleno.

Status (state) je velmi užitečný pouze při správné konfiguraci. Podívejme se na následující příklad.

    pass  in  quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23
    pass  out quick on tun0 proto tcp from any to any keep state
    block in  quick all
    block out quick all

Povolili jsme příchozí spojení na port 23 a odchozí spojení kamkoli. Příchozí telnet pakety jsou povoleny a při odchozím směru se vytvoří záznam o spojení do stavové tabulky a spojení je povoleno. Tudíž vše funguje správně. Ale pravda je taková, že po 60 sekundách nečinnosti bude záznam o stavu uzavřen. Toto je způsobeno tím, že nebyla dostupná informace o původním SYN paketu určém portu 23. Informace byla pouze o ACK paketu. Ipf je výborné pro kontrolu TCP spojení od začátku do konce, ale ne pro kontrolu paketů od prostředku. Správná definice původních pravidel:

    pass  in  quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 keep state
    pass  out quick on tun0 proto tcp from any to any keep state
    block in  quick all
    block out quick all

Tento sled pravidel způsobí zapsání prvního (SYN) paketu do stavové tabulky a vše bude fungovat, jak bylo očekáváno. Aktuální stav stavové tabulky můžeme sledovat příkazem ipfstat -s (obdoba příkazu top).

Stavový paket filtr - UDP

UPD je bezstavový protokol, proto je o něco obtížnější uplaňovat 'keep state'. Funkčnost si nejlépe předvedeme na příkladu:

Příkazem nslookup www.3com.com je vygenerován DNS paket 17:54:25.499852 20.20.20.1.2111 > 198.41.0.5.53: 51979+. Paket má zdrojovou IP adresu 20.20.20.1, port 2111, určen k 198.41.0.5, port 53. 60-ti sekundový stavový záznam je vytvořen. Pokud paket přijde zpět od 198.41.0.5 port 53 určen pro 20.20.20.1, port 2111 v daném čase, paket bude povolen.

Stavový paket filtr - ICMP

Jsou dva druhy ICMP zpráv: požadavky a odpovědi. Pokud použijeme pravidlo:

    pass out on tun0 proto icmp from any to any icmp-type 8 keep state

k povolení echo požadavků (obvykle ping), bude zpětně příchozí paket icmp-type 0 povolen. Stavový záznam je defaultně nastaven na 60 sekund a status 0/0. Pakety jsou oproti UDP navíc kontrolovány i dle nákladu (packet payload).

Použití Flags a Keep Frags

Zápis pravidel:

    pass  in  quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 keep state
    pass  out quick on tun0 proto tcp from any to any keep state
    block in  quick all
    block out quick all

není zcela vyhovující neboť nám prvními dvěma pravidly mohou procházet nejen pakety navazující spojení (SYN flag), ale i FIN, ACK, RST apod. Proto zápis upravíme:

    pass  in  quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 flags S keep state keep frags
    pass  out quick on tun0 proto tcp from any to any keep state flags S keep frags
    block in  log quick all
    block out log quick all

Nyní jsou povoleny pouze pakety navazující spojení a fragmentované pakety. Tímto neuspějí druhy scanů jakou jsou FIN a XMAS.

Odpovídání na blokováné pakety

Je slušností na nežádoucí spojení vygenerovat ICMP zprávu a zaslat ji žadateli o spojení. Na tcp pakety je záhodno odpovídat TCP RST - return-rst, tímto zašleme zpět na zdrojovou IP adresu zprávu o resetu spojení. U udp paketů je vhodné odpovídat ICMP zprávou 'port unreachable' - return-icmp(port-unr). port-unr můžeme nahradit zprávou jiného typu. Používání return-icmp není úplně ideální, protože bychom zpět zasílali ICMP zprávu se zdrojovou IP adresou paket filtru. Toto bylo ošetřeno v ipfilter 3.3 - return-icmp-as-dest. Příklady použití:

    block return-rst in log proto tcp from any to 20.20.20.0/24 port = 23
    block return-icmp(port-unr) in log quick on tun0 proto udp from any to 20.20.20.0/24 port = 111
    block return-icmp-as-dest(port-unr) in log quick on tun0 proto udp from any to 20.20.20.0/24 port = 111

U return-icmp je defaultně nastaveno odesílání ICMP zprávy 'port-unreachable'.

Logování

Pro umožnění logování je potřeba mít jádro zkompilované s options IPFILTER_LOG. Taktéž musí existovat zařízení /dev/ipl, ze kterého programem ipmon čteme pakety vyhovující pravidlům s klíčovým slovem log, které následně logujeme (syslog, logfile apod., viz další kapitola). Příklad:

    block out log quick on xl1 from 127.0.0.0/8 to any

Pokročilé logování

Jakým způsobem budeme logovat, ovlivňujeme při spouštění programu ipmon. Volba -s způsobí přeposílání logovaných paketů syslog démonu. Existují tzv. 'log levels', dle kterých máme možnost logované pakety v syslogu 'třídít'. Např.:

    block in log level auth.info quick on tun0 from 20.20.20.0/24 to any
    block in log level auth.alert quick on tun0 from 20.20.20.0/24 to any

Dále máme k dispozici možnost log body a log first. Při použití ipf loguje prvních 128 bitů z těla paketu. Volba log first způsobí pouze logování prvního paketu.

NAT

Typické použití NAT je pro překlad adres (v linuxu např. tzv. maškaráda)

Překlad adres (mapování mnoha adres do jedné)

Např.:

    map tun0 192.168.1.0/24 -> 20.20.20.1/32

Pokud nám není známa IP adresa interface, použijeme v pravidle 0/32. Překlad rozsahu ip adres do jedné a do rozmezí portů 20000 - 30000.

    map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:30000
    map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto

Automatická detekce volných portů k alokaci. Toto se vztahuje pouze k protokolům tcp, udp, tcp/udp. Jako doplňek k předchozím 2 pravidlům můžeme použít (řádek se znakem *):

    map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:30000
*   map tun0 192.168.1.0/24 -> 0/32

Překlad adres (mapování mnoha adres do rozsahu adres)

    map tun0 192.168.0.0/16 -> 20.20.20.0/24 portmap tcp/udp 20000:60000

Pokud potřebujeme, aby vícenásobné spojení bylo navazováno ze stejné zdrojové IP adresy, zapíšeme pravidlo:

    map-block tun0 192.168.1.0/24 -> 20.20.20.0/24

nebo

    map-block tun0 192.168.1.0/24 -> 20.20.20.0/24 auto
    map-block tun0 192.168.1.0/24 -> 20.20.20.0/24 ports 64

Poslední pravidlo určuje počet alokovatelných portů pro každou IP adresu z daného rozsahu IP adres.

Překlad adres (mapování 1:1)

    bimap tun0 192.168.1.1/32 -> 20.20.20.1/32

Policy NAT

Pokud chceme použít NAT vždy, kromě komunikace se specifickou sítí, použijeme:

    map tun0 from 192.168.1.0/24 ! to 5.0.0.0/20 -> 20.20.20.1/32

nebo

    map tun0 from 192.168.1.5/32 port = 5555 to 1.2.3.4/32 -> 20.20.20.2/32
    map tun0 from 192.168.1.0/24 to 5.0.0.0/20 -> 20.20.20.2/32 portmap auto

Přesměrování

Např.: rdr xl0 62.24.77.9/32 port 8008 -> 192.168.0.2 port 22 tcp způsobí přeposílání tcp paketů určených pro 62.24.77.9/32 port 8008 na 192.168.0.2 port 22. Další příklady:

    rdr xl0 62.24.77.9/32 port 8008 -> 192.168.0.2 port 22 tcp
    rdr tun0 20.20.20.0/24 port 31337 -> 127.0.0.1 port 31337 udp
    rdr tun0 from 10.1.1.1/32 to 20.20.20.5/32 port = 80 -> 192.168.0.5 port 8001
    rdr tun0 from 10.1.1.1/32 port = 12345 to 20.20.20.5/32 port = 80 -> 192.168.0.5 port 8002
    rdr tun0 20.20.20.5/32 port 80 -> 20.20.20.6 port 80 tcp

Pravidlo rdr tun0 20.20.20.5/32 port 80 -> 20.20.20.6 port 80 tcp nebude fungovat za předpokladu, že stroje .5 a .6 jsou na stejném LAN segmentu.

Podpora Transparetních proxy

    rdr xl0 0.0.0.0/0 port 21 -> 127.0.0.1 port 21

Aplikační proxy servery

Například FTP. Můžeme zajistit, aby náš paket filtr, který při kontrole procházejících paketů zjistil, že se jedná o aktivní FTP spojení, vytvořil dočasná pravidla, podobně jako tomu je u keep state a tím umožnil funkčnost FTP data spojení. Čehož dosáhneme následujícím pravidlem.

    map tun0 192.168.1.0/24 -> 20.20.20.1/32 proxy port ftp ftp/tcp

Vždy je potřeba umístit toto proxy pravidlo před jakékoli pravidlo týkající se přesměrování portů (portmap pravidla), jinak se jako první uplatní pravidlo s portmap (hlavička v paketu se přepíše) dříve, než proxy pravidlo. Mějte na paměti, že ipnat pravidla se uplatňují (kontrolují) jako první v pořadí, tzv. firt-match rules. IPF ftp proxy podporuje "FTP nat server", nedoporučuje se její používání z bezpečnostních důvodů, viz http://www.false.net/ipfilter/2001_11/0273.html.

Použití NAT jako Load Balancer

Pomocí klíčového slova round-robin můžeme námi definovaný provoz přeposílat několika hostům - Load Balancer.

    rdr tun0 20.20.20.5/32 port 80 -> 192.168.0.5, 192.168.0.6, 192.168.0.7 port 8000

Tímto pravidlem budeme přeposílat veškerý provoz určený pro 20.20.20.5/32 port 80 na stroje 192.168.0.5, 192.168.0.6, 192.168.0.7 port 8000.

Monitorování a ladění

Naleznete v manuálových stránkách ipfstat(8), ipmon(8).

Proměnné jádra

IP Forwarding:

    OpenBSD:
        net.inet.ip.forwarding=1
    FreeBSD:
        net.inet.ip.forwarding=1
    NetBSD:
        net.inet.ip.forwarding=1

Manipulace s porty:

    OpenBSD:
        net.inet.ip.portfirst = 25000
    FreeBSD:
        net.inet.ip.portrange.first  =  25000
        net.inet.ip.portrange.last = 49151
    NetBSD:
        net.inet.ip.anonportmin = 25000
        net.inet.ip.anonportmax = 49151

Další užitečné hodnoty:

    OpenBSD:
        net.inet.ip.sourceroute = 0
        net.inet.ip.directed-broadcast = 0
    FreeBSD:
        net.inet.ip.sourceroute=0
        net.ip.accept_sourceroute=0
    NetBSD:
        net.inet.ip.allowsrcrt=0
        net.inet.ip.forwsrcrt=0
        net.inet.ip.directed-broadcast=0
        net.inet.ip.redirect=0

FreeBSD specifické ipf sysctl možnosti:

    net.inet.ipf.fr_flags: 0
    net.inet.ipf.fr_pass: 514
    net.inet.ipf.fr_active: 0
    net.inet.ipf.fr_tcpidletimeout: 864000
    net.inet.ipf.fr_tcpclosewait: 60
    net.inet.ipf.fr_tcplastack: 20
    net.inet.ipf.fr_tcptimeout: 120
    net.inet.ipf.fr_tcpclosed: 1
    net.inet.ipf.fr_udptimeout: 120
    net.inet.ipf.fr_icmptimeout: 120
    net.inet.ipf.fr_defnatage: 1200
    net.inet.ipf.fr_ipfrttl: 120
    net.inet.ipf.ipl_unreach: 13
    net.inet.ipf.ipl_inited: 1
    net.inet.ipf.fr_authsize: 32
    net.inet.ipf.fr_authused: 0
    net.inet.ipf.fr_defaultauthage: 600

Duplikování paketů

Umožňuje duplikaci a odeslání paketů do "jiné sítě" dle definovaných pravidel.

    pass out on xl3 dup-to ed0:192.168.254.2 from any to any

Přepošle veškerý provoz směrem ven prochájící přes rozhraní xl3 na interface ed0 a ip adresu 192.168.254.2.

Odkazy

TCP filtering (Postscript)

IP accounting system pro IPF

Domácí stránka IPF

IPF - HOWTO

Autor

Michal Kutnohorský <michal at FreeBSD.cz> http://www.FreeBSD.cz/~michal

Změny

  • 2003/01/02: První verze
  • 2004/04/24: Oprava chyb a stylu (Rudolf Čejka)