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/).
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.
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.
sudo /usr/sbin/iptables -F
sudo /usr/sbin/iptables -t nat -F
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.
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.
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
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
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.
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.
Omdat iptables de regels in volgorde afwerkt, moet je bij aanpassingen soms een regel op een bepaalde positie tussenvoegen.
sudo /usr/sbin/iptables -L --line-numbers
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.
sudo /usr/sbin/iptables -I INPUT 3 -s 10.0.0.0/8 -j ACCEPT
Voegt op positie 3 een regel toe.
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
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.
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
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"