splitt-it.de

my digital lifestyle

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 um gewisse Netzwerkpakete und somit ggf.  Angreifer abzuweisen. 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:

[cc lang=’text‘ line_numbers=’false‘]touch /usr/local/etc/blacklist.txt
touch /etc/init.d/firewall
chmod u+x /etc/init.d/firewall[/cc]

Das Script firewall ist grundlegend wie folgt aufgebaut:

[cc lang=’text‘ ]#!/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[/cc]

Dabei solltet Ihr besonders die Einstellungen

[cc lang=’text‘ line_numbers=’false‘]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=“ „[/cc]

im Auge halten, denn dort werden die Ports definiert, die offen bleiben.

Bei meinem vServer konnte nur der Befehl

[cc lang=’text‘ line_numbers=’false‘]modprobe ip_conntrack_ftp[/cc]

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:

[cc lang=’text‘ line_numbers=’false‘]/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[/cc]

Das Script muss natürlich automatisch beim Serverstart geladen werden, dafür sind folgende Schritte notwendig:

[cc lang=’text‘ line_numbers=’false‘]cd /etc/init.d
update-rc.d firewall defaults[/cc]

Mit dem folgenden Befehl werden auch neue Regeln aktiviert, bzw. können mit dem Parameter „stop“ oder „start“ die iptables-Einstellungen geleert oder auch geladen werden:
[cc lang=’text‘ line_numbers=’false‘]/etc/init.d/firewall restart[/cc]

Die aktiven Regeln werden mit folgendem Befehl angezeigt, dies ist inbesondere auch bei fail2ban interessant:

[cc lang=’text‘ line_numbers=’false‘]iptables -L -v[/cc]

Auf meinem Server wurden allerdings folgende Fehler beim starten des Scriptes angezeigt:

[cc lang=’text‘ line_numbers=’false‘]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[/cc]

Die Lösung ist denkbar simpel, da das Verzeichnis 2.6.18-028stab079.1 nicht existiert, kann auch keine Datei geschrieben werden:

[cc lang=’text‘ line_numbers=’false‘]cd /lib/modules/
mkdir 2.6.18-028stab079.1
depmod -a[/cc]

Wenn Ihr jetzt das Script mit dem Parameter „restart“ aufruft, dann sollte der Fehler nicht mehr angezeigt werden.

?