Tips en Trucs 2013

iptables: voorbeelden en tips

De standaard firewall in Linux houdt uw computer veilig en wordt beheerd met de opdracht iptables. Hou rekening dat elke distributie met een veilige firewall is uitgerust. De meeste distributies gebruiken een eigen programma om de firewall in te stellen (bij openSUSE is dit YaST). Deze programma's zorgen bij het opstarten van het systeem voor het opzetten van de firewall. De hier beschreven opdrachten manipuleren de firewall op elke distributie, maar bij het herstarten van het systeem neemt de distributie afhankelijke firewall terug de touwtjes in handen. Dit is handig bij het aanleren van hoe je de firewall kunt instellen. Maar als je iptables in de praktijk wilt gebruiken, moet je dus zelf een opstartscript samenstellen die bij elke systeemstart de firewall configureert. En vanzelfsprekend schakel je de firewall van de distributie uit (twee firewall configuraties is van het goede teveel). Zorg dat je de materie onder de knie hebt, voor je eigen geconfigureerde firewalls gebruikt, de veiligheid van uw systeem kan erdoor in het gedrang komen.

De voorbeelden gebruiken sudo om de opdracht iptables als root uit te voeren. Eenvoudiger is misschien het gebruik van su, waardoor je alle volgende opdrachten automatisch als root uitvoert. In dit geval moet je het pad /usr/sbin/ niet meegeven. Bij het gebruik van sudo in andere distributies dan openSUSE kan het pad afwijken (voorbeeld: /sbin/).

Basisopdrachten

Overzicht weergeven

sudo /usr/sbin/iptables -L

Toont de standaard tabel Filter. De opdracht iptables -L -vn toont meer informatie en geeft de poorten als getallen weer en niet als namen.

Overzicht van een specifieke tabel

sudo /usr/sbin/iptables -L -t nat

Toont de tabel nat (naast de tabellen filter en nat bestaan de tabellen mangle, raw en security). Lees voor meer informatie de sectie TABLES op de man pagina van iptables.

Alle firewall regels wissen.

sudo /usr/sbin/iptables -F

Een specifieke tabel wissen

sudo /usr/sbin/iptables -t nat -F

Chain beleid instellen

Met iptables kan je aan een chain en de filter tabel een standaard beleid toekennen, waarbij de meest gebruikte chains INPUT, FORWARD en OUTPUT zijn. Je kunt zelfs eigen chains aanmaken. Onderstaande afbeelding van Wikipedia maakt dit duidelijk.
Packet flow in Netfilter and General Networking

sudo /usr/sbin/iptables -P INPUT DROP
sudo /usr/sbin/iptables -P FORWARD ACCEPT
sudo /usr/sbin/iptables -P OUTPUT DROP

Je kunt kiezen voor het standaard beleid ACCEPT en daarna specifiek verkeer weigeren, of voor DROP en specifiek verkeer naar en van uw systeem toelaten. De laatste optie is veiliger, maar vraagt meer werk.

IP verkeer van een bepaald IP of netwerk blokkeren

Blokkeren vanaf een IP

sudo /usr/sbin/iptables -A INPUT -s 11.22.33.44 -j DROP

Alleen blokkeren op een specifieke netwerkverbinding (NIC).

sudo /usr/sbin/iptables -A INPUT -s 11.22.33.44 -i eth0 -j DROP

Of een specifiek poort.

sudo /usr/sbin/iptables -A INPUT -s 11.22.33.44 -p tcp --dport 22 -j DROP

Een volledig netwerk blokkeren.

sudo /usr/sbin/iptables -A INPUT -s 11.22.33.0/24 -j DROP

Het verkeer vanaf een bepaald MAC adres blokkeren

Om het verkeer vanaf een bepaald toestel te blokkeren, maak je gebruik van zijn specifieke MAC adres. Dit is handig bij het gebruik van een DHCP server die steeds andere IP adressen aan een toestel geeft.

sudo /usr/sbin/iptables -A INPUT -m mac --mac-source 00:11:2f:8f:f8:f8 -j DROP

Een bepaalde poort blokkeren

Je kunt zowel inkomend als uitgaand verkeer blokkeren. Om poort 21 te blokkeren voor inkomend verkeer:

sudo /usr/sbin/iptables -A INPUT -p tcp --destination-port 21 -j DROP

Bij het gebruik van een server met twee netwerkverbindingen, de ene verbonden met het internet, de andere met het lokale netwerk wil je FTP toegang enkel vanuit de buitenwereld blokkeren.

sudo /usr/sbin/iptables -A INPUT -i eth1 -p tcp --destination-port 21 -j DROP

Waarbij eth1 verbonden is met het internet.

Een poort van een specifiek IP adres blokkeren.

sudo /usr/sbin/iptables -A INPUT -p tcp -s 22.33.44.55 --destination-port 21 -j DROP

Of een poort blokkeren uitgezonderd vanaf een bepaald IP adres.

sudo /usr/sbin/iptables -A INPUT p tcp ! -s 22.33.44.0/24 --destination-port 21 -j DROP

Om alle naar poort 25 uitgaande verkeer te blokkeren (handig om virussen te verhinderen om e-mails te versturen).

sudo /usr/sbin/iptables -A FORWARD -p tcp --dport 25 -j DROP

FORWARD (doorgaand verkeer) wordt hier geblokkeerd omdat het betreffende systeem als firewall wordt gebruikt. Gebruik OUTPUT om verkeer vanuit het systeem zelf te blokkeren.

Verkeer optekenen voor de actie

Soms wil je het verkeer voor het blokkeren in het logboek noteren voor verder onderzoek. Er is met de werknemers afgesproken om niet op een bepaalde server in te loggen en je wilt je ervan vergewissen dat iedereen zich aan de regels houdt. Je blokkeert daarbij de toegang tot de ssh poort, maar je wilt toch weten wie het probeerde.

sudo /usr/sbin/iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "toegang tot poort 22 geblokkeerd"
sudo /usr/sbin/iptables -A INPUT -p tcp --dport 22 -j DROP

In het logboek zie je dan de mislukte poging en vanaf welk IP adres.

Tips en trucs

Omdat iptables de regels in volgorde afwerkt, moet je bij aanpassingen soms een regel op een bepaalde positie tussenvoegen.

Overzicht met regelnummers weergeven

sudo /usr/sbin/iptables -L --line-numbers

Specifieke chains weergeven

sudo /usr/sbin/iptables -L INPUT --line-numbers

Toont een genummerd overzicht van alle regels voor inkomend verkeer.

sudo /usr/sbin/iptables -L FORWARD --line-numbers

Voor alle doorgaand verkeer.

Regels tussenvoegen

sudo /usr/sbin/iptables -I INPUT 3 -s 10.0.0.0/8 -j ACCEPT

Voegt op positie 3 een regel toe.

Regels verwijderen

sudo /usr/sbin/iptables -D INPUT 3

Zal de hierboven tussengevoegde regel verwijderen. Je kunt ook overeenkomende regels verwijderen.

sudo /usr/sbin/iptables -D INPUT -s 10.0.0.0/8 -j ACCEPT

Alle regels en chains wissen

Deze regels zijn handig als je wilt starten vanaf nul met enkel standaard tabellen.

sudo /usr/sbin/iptables --flush
sudo /usr/sbin/iptables --table nat --flush
sudo /usr/sbin/iptables --table mangle --flush
sudo /usr/sbin/iptables --delete-chain
sudo /usr/sbin/iptables --table nat --delete-chain
sudo /usr/sbin/iptables --table mangle --delete-chain

Let op: voer dit niet uit via een SSH verbinding, of je sluit jezelf buiten.

Eenvoudige scripts voor specifieke toepassingen

Brute force aanvallen verhinderen

Een voorbeeld: we laten drie pogingen om via SSH in te loggen toe, daarna wordt het IP adres 15 minuten geblokkeerd. Zo kan een reguliere gebruiker inloggen, maar zullen bots dit niet kunnen. Gebruik steeds sterke wachtwoorden.

sudo /usr/sbin/iptables -F
sudo /usr/sbin/iptables -A INPUT -i lo -p all -j ACCEPT
sudo /usr/sbin/iptables -A OUTPUT -o lo -p all -j ACCEPT
sudo /usr/sbin/iptables -A INPUT -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo /usr/sbin/iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo /usr/sbin/iptables -A INPUT -p tcp --dport www -j ACCEPT
sudo /usr/sbin/iptables -I INPUT -p tcp --dport 22 -i eth0 -m conntrack --ctstate NEW -m recent --set
sudo /usr/sbin/iptables -I INPUT -p tcp --dport 22 -i eth0 -m conntrack --ctstate NEW -m recent --update --seconds 900 --hitcount 3 -j DROP
sudo /usr/sbin/iptables -P INPUT DROP

NAT met iptables

Om een Linux systeem als router in te zetten, heb je NAT nodig waarmee je het publieke IP adres deelt met het private netwerk achter de router. Handig daarbij is de DHCP server op dezelfde server te installeren. Om een NAT router te configureren, gebruik je best een server met twee netwerkverbindingen. We gaan uit van:

We configureren NAT om het verkeer van 10.1.1.0 door te geven aan eth0. Je kunt daarbij zoals hierboven starten met een lege tabel.

sudo /usr/sbin/iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
sudo /usr/sbin/iptables --append FORWARD --in-interface eth1 -j ACCEPT

Klaar, je moet enkel in de kernel het doorsturen nog inschakelen.

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"