Titel: IPtables, een firewall voor linux
Schrijver: Arn Vollebregt
Versie: 1.0
Op de planning: Toevoeging over logfiles.Index
0.1 Voorwoord
0.2 Benodigheden
0.3 Packet forwarding
1.0 Hoe zit IPtables in elkaar
1.1 De bediening van IPtables
1.2 Rekening houden met IPtables ’slechte’ geheugen
1.3 Een simpele firewall
1.4 Een statefull firewall
1.5 Een DMZ
1.6 De firewall policy
1.7 Tips voor het gebruik van IPtables
1.8 Nawoord0.1 Voorwoord
Waarom heb je een firewall nodig?
Het risico van een aanval op een van je computers is met de afgelopen jaren flink toegenomen.
Met de dag worden er beveiligings gaten gevonden in Operating Systems, danwel de software die daarop draait.
En met de dag worden er ook kant en klare tools en exploits op het internet gezet die het leven van een potentiele aanvaller
een stuk makkelijker maken. Als je altijd met je computers bezig bent zijn ze natuurlijk volledig up-to-date, en wordt de
kans een stuk kleiner dat je systeem gehacked zal worden. Doch ben je ook dan nog niet volledig veilig voor 0days[1].
Een firewall helpt je het risico van een hack op een van jou computers te verkleinen. Dit door ten eerste het aantal
toegangswegen naar jou computers drastisch te verkleinen, en ten tweede door computers die vanaf het internet bereikbaar
moeten zijn in een apart netwerk te stoppen, welke los staat van je normale netwerk.[1] Beveiligingsgaten die nog maar net ontdekt zijn en waarvoor nog geen patch bestaat.
0.2 Benodigheden
Deze text gaat ervan uit dat je beschikt over het volgende:
1) Een linux Operating System waar je volledige controlle (root) over hebt.
2) IPtables dient geinstalleerd te zijn.
3) 2 NIC’s[1] (als je geen publieke services gaat draaien).
4) 3 NIC’s (als je een publieke service gaat draaien, bijvoorbeeld een webserver).
5) Basis kennis van linux (weten hoe je bestanden moet bewerken, en hoe je moet navigeren).
6) Basis kennis van netwerken (protocolen en porten).[1] NIC staat voor Network Interface Card, oftewel een netwerk kaart.
0.3 Packet forwarding
Voordat we de firewall regels gaan bouwen, zullen we eerst moeten zorgen dat de firewall data pakketen door kan geven naar
computers achter de firewalls.
Dit process zal per Operating System verschillend zijn, aangezien ik zelf alleen Redhat draai bij deze een uitleg voor
Redhat;
Open ‘/etc/sysctl.conf’ in een editor, en verander ‘net.ipv4.ip_forward = 0′ in
‘net.ipv4.ip_forward = 1′.1.0 Hoe zit IPtables in elkaar
Hoe IPtables precies in elkaar zit doet er op dit moment niet zoveel toe, maar het is handig om het volgende te weten;
IPtables is opgebouwd uit verschillende tabellen (tables), waar iedere tabel ook weer is onder verdeeld in zogenaamde
ketenen (chains):tables
+————+————+
| filter | nat |
+————+————+
| INPUT | PREROUTING |
chains +————+————+
| FORWARD |POSTROUTING |
+————+————+
| OUTPUT | OUTPUT |
+————+————+Er is nog een derde table genaamd ‘mangle’ maar daar gaan we ons niet mee bezig houden in deze text.
Verkeer welke door de firewall heen gaat, zal op de volgende manier door deze tabellen heenlopen:
———-
/ \
| internet |
\ /
———-
|
V
|
+————+————+
| table | chain |
+–<—<—+————+————+—>—>–+
| | nat | PREROUTING | |
V +————+————+ V
| |
data voor de server zelf data voor computers achter de server
| |
+————+————+ +————+————+
| table | chain | | table | chain |
+————+————+ +————+————+
| filter | INPUT | | filter | FORWARD |
+————+————+ +————+————+
| |
V V
| |
+————+————+ +————+————+
| table | chain | | table | chain |
+————+————+ +————+————+
| nat | OUTPUT | | filter | OUTPUT |
+————+————+ +————+————+
| |
V V
| |
+————+————+ |
| table | chain | V
+————+————+ |
| filter | OUTPUT | |
+————+————+ V
| |
| |
V V
| +————+————+ |
| | table | chain | |
+–>—>—+————+————+—<—<–+
| nat |POSTROUTING |
+————+————+
|
V
|
———-
/ \
| netwerk |
\ /
———-Dit ziet er waarschijnlijk complex uit op dit moment, maar dit is een handig plaatje om naar terug te kunnen grijpen,
aangezien het belangrijk is om te weten welke weg data zal bewandelen als je hier een firewall regel voor wilt aanmaken.1.1 De bediening van IPtables
Alhoewel je natuurlijk alles uit de man[1] pagina’s kunt halen, zal ik hier toch een paar basis dingen uitleggen. Alle
commando’s staan tussen quotes, maar dienen natuurlijk zonder quotes via de commandline ingevoerd te worden.Onderstaan commando laat de huidige regelset uit de tabel ‘nat’ zien;
‘iptables -t nat -L -n -v’
‘iptables’ = het commando om iptables aan te roepen.
‘-t’ = ‘table’
‘nat’ = de table die je wilt zien. Opties; ‘filter’, ‘nat’ en ‘mangle’.
‘-L’ = ‘list’, een lijst van de regels die in deze table zitten.
‘-n’ = ‘numeric’, netjes alles in nummertjes (IP’s, ranges, etc).
‘-v’ = ‘verbose’, een uitgebreidere weergave.Onderstaan commando voegt een firewall regel toe voor SSH[2];
‘iptables -A INPUT -p tcp –dport 22 –sport 0/0 -j ACCEPT’
‘iptables’ = het commando om iptables aan te roepen.
‘-A’ = ‘append’, een regel toevoegen.
‘INPUT’ = de ‘chain’ waar de regel in komt.
‘-p’ = ‘protocol’, het gebruikte protocol.
‘tcp’ = het protocol waar deze regel voor geldt.
‘–dport’ = ‘destination port’, de poort op de machine.
‘22′ = de poort waar deze regel voor geldt.
‘–sport’ = ’source port’, de poort op de client.
‘0/0′ = Iedere client poort wordt geaccepteerd.
‘-j’ = ‘jump’ wat er moet gebeuren met de data.
‘ACCEPT’ = de data wordt geaccepteerd.Aangezien in bovenstaand voorbeeld geen ‘-t’ switch is meegegeven wordt deze regel aan de
standaard tabel toegevoegd, ‘filter’.[1] ‘man’ staat voor manual, de handleiding.
[2] ‘SSH’ staat voor Secure Shell Header, een versie van telnet die gebruikt maakt van encryptie.1.2 Rekening houden met IPtables ’slechte’ geheugen
Alhoewel nieuwe regels die worden ingevoerd via de commandline meteen van kracht zijn, zal IPtables deze regels weer
‘vergeten’ zijn zodra de computer danwel de service weer opnieuw opgestart wordt.
Aan de ene kant is dit handig (zeker in deze beginne), aangezien je een cruciale fout makkelijk kan verhelpen door de
computer of de service weer opnieuw op te starten. Aan de andere kant is dit natuurlijk vermoeiend zodra je een goede
regelset (ruleset) hebt geproduceerd; Je wilt niet iedere keer weer opnieuw alle regels aan de firewall toevoegen.
Ten eerste heeft IPtables een tweetal handige tools die je hierbij gaan helpen;
‘iptables-save’ en ‘iptables-restore’.
‘iptables-save’ slaat alle huidige regels van IPtables voor je op, en schrijft zo ook naar je scherm toe. Als je
‘iptables-save > regels.txt’ via de commandline uitvoert worden bovendien al je firewall regels opgeslagen in een textfile,
zodat je verschillende versies kunt opslaan. Wil je vervolgens een van deze regelsets gebruiken dan voer je simpelweg
‘iptables-restore < regels.txt’ uit. Vervolgens voer je ’service iptables restart’ uit, en de firewall wordt geladen met je
eigen regelset.1.3 Een simpele firewall
Onderstaand vind je een setup voor een simpele firewall. Text waar een # voor staat is uitleg en dient niet ingevoerd te
worden.iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# ‘lo’ staat voor ‘loopback’ (IP 127.0.0.1). Bovenstaande regels zijn nodig als je een X windows systeem wilt
# draaien.
iptables -A OUTPUT -o eth0 -s 0/0 -d 0/0 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -d 0/0 -m state –state RELATED,ESTABLISHED -j ACCEPT
# Bovenstaande regels staan dataverkeer van binnen naar buiten toe (eth0 is over het algemeen
# de externe adapter die naar het internet gaat). Nieuw is de regel
# ‘-m state –state, hierover zometeen meer uitleg.
iptables -A OUTPUT -o eth1 -s 0/0 -d 0/0 -j ACCEPT
iptables -A INPUT -i eth1 -s 0/0 -d 0/0 -j ACCEPT
# Deze regels maken dataverkeer van en naar het lokale netwerk mogenlijk op interface eth1.
# Je ziet hier 0/0 verschijnen omdat het niet veel uitmaakt waar de data heengaat danwel
# vandaan komt zolang je geen publieke services draait (zie hiervoor ‘1.6 Een DMZ’).
# ‘-i’ specificeerd de ‘input’, de adapter waarop het verkeer binnen komt.
# ‘-o’ specificeerd de ‘ouput’, de adapter van waaruit het verkeer verstuurd wordt.
# Aangezien er geen protocol is gespecificeerd worden alle protocolen toegelaten.
iptables -A FORWARD -i eth0 -o eth1 -s 0/0 -d 0/0 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -s 0/0 -d 0/0 -j ACCEPT
# Deze regels maken dataverkeer mogenlijk tussen eth1 (het lokale netwerk) en eth0 (het internet)1.4 Een statefull firewall
‘-m state –state NEW,RELATED,ESTABLISHED’ roept met ‘-m’ een module aan, in dit geval de ’state’ module.
Zoals je ziet zijn er 3 opties (parameters) mogelijk bij deze module, zijnde ‘NEW’, ‘RELATED’ en ‘ESTABLISHED’.
Wat deze module doet is connecties van en naar de firewall bijhouden. Zoals je ziet in bovenstaande firewall regels zijn er
geen enkele regels voor verkeer naar de firewall toe, alleen maar regels voor dataverkeer welke vanaf de firewall ergens
anders heen gaan. De state module zal een relatie leggen tussen uitgaand en inkomend verkeer.Een voorbeeld;
PC1 achter de firewall maakt een connectie met PC2 op het internet:
1) PC1 stuurt een data pakket naar poort 80 van PC2, en gebruikt daarvoor de lokaal poort 2724.
2) PC2 stuurt data vanaf poort 80 naar PC1 op poort 2724.
3) PC2 stuurt data naar poort 22 van PC1.
De state module zal ervoor zorgen dat ondanks het feit dat er geen firewall regel is voor verkeer vanaf het internet met als
source port 80, dat de data vanaf PC2 toch naar PC1 zal kunnen worden gestuurd door de firewall. PC1 heeft namelijk eerst
data gestuurd naar poort 80 van PC2, dus de firewall zal dataverkeer vanaf poort 80 van PC2 als gerelated (related) zien.
Het dataverkeer naar poort 22 vanaf PC2 naar PC1 wordt echter niet doorgelaten, aangezien de firewall nog geen data heeft
gezien vanaf poort 22 van PC1 naar PC2. De state module maakt het leven dus een stuk simpeler, aangezien je niet apart
allemaal regels aan hoeft te maken voor streaming audio en video, ICQ, MSN, websurfen, etc. Het enige nadeel is dat je geen
totale controlle hebt over wat computers achter de firewall doen , maar dat is meer iets voor een professioneel/bedrijfs
netwerk, voor een thuis netwerk maakt dit niet zoveel uit. Als je toch bepaalde verkeer niet wilt toelaten kun je dit ook
expliciet tegenhouden (blocken) in je firewall regels.1.5 Een DMZ
DMZ staat voor De-Militarized Zone.
Een DMZ is een apart lokaal netwerk welke los staat van je normale lokale netwerk. Dit betekend dat er in principe geen
dataverkeer mogenlijk is vanaf je LAN naar je DMZ en andersom. De lol hiervan is, dat zelfs als een publieke service die je
beschikbaar stelt via internet een beveiligingsgat bevat waardoor men de hele computer kan overnemen, men nog steeds niet bij
de rest van de computers kan om deze ook over te nemen. Het opzetten van een DMZ is gedeeltelijk hetzelfde als de
bovenstaande opzet, maar wat verder ingeperkt;iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# X-Windows data verkeer.
iptables -A OUTPUT -o eth0 -s 0/0 -d 0/0 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -d 0/0 -m state –state RELATED,ESTABLISHED -j ACCEPT
# Verkeer van en naar het internet.
iptables -A INPUT -i eth1 -s ! 10.0.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -o eth1 -s 192.168.0.0/24 -d ! 10.0.0.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -s ! 10.0.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.0.0/24 -d ! 10.0.0.0/24 -j ACCEPT
# Zoals je ziet is er verkeer op je LAN toegestaan, zolang het maar niet van en naar 10.0.0.0/24
# gaat, wat de IP range is van de DMZ in dit voorbeeld.
iptables -A INPUT -i eth2 -p tcp –dport 80 -d 10.0.0.2 -s ! 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp –sport 80 -s 10.0.0.2 -d ! 192.168.0.0/24 -j ACCEPT
# Hier zie je een regel die verkeer naar en van IP 10.0.0.2 poort 80 toelaat op eth2 (de adapter
# waar de DMZ op zit) zolang dit verkeer maar niet van en naar het gewone lokale netwerk gaat.
iptables -A FORWARD -i eth0 -o eth2 -p tcp –dport 80 -d 10.0.0.2 -s ! 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -p tcp –sport 80 -s 10.0.0.2 -d ! 192.168.0.0/24 -j ACCEPT
# En een forwarding rule voor dataverkeer tussen de netwerk adapters.
# Verkeer van en naar IP 10.0.0.2 poort 80 wordt netjes geforward, zolang het maar niets te
# maken heeft met het normale lokale netwerk.
iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to 10.0.0.2
# deze regel zorgt ervoor dat alle data die op poort 80 via adapter eth0 binnen komt doorgegeven zal
# worden naar IP 10.0.0.21.6 De firewall policy
Het is je mischien al opgevallen dat hoewel je firewall regels heb aangemaakt er nog steeds ander verkeer wordt doorgelaten
door de firewall welke niet in deze regels voorkomt. Dit is toe te schrijven aan de policy die de firewall voert.
De policy is de standaard actie die de firewall zal uitvoeren als data verkeer door de firewall heen probeert te komen. Op
veel standaard installaties staat deze policy standaart op ACCEPT. De opties die voor de policy aanwezig zijn zijn ‘ACCEPT’,
‘DENY’ en ‘DROP’.
ACCEPT zal al het verkeerd door laten, inclusief verkeer welke niet vermeld staat in de firewall regels.
DENY zal alleen verkeer doorlaten welke in de firewall regels beschreven staat, doch verkeer welke niet in deze regels staat
zal netjes afgewimpeld worden met een foutmelding.
DROP zal alleen verkeer doorlaten welke in de firewall regels beschreven staat, doch verkeer welke niet in deze regels staat
Zal verdwijnen in een zwart gat, zonder dat de computer waar het verkeer vandaan komt een foutmelding zal krijgen. Iedere
policy heeft een eigen voor- en nadeel, dus je zult moeten bekijken welke policy het beste bij je past.
Als je een policy wilt veranderen voor een chain in een table, dan doe je dit als volgt:
iptables -t nat -P POSTROUTING DROP1.7 Tips voor het gebruik van IPtables
Bij het configureren van IPtables kan men wel eens struikel blokken tegen komen, bij deze een paar tips zodat je daar alvast
voor kunt uitkijken:
1) Sla altijd de huidige firewall regels op voordat je deze gaat veranderen, zodat je altijd nog terug kunt gaan als je een
fout hebt gemaakt. Doe dit door op de commandline in te typen:
iptables-save > file
Het maakt niet uit naar wat voor een file je de regels schrijft, ikzelf gebruik namen als test.txt en current.txt.
Als je deze opgeslagen regels weer wilt gebruiken type je:
iptables-restore < file
2) Doe zoveel mogenlijk op de firewall zelf, het is aardig frustrerend (en soms zelfs lastig als je de firewall hebt opgezet
zonder monitor en keyboard) als je via SSH bent ingelogd en per ongeluk een regel weggooid waardoor je SSH sessie ook
wegvalt.
3) Test altijd je firewall regels, gebruik hiervoor een sniffer en een gratis shell account waarbij je gebruik kunt maken van
telnet. type op de commandline:
telnet IP Poort
Als er een connectie gemaakt kan woorden naar de poort, dan is er ergens wat fout gegaan. Doe dit niet alleen als je met je
firewall hebt opgezet, maar ook als je grote veranderingen hebt aangebracht in je firewall regels. Het kan namelijk zijn dat
de volgorde van de firewall regels zo is veranderd dat er opeens dataverkeer mogelijk is op een poort die je wilt verbieden.
4) Laat een bekende een nmap en/of nessus scan op je IP doen, zodat je een gedetaileerd beeld krijgt van wat er nu wel en
wat er nu niet open staat naar de buitenwereld. Als je niemand kent die dit voor je kan doen, of je wilt niet wachten, zoek
dan een online service op die gebruik maakt van nmap.
5) Denk niet dat je hele netwerk nu zo veilig is als de computers van de NSA. Alhoewel je nu netwerk verkeer beperkt hebt zul
je de applicaties en services die je draait ook goed moeten configureren, en logs files moeten bijhouden van hun
activiteiten. Als een database server bereikbaar is van internet en geen (of een standaard) wachtwoord heeft, dan helpt een
firewall je niet.
6) Zorg dat je een backup/image maakt van de firewall, en dat je deze weer kunt terug zetten vanaf cd of harde schijf (denk
bijvoorbeeld aan ghost). Mocht er iets vreselijk fout gaan tijdens een update, of heb je ergens een configuratie bestand
veranderd welke je niet meer kunt terug vinden, dan heb je altijd nog een werkende versie van je firewall achter de hand.
7) Draai nooit services op een firewall. Iedere service die op je firewall draait is een potentiel probleem op het moment dat
deze applicatie een beveiligings lek heeft. Als iemand via deze service toegang weet te krijgen op je firewall dan heeft deze
toegang tot je hele netwerk. Draai dus nooit services op een firewall.1.8 Nawoord
Alhoewel ik deze text heb geschreven aan de hand van een draaiende firewall, kan het toch voorkomen dat ik slordigheids
fouten heb gemaakt. Verder ben ik geen expert op het gebied van IPtables, dus het is goed mogelijk dat ik wellicht bepaalde
concepten niet goed of onvolledig heb uitgelegt. Mocht je aan- danwel opmerkingen hebben op mijn text dan stel ik het op
prijs als je deze naar mij verstuurd per email, zodat ik eventuele fouten kan verbeteren en/of opmerkingen mee kan nemen in
een volgende versie van deze text. Ik ben te bereiken via het volgende e-mail adres: arn@mostly-harmless.nl
Bij voorbaat dank.Gebruikte bronnen: http://www.siliconvalleyccie.com/linux-hn/iptables-intro.htm






