6.4. Firewallens virkemåder

Som sagt kan en Linux-pc fungere som firewall og router. En firewall-router er dog ofte en dedikeret, flad boks, som egentlig er et diskløst system, der kan fjernstyres fra en anden computer. Der fås billige routere til mindre virksomheder og private net, og der fås også store routere med mange stik, som kan håndtere meget store trafikmængder. Der er en Linux-kerne inde i mange af den slags dedikerede routere. TODO: eksempler, billede.

Inde i firewallen inspiceres pakkerne. Hvordan man gør, og hvor meget det koster i tid, og hvilke problemer, der kan opstå, er emnet for dette afsnit.

Netværksmodellen (Afsnit 6.1.1.1) viser to ting. Dels viser den abstraktionslagene, som giver de elektriske signaler mening. Dels viser modellen, at en applikation, som ønsker at sende data (typisk tekst) til en anden applikation på en remote værtsmaskine, skal sende sin pakke gennem adskillige instanser (lag svarer her til programafsnit eller kernefunktioner). Hver gang pakken passerer et lag, bliver det hele lagt i en slags "konvolut". Først sendes applikationens information til transportlaget, og her lægges TCP-oplysninger ind i nogle felter forrest i pakken. Pakken (eller rettere en pointer til den) sendes videre til IP-laget, som forsyner den med en IP-header, "konvolut", foran.


   <-IP-header----|--TCP-header----|----FTP-header-|-FTP-data----|->
   |                                                               |
   <-----------------------IP-pakke-------------------------------->
                  |                                                |
                  <--------------TCP-segment-eller-pakke----------->
                                   |                               |
                                   |                               |
                                   <-------------FTP-pakke--------->


   Skematisk opstilling af IP-pakke som konvolut for en TCP-pakke

Hver konvolut svarer til et lag i netværksmodellen. Uden om IP-pakken er der på et ethernet en ethernet pakke. Det er en god ide at se på den slags pakker med programmet ethereal. Når ethernet-headeren er selected i mellemste rude, så er de tilsvarende bytes highlighted i hexdump-ruden nederst.

Lagene fra den simple DoD model med kommentarer ses her:


                           Protocol Layering

                        +---------------------+
                        |     higher-level    |
                        | applikations-laget  |
                        +---------------------+
                        |        TCP          |
                        +---------------------+
                        |  internet protocol  |
                        +---------------------+
                        |communication network|
                        +---------------------+


Et par forklaringer: Finger protokollen er en af de simplere, morsomme protokoller. Det er nemt at prøve fingerprotokollen: finger quake@geophys.washington.edu

SNMP, Simple Network Management Protocol, bruges til fjernkontrol af netværks enheder som f.eks routere. ICMP, Internet Control Message Protocol, er den, som ping programmet benytter, og den, som gør det muligt at sende en besked om, at vores maskine ikke har tænkt sig at svare på fx. ftp. MAC-adresser kan listes med arp -a programmet og er et tal, som er brændt ind i netkortets ROM, så hardwaren altid kan skelne to netkort fra hinanden.

Disse netværkslag er defineret med henblik på at kunne transportere så meget som muligt så hurtigt som muligt. Derfor behøver IP-laget ikke at interessere sig for, om data er korrekte eller om der lyttes på modtagerens portnummer, og heller ikke for applikationens datakodning og så videre.

Det er derfor meget enkelt og "billigt", målt i tid, at filtrere indkommende pakker på netværkslaget. Bare se efter, om de er til vores maskine, og om de kommer inde- eller udefra.

Hvis firewallen imidlertid er nødt til også at udpakke transportpakken (d.v.s. se i TCP-konvolutten for at få fat i portnummeret) så kræver det selvfølgelig lidt mere tid. Hvis pakken yderligere skal om-adresseres og en ny tjeksum skal beregnes, så bliver det rigtig dyrt. Som tidligere nævnt er det for primitivt kun at filtrere på netværkslaget.

De omtalte netværkslag svarer i kernen til programafsnit, som bearbejder henholdsvis IP-adresse, TCP-oplysninger og, i sidste instans, flytter pakken til den applikation, som skal bruge data.

6.4.1. NAT-ing giver også mere sikkerhed

Som tidligere nævnt skal en NAT-ing router omsætte de interne eller private IP-adresser til den offentlige (lovligt købte) IP-adresse, som man har fået af sin Internet Udbyder, Internet Service Provider, ISP. Man kan for eksempel bruge adresserne 192.168.1.1-255 som lokale adresser, denne nummerserie er reserveret. Det er en del af de såkaldt "private adresser", som ikke bliver sendt rundt på det offentlige net. De er reserverede for at gøre det lettere at etablere et lokalnet uden at skulle søge og betale for "rigtige IP-adresser".

NAT-teknikken er med til at gøre firewallen mere uigennemtrængelig. Det ses, hvis man forestiller sig hvad der sker, hvis man prøver at "snakke" med en maskine med et 192.168.x.y - nummer? Pakkerne kommer ingen vegne. Hvis nogen prøver at trænge igennem en firewall ved at bryde ind i en kommunkations sekvens (trediemandsprincippet, spoofing) så skal pakkerne kunne snyde firewallen *og* modtagemaskinen inden for muren. Det er svært, og det sker heldigvis meget sjældent.

6.4.2. Kontrol med oprettelse af forbindelser

At åbne for alle forbindelser, som startes indefra, kræver, at firewallen holder styr på, hvilke forbindelser der er oprettet; for at gøre det, skal firewallen have inkluderet et modul, der kaldes "connection tracking". Derved kan Linux-kernen styre hvilke forbindelser, der må oprettes imellem de to adskilte netværk. Den kan også logge, hvad der sker på disse forbindelser.

Der er her tale om filtrering på session- eller forbindelses-niveau (se Afsnit 6.1.1.1). FTP er en protokol oven på TCP-laget, og når denne applikation går i gang, opretter den mange "forbindelser". Det giver en ekstra vanskelighed for en firewall. Man skal huske, at FTP protokollen kom til verden i en tid, hvor der ikke var noget, der hed firewalls.

6.4.3. Ftp-problemet

Traditionel FTP, også kaldet aktiv FTP, er lidt et problem i forbindelse med en firewall, da det laver indgående forbindelser. Ikke alene laver det indgående forbindelser, men det er ikke muligt på forhånd at vide hvilken port, forbindelsen laves på. Det vil sige, at for at tillade sine brugere at benytte aktiv FTP, er man nødt til at lade en masse porte stå åbne. Lad os se, hvad der sker, når man bruger traditionel FTP:


Aktiv FTP 

  Klient                  Server
                     command  data
57726 57724               21   20
  @    @                  @    @
  |    |1__               |    |
  |    |   \__port 57726__|    |
  |    |                  |    |
  |    |              ___2|    |
  |    |____ok__ ____/    |    |
  |    |                  |    |
  |____|_                 |    |
  |    | \_data channel___|___3|
  |    |                  |    |
  |    |                __|____|
  |4___|________ ok___ /  |    |
  |    |                  |    |
  |    |                  |    |

Man kan se, at serveren opretter en forbindelse til klienten på port 57726. Da man ikke på forhånd kan vide hvilken port, der vil blive brugt på klienten - FTP-programmet vælger bare en ledig port - er det nødvendigt at lade et portinterval på klienten stå åbent for FTP-forbindelser, så FTP-klienten kan virke.

Problemet kan løses med nyere udgaver af FTP, som kan køre "passiv FTP" i stedet for. Ved passiv FTP er det kun klienten, der starter forbindelser op.

Eksempel 6-1. Passiv FTP


Passiv FTP 

  Klient                  Server
                     command      data
57726 57724               21       20
  @    @                  @  58734   @
  |    |1__               |    @    |
  |    |   \_PASV_________|    |    |
  |    |                  |    |    |
  |    |______ok_58734___2|    |    |
  |    |                  |    |    |
  |3___|__                |    |    |
  |    |  \__data_channel_|____|    |
  |    |                  |    |    |
  |____|_______ok_________|___4|    |
  |    |                  |    |    |
  |    |                  |    |    |
  |    |                  |    |    |
  |    |                  |    |    |

Lad os se på, hvad der er vundet. Hvis man vedligeholder en firewall bag hvilken, der er klienter, der gerne vil hente via ftp, er man ved traditionel ftp nødt til at lade et portinterval stå åbent til indgående forbindelser, som de forskellige ftp-servere, folk henter fra, skal oprette. Bruges der derimod passiv ftp, skal man kun tillade udgående forbindelser - man behøver ikke længere lade et portinterval stå åbent til de indgående forbindelser fra diverse ftp-servere.

Ftp-serveren skal til gengæld lade en port stå åben til data, men den bestemmer selv hvilken. Den oplysning sender den med over, før dataforbindelsen oprettes. Alligevel betragtes det nogle steder som et problem på serversiden. Selvom de fleste ftp-programmer - herunder web-browsere - understøtter passiv ftp, er det derfor ikke alle ftp-servere, der understøtter det.