Netfilter

Fra Oslo Linux User Group (OLUG)
Hopp til: navigasjon, søk

Hva er netfilter?

Netfilter er linux 2.4 sin implementasjon av et pakkefilter. Et pakkefilter inspiserer hodet til pakkene på et nettverk, og bestemmer seg med utgangspunkt i disse hodene hva som skal gjøres med pakkene. Det er ike meningen at denne lilel teksten skal gå i detalj på TCP/IP, pakkeutseende og detaljer- det er et alt for omfattende tema. En brannmur er et settmed, eller et program på en gateway som beskytetr ressursene på nettet innenfor. En brannmur kan også hindre brukere på innsida å benytte tjenester på utsida. Vi skal bruke netfilter sammen med userspaceverktøyet iptables til å lage en helt enkel brannmur. For å få netfilter til å kjøre, trengs det en kjerne som har de rette opsjonene innkompilert. Vi skal anta for enkelhets skyld at dette allerede er tilstede. De korrekte kjernemodulene vil bli lastet når det er bruk for dem.

Oversikt over netfilter-arkitekturen

Følgende ascii-art viser hvordan netfilter fungerer (lånt fra Rusty Russells uoffisielle netfilter HOWTO):

                          _____
Incoming                 /     \         Outgoing
       -->[Routing ]--->|FORWARD|------->
          [Decision]     \_____/        ^
               |                        |
               v                      ____
              ___                    /    \
             /   \                  |OUTPUT|
            |INPUT|                  \____/
             \___/                      ^
               |                        |
                ----> Local Process ----

En pakke som ankommer (incoming) blir først inspisert for å finne ut om den skal FORWARDes, eller som den skal til INPUT. Forwarding må være satt på dersom pakken skal gå videre til FORWARD. Dette kalles ruting (routing decision). FORWARD, INPUT og OUTPUT er såkalte kjeder, som hver består av et sett med regler. En pakke som ankommer en av disse kjedene vil bli sjekket opp mot den første regelen i kjedet. Dersom den matcher, kan pakken enten behandles på en måte av regelen, eller den kan sendes videre til neste regel uten at noe skjer (mest brukt for logging). Dersom pakken ikke matcher regelen, sjekkes den mot neste regel i kjedet. Dersom pakken kommer til enden av kjedet, blir den behandlet ifølge en "default policy" som kan settes for hvert kjede. Man kan også lage sine egne kjeder, som man kan bruke en egen regel for å sende pakker til. Dersom en pakke kommer til enden av et egendefinert kjede, uten å matche noen av reglene, vil pakken bli sendt tilbake til kjedet den kom fra og fortsette der etter regelen som sendte den ut til det egendefinerte kjedet.

I tillegg til de kjedene som er vist her, som er default oppsatt, og ikke kan slettes, finnes det en "tabell" til med noen ekstra kjeder som bruke ved NAT, Network Address Translation. Vi skal ikke se så mye på denne i denne omgang - vi skal nøye oss med å enable NAT for de maskinene som er på innsida av brannmuren. En regel kan gjøre mange ting med en pakke. DEn kan ACCEPTeres, den kan DROPpes, eller den kan bli REJECTed. DROP vil si at pakken droppes helt uten videre, uten at avsender får noe mer melding om det. REJECT vil si at vi forteller avsender høflig at sorry, den vil vi ikke ha. ACCEPT betyr at pakken vil bli sendt videre til en eventuell lokal prosess som venter på å motta den.

Et program på boksen kan også be om å få sende pakker. Den vil da bli sendt gjennom OUTPUT kjedet. Dersom den kommer gjennom, vil den bli sendt til sin destinasjon.


Et typisk oppsett med kjeder kan se slik ut:

  • Kjede INPUT; default policy DROP
    • Regel 1
    • Regel 2
    • Regel 3
    • Regel 4
    • Regel 5
  • Kjede FORWARD; default policy DROP
    • Regel 1
    • Regel 2
  • Kjede OUTPUT; default policy DROP
    • Regel 1
    • Regel 2
    • Regel 3

Det er userspaceverktøyet "iptables" som brukes til å sette inn og fjerne eller manipulere på kjedene. iptables har et utall opsjoner som gjør det til et meget fleksibelt og kraftig verktøy for å filtrere pakker. Den generelle syntaxen til iptables kan skrives, lett forståelig, som:

	iptables kjedeoperasjon kjede pakkespesifikasjon handling

Noen eksempler:

	iptables -A INPUT -p tcp -s 10.0.2.0/24 --dport 80 -j ACCEPT

Denne linja legger til (Append) en regel til INPUT kjedet, med pakkespesifikasjon: Protokoll TCP (-p tcp), kilde-IP i nettet 10.0.2.0/24, målport 80, og med handling ACCEPT.