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
- Shorewalls hemsida (http://www.shorewall.net/)
- Shorewall och UPnP (http://www.shorewall.net/UPnP.html)
- Shorewall och trafikpriortering (http://www.shorewall.net/traffic_shaping.htm)
- Bind9 (http://www.bind9.net/)
- Drop vs Reject (eng) (http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject) - värt att läsa
- ISC DHCP (http://www.isc.org/index.pl?/sw/dhcp/)