Firewall unter Linux auch bekannt unter IPtables

Eins vorne vor weg. Eine Softwarefirewall kann immer nur dazu genutzt werden kleineren Dreck zu filtern. Wenn euch jemand mit ausreichender Bandbreite zubombt kann nur eine vorgeschaltetet Hardwarefirewall helfen.

Oft werden Angriffe von Menschen geführt, die ein Programm runtergeladen haben und sich nun als mächtiger Hacker fühlen. Eine solche Attacke, die auch gerne mal auf Gameserver mit upd Shortpackages, oder eines RCON Floods geführt wird, kann man im Regelfall mit den IPtables herausfiltern.

Wenn ihr sie beim Kernelbacken nicht entfernt habt, sollten die iptables fester Bestandteil des Kernels sein. Zum verwalten der Regeln wird oft noch ein zusätzliches Programm/Packet gebraucht. Bei Debian nennt es sich "iptables" und kann mittels apt-get install iptables installiert werden.

Jetzt hat man zwar eine Firewall installiert, sie filtert aber (noch) nichts. Dies liegt daran, dass man ihr erst beibringen muss, was sie durchlassen darf und was nicht. Die normale Vorgehensweise ist dabei, im ersten Schritt alles zu blocken und im zweiten dann Außnahmen zu erstellen. Wer das nicht machen will, der kann Generatoren wie diesen benutzen: http://harry.homelinux.org

Hat man sich mittels dieses Generators eine Basis geschaffen, kann man an das Finetuning gehen und die einzelnen Gameserver zusätzlich eintragen. Ich habe mir auf der oben verlinkten Seite Regeln erstellen lassen und diese dann erweitert. Bevor ihr es in die /etc/init.d, wie im Kommentar des Skripts erklärt, eintragt, testet, ob ihr euch damit nicht selber aussperrt, indem ihr ein kleines Bashscript anlegt:

#!/bin/bash

./firewall start && sleep 60 && ./firewall stop

Startet man dieses Script dann mit screen -dmS ./teststarter entfernt es die Firewallregeln nach einer Minute von selber. Im schlimmsten Fall könnt ihr dann eine Minute nicht auf den Server zugreifen. Noch besser ist es, zu Hause in einer lokalen Umgebung zu testen.

Falls ihr euch doch ausgesperrt haben solltet, reicht ein Reboot aus und die Regeln sind inaktiv. Erst, wenn ihr das Skript in die init.d eintragt, werden die Regeln auch beim Reboot automatisch geladen.

#!/bin/bash
# ---------------------------------------------------------------------
# Linux-iptables-Firewallskript, Copyright (c) 2010 under the GPL
# Autogenerated by iptables Generator v1.22 (c) 2002-2010 by Harald Bertram
# Please visit http://harry.homelinux.org for new versions of
# the iptables Generator (c).
#
#
# If you have questions about the iptables Generator or about
# your Firewall-Skript feel free to take a look at out website or
# send me an E-Mail to [email protected]
#
# My special thanks are going to Lutz Heinrich (trinitywork at hotmail dot com)
# who made lots of Beta-Testing and gave me lots of well qualified
# Feedback that made me able to improve the iptables Generator.
# --------------------------------------------------------------------
# Besondere Hinweise fuer Nutzer einer Debian-Distribution oder eines Debian-Derivates (Ubuntu, Knoppix, Kanotix, ...)!
# Fuehren Sie die folgenden Kommandos aus, nachdem das Skript  "firewall" nach /etc/init.d kopiert wurde:
# chmod 755 /etc/init.d/firewall
# update-rc.d firewall defaults
# /etc/init.d/firewall start
# --------------------------------------------------------------------

case "$1" in
 start)
 echo "Starte IP-Paketfilter"

 # iptables-Modul
 modprobe ip_tables
 # Connection-Tracking-Module
 modprobe ip_conntrack
 # Das Modul ip_conntrack_irc ist erst bei Kerneln >= 2.4.19 verfuegbar
 modprobe ip_conntrack_irc
 modprobe ip_conntrack_ftp

 # Tabelle flushen
 iptables -F
 iptables -t nat -F
 iptables -t mangle -F
 iptables -X
 iptables -t nat -X
 iptables -t mangle -X

 # Default-Policies setzen
 iptables -P INPUT DROP
 iptables -P OUTPUT DROP
 iptables -P FORWARD DROP

 # MY_REJECT-Chain
 iptables -N MY_REJECT

 # MY_REJECT fuellen
 iptables -A MY_REJECT -p tcp -j REJECT --reject-with tcp-reset
 iptables -A MY_REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
 iptables -A MY_REJECT -p icmp -j DROP
 iptables -A MY_REJECT -j REJECT --reject-with icmp-proto-unreachable

 # MY_DROP-Chain
 iptables -N MY_DROP
 iptables -A MY_DROP -j DROP

 # Reject packets from RFC1918 class networks (i.e., spoofed)
 iptables -A INPUT -s 10.0.0.0/8     -j DROP
 iptables -A INPUT -s 169.254.0.0/16 -j DROP
 iptables -A INPUT -s 172.16.0.0/12  -j DROP
 iptables -A INPUT -s 127.0.0.0/8    -j DROP
 iptables -A INPUT -s 224.0.0.0/4      -j DROP
 iptables -A INPUT -d 224.0.0.0/4      -j DROP
 iptables -A INPUT -s 240.0.0.0/5      -j DROP
 iptables -A INPUT -d 240.0.0.0/5      -j DROP
 iptables -A INPUT -s 0.0.0.0/8        -j DROP
 iptables -A INPUT -d 0.0.0.0/8        -j DROP
 iptables -A INPUT -d 239.255.255.0/24 -j DROP
 iptables -A INPUT -d 255.255.255.255  -j DROP

 # Korrupte Pakete zurueckweisen
 iptables -A INPUT -m state --state INVALID -j DROP
 iptables -A OUTPUT -m state --state INVALID -j DROP

 # Stealth Scans etc. DROPpen
 # Keine Flags gesetzt
 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j MY_DROP

 # SYN und FIN gesetzt
 iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP

 # SYN und RST gleichzeitig gesetzt
 iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP

 # FIN und RST gleichzeitig gesetzt
 iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP

 # FIN ohne ACK
 iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP

 # PSH ohne ACK
 iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP

 # URG ohne ACK
 iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j MY_DROP

 # Loopback-Netzwerk-Kommunikation zulassen
 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT

 # Connection-Tracking aktivieren
 iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

 # DNS
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 53 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 53 -j ACCEPT

 # FTP
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 21 -j ACCEPT

 # SSH
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 22 -j ACCEPT

# HALF-LIFE
# Es sind hier Beispielhaft Server auf den Ports 27115,27125,27135,27145 voreingestellt

# HL Shortpackeges Filtern fuer Gold Source Server DDos etc
 iptables -A INPUT -i eth0 -p udp -m multiport -m udp --dports 27115,27125,27135,27145 -m length --length 0 -j DROP
 iptables -A INPUT -i eth0 -p udp -m multiport -m udp --dports 27115,27125,27135,27145 -m length --length 28 -j DROP
 iptables -A INPUT -i eth0 -p udp -m multiport -m udp --dports 27115,27125,27135,27145 -m length --length 39 -j DROP
 iptables -A INPUT -i eth0 -p udp -m multiport -m udp --dports 27115,27125,27135,27145 -m length --length 48 -j DROP
 iptables -A INPUT -i eth0 -p udp -m multiport -m udp --dports 27115,27125,27135,27145 -m length --length 105 -j DROP

 # VAC Friends Autopudate etc
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 6000:6003 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 7001:7002 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 27005 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 27010 -j ACCEPT

 # HALF-LIFE
 iptables -A INPUT -i eth0 -m state --state NEW -p udp -m multiport --dports 27115,27125,27135,27145 -j ACCEPT

 # HALF-LIFE RCON
 iptables -A INPUT -i eth0 -p tcp -m multiport -m tcp --dports 27115,27125,27135,27145 -m hashlimit --hashlimit-upto 2/sec --hashlimit-burst 1 --hashlimit-mode srcip,dstip,dstport --hashlimit-name TF_PACKET_LIMIT -j ACCEPT 

 # Call of Duty Reihe
 iptables -A INPUT -i eth0 -p udp --dport 28960 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p udp --dport 20800 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p udp --dport 20810 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p udp --sport 28960 -j ACCEPT

 # Teamspeak3
 iptables -A INPUT -i eth0 -p udp --dport 9987 -j ACCEPT
 iptables -A INPUT -i eth0 -p tcp --dport 30033 -j ACCEPT
 iptables -A INPUT -i eth0 -p tcp --dport 10011 -j ACCEPT
 iptables -A INPUT -i eth0 -p tcp --dport 2008 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p udp --dport 9987 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p tcp --dport 30033 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p tcp --dport 10011 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p tcp --dport 2008 -j ACCEPT

 # Unreal und Mods wie Killingfloor
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 7707 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 7708 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 7717 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 20560 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 28852 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 8075 -j ACCEPT
 iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 28852 -j ACCEPT

 # Default-Policies mit REJECT
 iptables -A INPUT -j MY_REJECT
 iptables -A OUTPUT -j MY_REJECT

 # Max. 500/Sekunde (5/Jiffie) senden
 echo 5 > /proc/sys/net/ipv4/icmp_ratelimit

 # Speicherallozierung und -timing für IP-De/-Fragmentierung
 echo 262144 > /proc/sys/net/ipv4/ipfrag_high_thresh
 echo 196608 > /proc/sys/net/ipv4/ipfrag_low_thresh
 echo 30 > /proc/sys/net/ipv4/ipfrag_time

 # TCP-FIN-Timeout zum Schutz vor DoS-Attacken setzen
 echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

 # Maximal 3 Antworten auf ein TCP-SYN
 echo 3 > /proc/sys/net/ipv4/tcp_retries1

 # TCP-Pakete maximal 15x wiederholen
 echo 15 > /proc/sys/net/ipv4/tcp_retries2

 ;;

 stop)
 echo "Stoppe IP-Paketfilter"
 # Tabelle flushen
 iptables -F
 iptables -t nat -F
 iptables -t mangle -F
 iptables -X
 iptables -t nat -X
 iptables -t mangle -X
 # Default-Policies setzen
 iptables -P INPUT ACCEPT
 iptables -P OUTPUT ACCEPT
 iptables -P FORWARD ACCEPT
 ;;

 status)
 echo "Tabelle filter"
 iptables -L -vn
 echo "Tabelle nat"
 iptables -t nat -L -vn
 echo "Tabelle mangle"
 iptables -t mangle -L -vn
 ;;

 *)
 echo "Fehlerhafter Aufruf"
 echo "Syntax: $0 {start|stop|status}"
 exit 1
 ;;

esac

Tech Topic(s) des Artikels