Mit iptables werden die Tabellen verwaltet, welche zuständig für die Firewall im Linux-Kernel sind. Mit diesen Tabellen oder Ketten werden bestimmte Regeln und Filter eingestellt. Diese weisen Netzwerkpakete und somit ggf. Angreifer oder Attacken ab. Die iptables-Regeln können schnell recht umfangreich und unübersichtlich werden, deshalb macht es Sinn ein Shell-Script zu schreiben, in dem die Regeln definiert werden. Hier gibt es auch sehr gute Vorlagen. In dieser Dokumentation wird die Beispielkonfiguration von gargi verwendet. Gargi hat ein simples Script entwickelt, womit die Firewall schnell erweitert und unkompliziert neu gestartet werden kann.
Im ersten Schritt sind zwei Dateien zu erstellen, eine Blacklist-Datei, worin je Zeile IP-Adressen hinterlegt werden können, die generell geblockt werden und das firewall-Script, welches auch andere Berechtigungen benötigt, damit dieses ausgeführt werden kann:
touch /usr/local/etc/blacklist.txt touch /etc/init.d/firewall chmod u+x /etc/init.d/firewall
Das Script firewall ist grundlegend wie folgt aufgebaut:
#!/bin/sh # script written by Gargi 2009 http://www.gargi.org #needed modules modprobe ip_conntrack_ftp BLACKLIST=/usr/local/etc/blacklist.txt #trigger for your ports IN_ALLOWED_TCP=“21 22 25 53 80″ OUT_ALLOWED_TCP=“21 22 25 53 80″ IN_ALLOWED_UDP=“53 7878″ OUT_ALLOWED_UDP=“53″ IN_ALLOWED_ICMP=“ “ OUT_ALLOWED_IMCP=“ “ case „$1“ in start) # Stopping IP trap /etc/init.d/fail2ban stop echo „Stopping fail2ban IP trap …“ # Clear iptables iptables -F #Defaults iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # loopback communication iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # persist on connections iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT # Ban blacklisted IPs for x in `grep -v ^# $BLACKLIST | awk ‚{print $1}’`; do echo „Blocking $x…“ iptables -A INPUT -t filter -s $x -j DROP done # TCP rules in for port in $IN_ALLOWED_TCP; do echo „Accepting TCP port $port“ iptables -A INPUT -t filter -p tcp –dport $port -j ACCEPT done # TCP rules out for port in $OUT_ALLOWED_TCP; do echo „Allowing sending over TCP port $port“ iptables -A OUTPUT -t filter -p tcp –dport $port -j ACCEPT done # UDP rules in for port in $IN_ALLOWED_UDP; do echo „Accepting UDP port $port“ iptables -A INPUT -t filter -p udp –dport $port -j ACCEPT done # UDP rules out for port in $OUT_ALLOWED_UDP; do echo „Allowing sending over UDP port $port“ iptables -A OUTPUT -t filter -p udp –dport $port -j ACCEPT done # ICMP rules in for port in $IN_ALLOWED_ICMP; do echo „Accepting ICMP port $port“ iptables -A INPUT -t filter -p icmp –dport $port -j ACCEPT done # ICMP rules out for port in $OUT_ALLOWED_ICMP; do echo „Allowing sending over ICMP port $port“ iptables -A OUTPUT -t filter -p icmp –dport $port -j ACCEPT done # Dropping startup requests iptables -A INPUT -t filter -p tcp –syn -j DROP # Restarting IP trap /etc/init.d/fail2ban start echo „Fire up IP trap again …“ ;; stop) /etc/init.d/fail2ban stop iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT echo „Warning! Firewall is stopped, server is unprotected now!“ ;; restart) $0 stop sleep 1 $0 start ;; *) echo „Usage $0 {start|stop|restart}“ ;; esac
Dabei solltet Ihr besonders die Einstellungen
]IN_ALLOWED_TCP="21 22 25 53 80" OUT_ALLOWED_TCP="21 22 25 53 80" IN_ALLOWED_UDP="53 7878" OUT_ALLOWED_UDP="53" IN_ALLOWED_ICMP="" OUT_ALLOWED_IMCP=""
im Auge halten, denn dort werden die Ports definiert, die offen bleiben.
Bei meinem vServer konnte nur der Befehl
modprobe ip_conntrack_ftp
nicht ausgeführt werden, da das Modul nicht vorhanden ist. In diesem Fall sollte der Aufruf auskommentiert werden.
Weiterhin ist hier ein fail2ban-Script aktiv, welches Ihr ja nicht zwingend aktiv haben müsst. Die Dokumentation habe ich auch noch nicht komplett abgeschlossen an dieser Stelle. Wenn Ihr fail2ban nicht nutzt, dann solltest Ihr die folgenden Zeilen auskommentieren:
/etc/init.d/fail2ban stop echo „Stopping fail2ban IP trap …“ /etc/init.d/fail2ban start echo „Fire up IP trap again …“ /etc/init.d/fail2ban stop
Das Script muss natürlich automatisch beim Serverstart geladen werden, dafür sind folgende Schritte notwendig:
cd /etc/init.d update-rc.d firewall defaults
Mit dem folgenden Befehl wird der Dienst neu gestartet, neue Regeln aktiviert, bzw. können mit dem Parameter „stop“ oder „start“ die iptables-Einstellungen geleert oder auch geladen werden:
/etc/init.d/firewall restart
Die aktiven Regeln werden mit folgendem Befehl angezeigt, dies ist inbesondere auch bei fail2ban interessant:
iptables -L -v
Auf meinem Server wurden allerdings folgende Fehler beim starten des Scriptes angezeigt:
WARNING: Couldn’t open directory /lib/modules/2.6.18-028stab079.1: No such file or directory FATAL: Could not open /lib/modules/2.6.18-028stab079.1/modules.dep.temp for writing: No such file or directory
Die Lösung ist denkbar simpel, da das Verzeichnis 2.6.18-028stab079.1 nicht existiert, kann auch keine Datei geschrieben werden:
cd /lib/modules/ mkdir 2.6.18-028stab079.1 depmod -a
Wenn Ihr jetzt das Script mit dem Parameter „restart“ aufruft, dann sollte der Fehler nicht mehr angezeigt werden.