Brandvägg i Linux

Från Unix.se, den fria unixresursen.

Innehåll

Inledning

Målet med denna artikel är att visa hur man enkelt sätter upp en dator med två nätverkskort, en bredbandsuppkoppling med dynamisk adresstilldelning samt Linux, få datorn att agera brandvägg och ge klienterna i det interna nätverket åtkomst till internet, samt installation och konfiguration av ett par praktiska nätverkstjänster.

Val av programvara

Då vi vill ha ett någorlunda enkelt sätt att hantera brandväggsreglerna så kommer vi använda Shorewall, både pga. av den omfattande dokumentationen och av hur pass enkel den är att hantera, även för en person som inte är helt insatt i hur TCP- och UDP-stackarna fungerar. Utöver det hade vi tänkt använda oss av en DHCP-server , no-ip för smidig hantering av no-ip-DNS samt vnstat för en grundläggande trafikloggning.

Vad du väljer att använda dig av för Linux distribution är ganska irrelevant - dock måste du se till att se till att alla nödvändiga paket är installerade innan du försöker dig på det här. Alla paket är dock inte nödvändiga - t.ex. no-ip och vnstat, även om dhcpd är trevligt i längden om du inte vill uppdatera alla inställningar på alla datorer så fort du ändrar något i nätverket.

Programvara

  • Shorewall
  • iptables
  • iproute2
  • dhcp
  • no-ip
  • vnstat

Kärna

Det spelar ingen större roll om du väljer att använda dig av en 2.4- eller 2.6-kärna, men 2.2-kärnor kommer garanterat inte att fungera!

För att du ska kunna översätta trafiken från internet till ditt interna nätverk behöver du iptables i din kärna - om du vill kompilera dem som moduler eller direkt in i kärnan är ditt val.

Networking options  --->
   [*] TCP/IP networking
      [*] IP: advanced router
   [*] Network packet filtering (replaces ipchains)
If you use 2.4.x, you have to enable the following for DHCP:
   [*] Socket Filtering

   IP: Netfilter Configuration  --->
      [*] Connection tracking (required for masq/NAT)
         [M] FTP protocol support
         [M] IRC protocol support
      [*] IP tables support (required for filtering/masq/NAT)
         [*] IP range match support
         [M] MAC address match support
         [*] Multiple port match support
         [*] Packet filtering
            [*] REJECT target support
            [M] REDIRECT target support
         [*] Full NAT
            [*] MASQUERADE target support
         [M] LOG target support

Exakt vart du hittar dessa inställningar i din kärna kan vara olika om du kör 2.4 eller 2.6. Hur du sedan kompilerar och installerar din kärna hittar du i artikeln Kärnkompilering_i_Linux.

Systeminställningar

Innan brandväggen kan fungera som den ska behöver ett par förändringar i systemets inställningar ske, och detta är i högsta graden distributionsspecifikt - så hur du löser detta hänvisas till din distributions dokumentation.

Det du i måste ställa in, permanent, är:

  • En fast IP-adress för det nätverkskort som är kopplat till det interna nätverket
  • Inställningar för det nätverkskort kopplat mot internet

Förhoppningsvis kan du ställa in detta med hjälp av init-systemet i din distribution.

Shorewall

Konfiguration av Shorewall

Det finns en mängd exempel, färdiga konfigurationer och andra matnyttiga dokument på Shorewalls hemsida, dock så skriver vi ut allt man behöver för att komma igång här.

Gå till mappen /etc/shorewall, och skapa dessa filer (det ska ligga en fil som heter shorewall.conf i mappen redan):

touch interfaces masq policy routestopped rules zones

När du sedan ändrar i dessa filer är det väldigt viktigt att du inte tar bort den nedersta raden som ser ut såhär:

#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

Fil för fil

Som sagt, det är vitalt att du kontrollerar att du verkligen kopierar allt från denna sida och ser till att inget konstigt händer med innehållet när du sedan klistrar in det i filen - för saker kan lätt bli fel, och det är jobbigt (och tråkigt) att felsöka när det bara handlar om en liten typo. Kom ihåg att alla dessa filer ska ligga i /etc/shorewall/ !

zones

I denna fil namnger du de olika zonerna i ditt nätverk - t.ex. WAN, LAN och DMZ kan få heta helt andra saker - dock väljer vi ett par neutrala namn, för enkelhetens skull.

#ZONE   DISPLAY         COMMENTS
net     Net             Internet
loc     Local           Local Networks
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

Nu har vi precis definierat och namnget de två olika zonerna i vårt nätverk - net, som symboliserar WAN (eller internet som vanliga människor kallar det) och loc, som i sin tur symboliserar LAN.

Det kan vara ganska bra att lägga dessa två namn på minnet.

interfaces

Här berättar vi för shorewall vilket nätverksgränsnitt som är vilket, och vilken zon som tillhör vilket kort.

#ZONE   INTERFACE       BROADCAST       OPTIONS
net     eth0            detect          dhcp,routefilter,norfc1918,tcpflags
loc     eth1            detect          dhcp,tcpflags
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Det här säger att eth0 är ansluten till WAN, och att vi får en dynamisk adress tilldelad från vår ISP - och att vårt interna nätverk är anslutet till eth1, och att vi ger ut adresser till våra klienter mha dhcpd.

masq
#INTERFACE              SUBNET          ADDRESS         PROTO   PORT(S) IPSEC
eth0                    eth1
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

Här fastställer vi att eth0 ska hantera NAT mellan eth0 (WAN) och eth1 (LAN).

policy

Här kan man göra en hel del inställningar som får en hel del inverkan på brandväggen och nätverket bakom den.
Nu har vi en väldigt öppen och fri konfiguration, som tillåter både brandväggen och användarna på LAN att komma åt precis vad de vill - om du vill begränsa deras möjligheter får du ta en titt i dokumentationen, länkar bifogas längst ner i artikeln.

#SOURCE         DEST            POLICY          LOG LEVEL       LIMIT:BURST
#Nu låter vi klienterna på LAN komma åt precis vad de vill på WAN
loc             net             ACCEPT

#Vi vill att brandväggen ska komma åt WAN
fw              net             ACCEPT

#Klienterna på LAN kommer åt brandväggen på alla portar
loc             fw              ACCEPT

#Detta skickar REJECT på allt som inte specifikt tillåts i rules
net             all             REJECT          info

# THE FOLLOWING POLICY MUST BE LAST
all             all             REJECT          info
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
rules

Nu gäller det att ha tungan rätt i mun - notera noga vad varje kolumn gör - sedan är det bara att skriva regler. Det man inte tillåter i denna fil kommer automatiskt att svaras med ett REJECT-paket!

Du behöver inte öppna portar för att hantera ident eller ftp - detta sköter shorewall automatiskt (dock behöver du ha kompilerat in stöd för ftp i kärnan).

#ACTION         SOURCE          DEST            PROTO   PORT #

#Detta låter folk använda ssh till brandväggen, från WAN
ACCEPT          net             fw              tcp     22

#Det här öppnar port 80 mot nätet
ACCEPT          net             fw              tcp     80

#
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Det är i denna fil man lägger till t.ex. en port-forward. För att skicka all trafik på port 80 till en intern dator med adressen 192.168.0.100 kan man göra såhär:

DNAT net loc:192.168.0.100 tcp 80
routestopped
#INTERFACE      HOST(S)
eth1            -
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Den här filen är först användbar om man har flera zoner man vill hantera.

DHCP

Om du inte hade några problem med Shorewall och fick igång den, så ska vi nu börja konfigurera DHCP, så att vi slipper springa runt och ställa in fast IP för alla datorer i nätverket.

Om du skulle vilja ha en fast adress för en klient men fortfarande vill använda dig av DHCP, så är det lätt ordnat - det du behöver är nätverkskortet i datorns MAC-adress, som man i Microsoft Windows lättast får fram genom att öppna en kommandotolk (skriv "cmd" i "Kör", utan citationstecken), och sedan skriva

ipconfig /all

I Linux / BSD använder man sig av ifconfig, på ett liknande vis:

ifconfig

dhcpd.conf

Denna exempelkonfiguration kommer dela ut adresser från 172.16.0.100 till 172.31.0.200 - dvs väldigt många adresser.

authoritative;
subnet 172.16.0.0 netmask 255.255.255.0 {
        range 172.16.0.100 172.31.0.200;
        default-lease-time 259200;
        max-lease-time 518400;
        option subnet-mask 255.255.255.0;
        option broadcast-address 172.16.0.255;
        option routers 172.16.0.1;
        option domain-name-servers 172.16.0.1;

        host kalle {
                hardware ethernet 00:00:00:00:00:00;
                fixed-address 172.16.0.10;
        }
}

Övrigt programvara

no-ip

Det här är en klient från no-ip.com (http://www.no-ip.com), för att sköta uppdateringen av de domäner man använder från no-ip, om man skulle få en ny adress från sin ISP och istället för att uppdatera uppgifterna på hemsidan kan man med detta program genomföra detta automatiskt - det låter kanske som något svårt, men det är faktiskt ganska enkelt.

Starta konfigurationsguiden:

no-ip -C

Svara sedan på frågorna - och när guiden frågar efter vilket gränsnitt (interface) den ska köras på, ange det nätverkskort som WAN är inkopplat i (eth0, i denna guide).

bind9

bind är en enormt kraftfull DNS-server som man kan göra mycket med - dock är det lite överkurs att gå in på det här, utan vi ska istället använda oss av bind9 för att översätta DNS-adresser och sedan lagra dem (cache), så att vi slipper belasta de stora root-DNSerna och slipper slå upp en adress mer än en gång - detta är inte speciellt svårt att uppnå, då det är precis så bind9 är konfigurerat från början :-)

vnstat

vnstat är ett program som räknar ut och loggar precis hur mycket trafik som har gått igenom det gränsnitt som den övervakar - och man kan producera enklare grafer och statistik i acsii-format. Dock sköter den inte uppdatering själv, men detta kan man lägg åtgärda med ett cron-job, så att den uppdateras t.ex. var 5:e minut.

Skapa databasen

Innan vi kan börja uppdatera måste vi först säga vilket gränsnitt som ska övervakas, och skapa databasen:

vnstat -u -i eth0

Den kommer protestera över att den inte hittar någon databas innan den skapar databasen själv.

cronjob

Detta lägger vi till i /etc/crontab:

0-55/5 * * * * root /usr/bin/vnstat -i eth0 -u

Överkurs

Shorewall är, som sagt, ett väldigt kraftfullt verktyg, men täcker inte allt - med med hjälp av andra verktyg kan man åstakomma mycket.

Om du skulle känna att det kliar i fingrarna, så finns det ett flertal intressanta saker att åstakomma - t.ex. UPnP (för att t.ex. MSN Messenger ska fungera fullt ut) och trafikprioritering - dock kräver detta att du sätter dig ner och patchar shorewall, och fördjupar dig i andra projekt och deras dokumentation...

Om du dock känner dig nöjd med hur din brandvägg fungerar som det är nu behövs du givetvis inte göra någonting.

Vidare läsning

Personliga verktyg