Beiträge zu “iptables”
Firewall ausgehend einschränken
Bisher habe ich die Firewall regeln auf meinen Servern so eingerichtet das nur Dienste geschützt worden sind die auch laufen. Jetzt wollte ich das dahingehend umstellen das nur noch erlaubte Dienste etwas dürfen und das auch für den ausgehenden Verkehr.
ACHTUNG: Dies sind meine Notizen und kein Lehrbuch. Use at your own risk.
Basis war vor allem dieses Dokument.
So, erst einmal sehen was schon da ist
sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- mail.hagen-bauer.de anywhere tcp dpt:smtp
2 ACCEPT tcp -- mail.1bis3.de anywhere tcp dpt:smtp
3 ACCEPT tcp -- localhost.localdomain anywhere tcp dpt:smtp
4 DROP tcp -- anywhere anywhere tcp dpt:smtp
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Jetzt wollte ich
- Antworten auf eigene Anfagen
- ssh Verbindung
- internen Verkehr auf localhost
erlauben.
Die alte Regel 4 wird durch einen generellen Drop ersetzt
sudo iptables -D INPUT 4
sudo iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 3005 -j ACCEPT
sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -A INPUT -j DROP
Ausgehend darf nur noch
- Mail zu meinem Mailserver
- interner Verkehr auf localhost
- DNS Abfragen
- Antworten auf eingegangene Anfragen
passieren
sudo iptables -I OUTPUT -d mail.hagen-bauer.de -p tcp --dport 25 -j ACCEPT
sudo iptables -I OUTPUT -d mail.1bis3.de -p tcp --dport 25 -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
sudo iptables -I OUTPUT -p udp --sport 1024:65535 --dport 67 -j ACCEPT
sudo iptables -A OUTPUT -j DROP
Weitergeleitet wird garnichts
iptables -P FORWARD DROP
Bisher kann ich keine Probleme feststellen
Regel für die Firewall iptables dauerhaft einrichten
Wenn man Regeln für iptabels wie hier einstellt dann bleiben die im Normalfall nicht erhalten wenn das Betriebssystem neu gestartet wird.
Mit folgenden einfachen Schritten kann man dies erreichen
iptables -A INPUT ! -s 127.0.0.0/8 -p tcp --dport 8080 -j DROP
iptables-save > /etc/iptables.up.rules
vi /etc/network/if-pre-up.d/iptables
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
chmod +x /etc/network/if-pre-up.d/iptables
Rebooten und noch mal prüfen
iptables: alle bis auf localhost
Wenn man nur den Zugriff "auf sich selbst" erlauben möchte. Kann man gut gebrauchen wenn man mittel ssh portforwarding auf einen Server zugreifen möchte
iptables -A INPUT ! -s 127.0.0.0/8 -p tcp --dport 8080 -j DROP iptables -A INPUT ! -s 127.0.0.0/8 -p tcp --dport 8443 -j DROP
Debian: Offene Ports testen
Ich wollte testen ob die Firewall richtig arbeitet und war auf der Suche nach einem einfachen Program das auf dem entsprechenden Port "hört". Hier habe ich das gefunden.
vi test.pl #!/usr/bin/perl ##### Written by Paul A. Luzzi on 07/01/2008 ##### Name : perl_socket_8151.pl ##### Purpose : a basic perl socket listener ##### used to check that firewall ports are ##### open before installation of software use strict; use Socket; ##### Use port of 8151 my $port = shift || 8151; my $proto = getprotobyname('tcp'); socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "Can not open socket $!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can not set socket optoin to SO_REUSEADDR $!\n"; bind( SOCKET, pack('SnA4x8', AF_INET, $port, 0.0.0.0)) or die "Can not bind to port $port! \n"; listen (SOCKET, 5) or die "listen: $!"; print "SERVER started on port $port \n"; my $client_addr; while ($client_addr = accept(NET_SOCKET, SOCKET)) { # send them a message, close connection print NEW_SOCKET "Smile from the server :-) "; close NEW_SOCKET; }
und ausführbar machen, aufrufen und von einem anderen Rechner aus mit Telnet ansprechen.
chmod +x test.pl perl test.pl SERVER started on port 8151
telnet www.hagen-bauer.de 8151 Trying 5.9.149.232... Connected to www.hagen-bauer.de. Escape character is '^]'.
Die Verbindung hat also geklappt. Dann den Port in dem Script ändern und nochmal aufrufen
perl test.pl SERVER started on port 8080 telnet www.hagen-bauer.de 8080
Trying 5.9.149.232...
^C
Debian: blockieren eines Ports mittels iptables
Die Notizen lehnen sich an dieses Wiki an. Zuerst den gewünschten Port per Befehl blockieren. In diesem Fall 8080
/sbin/iptables -A INPUT -p tcp --destination-port 8080 -j DROP
Nun sehen wir mal wie das Ergebnis ist:
iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:http-alt
Diese Änderungen werden jetzt in einer iptables Konfigurationsdatei festgehalten damit wir die später beim neustarten automatisch restaurieren können.
iptables-save > /etc/iptables.up.rules
Diese Datei restauriert dann die Einstellungen beim Neustart:
vi /etc/network/if-pre-up.d/iptables #!/bin/bash /sbin/iptables-restore < /etc/iptables.up.rules
Und jetzt noch die Datei ausführbar machen
chmod +x /etc/network/if-pre-up.d/iptables
und neustarten.