Firewall og deling af internetforbindelse

Fra Debianguiden
Skift til: Navigation, Søgning

Fra og med version 2.4 af Linux kernen har Linux brugere fået et stærkt redskab til at gøre internet oplevelsen mere sikker. Dette redskab hedder 'iptables'. Hvis du er i tvivl om din kerne er ny nok, eller allerede nu ved at du skal have en nyere kerne installeret, henviser vi til kerne-udskiftning. I store træk, kan iptables bruges til at dele internettet på et netværk, f.eks. som en gateway til internettet. Iptables kan også bruges til at blokere pakker der passer ind i forskellige regler, populært kaldet en firewall.

Iptables erstatter ipchains som var det foretrukne redskab i tidligere kerne versioner (2.2 og derunder). Den største forskel der er imellem disse to redskaber er, at vi med iptables har fået indført det såkaldte, stateful inspection. Det betyder at vi nu ikke kun kan kigge på pakke typen, afsender og modtager men sågar også status på pakken. Om det er en ny eller igangværende transaktion.

Installation af iptables

Installation af iptables er nemt. Programmet 'iptables' hentes via aptitude:

debian:~# aptitude install iptables

Opsætning af iptables - begreber

Her vil vi forsøge at give et grundlag for at kunne komme igang med iptables, så man kan opsætte og vedligeholde en firewall / router som bruger iptables, samt sikre ens egen computer. Til at starte med gennemgåes de forskellige begreber og så gennemgåes nogle basis opsætninger man vil komme til at støde på.

Når man snakker iptables er det nogle få vigtige begreber der er vigtige at man kan skelne fra hinanden. Dem der vil blive gennemgået her er chains/kæder, tabeller og policies. En chain kan sammenlignes med en rute. Som standard har man 3 kæder, INPUT, OUTPUT og FORWARD. Når man snakker om chains skal man altid se på det fra Linux kernens synspunkt. Hvis maskinen som kører firewallen, vil sende en pakke, kommer den igennem OUTPUT-kæden, men modtager maskinen derimod en pakke vil kernen kigge om det er en pakke som kommer fordi en bruger som vi er gateway for, har sendt en pakke og bedt om svar. Hvis pakken er svar pakke til en maskine som vi agerer gateway for, vil pakken komme i vores FORWARD chain, ellers vil kernen antage at det er en bruger som har bedt om at snakke med vores server hvor pakken så kommer til vores INPUT chain. Måden at kernen kan se dette på, er ved at kigge på pakken og se om det f. eks. er en SYN (ny pakke) eller en ACK (svar pakke) og matche dette til NAT tabellen hvori informationer om hvem der har sendt requests til hvilke servere ligger så pakker bliver leveret til de rigtige brugere. På denne måde kan vi så vælge at behandle pakken på forskellige måder.

En tabel kan betegnes som en holder til chains. Den eneste tabel vi pt. er interesseret i er faktisk vores nat tabel. Det er nemlig i vores nat tabel at vi skal skrive alle de regler som vi bruger til at lave destinations- eller source NAT (DNAT & SNAT) med. Hvis man f. eks. har mange klienter siddende på et LAN segment og kun en offentlig IP adresse, kan man bruge SNAT til at ændre afsender adressen på vores pakke. Men alt det vil vi komme ind på senere.

Tilsidst har vi så policies. En policy kan bedst betegnes som en standard regel. Hvis vores pakke ikke bliver "fanget" af nogle af vores andre regler i scriptet, vil man kigge på kædens policy. Der er 3 "targets" man kan bruge, nemlig ACCEPT, REJECT og DROP. Hvis man bruger ACCEPT vil pakken blive tilladt at komme igennem, hvorimod DROP simpelthen bare smider pakken væk. Man kan tilsidst også bruge REJECT som sender en besked til afsenderen om at denne pakke altså ikke er blevet accepteret. Man vil dog oftest være interesseret i at en maskine fra internettet ikke vil få svar på om du har modtaget pakken eller ej, så derfor bruges DROP oftest fremfor REJECT.

Opsætning af iptables - intro

Iptables er, som næsten alt andet Linux software, case sensitive. Det vil sige at der er forskel på store og små bogstaver, eksempelvis er forward og FORWARD ikke det samme. Det er derfor vigtigt at man sørger for at skrive det rigtigt, da man ellers bare vil få meldt en fejl. Opbygningen af en regel er ikke så syntaks striks som man kunne forvente. Reglen:

iptables -A INPUT -p tcp -s 10.20.30.40 -d 89.43.26.32 --dport 80 -j ACCEPT

vil f. eks. give det samme resultat som

itpables -A FORWARD -s 10.20.30.40 -d 89.43.26.32 -p tcp --dport -j ACCEPT
Iptables basis elementer
Element Beskrivelse
-s Source adressen. Bruges til at checke afsender adressen. Dette

kan bl.a. bruges hvis man ønsker at en bestemt maskines IP adresse ikke skal have adgang til maskinen. Hvis source adressen angives til FORWARD kæden kan man blokere internet adgangen for en bruger, når ens egen maskine fungerer som gateway / firewall. Man kan i stedet for at angive en IP adresse, kigge på hele subnets ved at skrive følgende: 172.16.0.0/16. Her fungere vores / som adskillelsen imellem IP og subnet. Tallet efter /'et angiver hvor mange subnet bits vi ønsker at checke på. I dette tilfælde er det 16, som giver en subnet maske på 255.255.0.0.

-d Destinations adressen. Modsvarer -s dog her kigges der på hvem der

skal modtage pakken, fremfor hvem der sender pakken. Bruges til at nægte adgang til f. eks. en hjemmeside / server, eller kan bruges til at tillade adgang til en intern server, hvis denne bruges sammen med SNAT.

-p Protocol. Hvis man ønsker at definere hvilken protokol man vil kigge

på, kan vi med -p argumentet vælge imellem f. eks. tcp, udp eller icmp.

--sport & --dport Source- og destinations port. Hvis vi ønsker at kigge på hvilken

port vores trafik kommer fra eller sendes til, kan vi bruge --sport og --dport. Man skal dog, for at kunne bruge disse, også angive hvilken protokol trafikken bruger, med -p argumentet.

-m Load module. Da iptables er modulbaseret kan man loade flere moduler

ved at bruge -m argumentet. Blandt nyttige moduler kan nævnes multiport, mac og state. Alle disse moduler giver så endnu flere muligheder for at checke pakkerne, hvilket er en af forcerne ved iptables, muligheden for skalering.

-t Table. Denne bruges til at definere hvilken tabel vi ønsker at

ændre i.

Disse elementer, eller switches, til iptables er dem som man normalt vil få brug for i den daglige administration af et større eller mindre netværk. Der er dog flere som man typisk ikke vil bruge i et privat hjemmenetværk, f. eks. MAC adresse blokering, men på større kollegie netværk f. eks. kan det oftest være en god metode for at sikre at en bruger ikke kommer på nettet med det samme.

Iptables-eksempler

I denne sektion kan du finde 2 eksempler på brugen af iptables. Det første eksempel bruger en statisk router opsætning, f.eks. en ADSL løsning med en router uden brugen af PPP klienter. Det andet script viser opsætningen med brug af en PPP forbindelse (det kan være alt fra modem, ISDN til PPPoE forbindelse).

Det andet script viser samtidigt hvordan man skal loade iptables, hvis man har valgt at kompilere dette som moduler fremfor en statisk del af kernen.

For at køre scriptsne skal de indsættes i en fil med din yndlings editor hvorefter du skal gøre filen eksekvebar med 'chmod +x <filnavn>'. Til sidst køres scriptet ved at skrive './filnavn'.

iptables med router

#!/bin/sh

# Variabler som bruges senere i scriptet.
EXT_IP="20.30.40.50"
LAN_NET="192.168.1.0/24"

# Disable routing inden regler påføres
echo 0 > /proc/sys/net/ipv4/ip_forward

# Regler flushes og policies sættes
/sbin/iptables -t nat -F
/sbin/iptables -F
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P INPUT ACCEPT

#################################################################
## BEMÆRK: Denne linie vil give meget output hvis den bruges   ##
## og der ikke i /etc/init.d/klogd er ændret KLOGD variablen   ##
## så denne er: KLOGD="-c4"                                    ##
#################################################################
# Logging af nye pakker skal startes
#/sbin/iptables -A FORWARD -m state --state NEW -j LOG --log-prefix IPTABLE_NEW --log-level 4

# Source NAT alle LAN connections til vores externe IP, hvis
# trafikken fra disse ikke er til en af vores LAN IP net.
/sbin/iptables -t nat -A POSTROUTING -s $LAN_NET -d ! $LAN_NET -j SNAT --to $EXT_IP

# Eksempel på at blokkere en enkelt port.
#/sbin/iptables -A FORWARD -p tcp --dport 110 -j DROP

# Eksempel på at blokere for enkelte porte ved brug at multiport modulet. Bemærk
# dog at multiport maksimalt kan tage 15 porte per linie i scriptet.
#/sbin/iptables -A INPUT -p tcp -m multiport --dport 22,53,80,113 -j DROP

# Eksempel på at blokkere porte med en port range
#/sbin/iptables -A FORWARD -p tcp --dport 6666:7000 -j DROP

# Tillad derefter trafik vi selv har sat igang at komme igennem
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Forwarding startes.
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables med PPP

Scriptet her kan benyttes til en simpel gateway der router alt fra det interne netværk ud til verden. Her bruges 192.168.1.x som ip-addresser på netværket.

#!/bin/sh

# Variabler som bruges senere i scriptet.
LAN_NET="192.168.1.0/24"

# Load de nødvendige moduler hvis iptables ikke er compiled ind i kernen
insmod ip_tables
insmod ip_conntrack
insmod ip_conntrack_ftp
insmod iptable_nat
insmod ipt_MASQUERADE
insmod ip_nat_ftp

# Disable routing inden regler påføres
echo 0 > /proc/sys/net/ipv4/ip_forward

# Regler flushes og policies sættes
/sbin/iptables -t nat -F
/sbin/iptables -F
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P INPUT ACCEPT

# Disse linier masquerader alle LAN connections, og tillader
# alle LAN klienter at kommer igennem firewall'en.
/sbin/iptables -t nat -A POSTROUTING -d ! $LAN_NET -j MASQUERADE
/sbin/iptables -A FORWARD -s $LAN_NET -j ACCEPT
/sbin/iptables -A FORWARD -d $LAN_NET -j ACCEPT
/sbin/iptables -A FORWARD -s ! $LAN_NET -j DROP

# Forwarding startes.
echo 1 > /proc/sys/net/ipv4/ip_forward