Linux Firewall mit ipchains

Anhang: Basis für Firewall-Setup-Skript

Hier finden Sie eine Basis für ein Firewall-Skript ohne vordefinierte Regeln. Diese fügen Sie ab der Zeile "# Eigene Regeln ab hier" ein. Anstatt per Copy & Paste den Code in einen Texteditor zu überführen, können Sie das Basis-Skript auch hier downloaden. Speichern Sie die Datei in /etc/rc.d/init.d/ unter dem Namen firewalling ab und bearbeiten Sie sie dann.

#!/bin/sh
#
# firewalling TCP/IP firewalling + masquerading.
#
# description: This script sets various firewall rules
#
# chkconfig: 2345 98 02
#
# processname: firewallsetup
#
# (P) & (C) 2001 by Peter Bieringer <pb@bieringer.de>
#
# Dieses Skript ist nur ein Demonstrationsbeispiel
# und beim Autor nicht im produktiven Einsatz.
# Eine Weiterentwicklung außer Fehlerbehebung wird es deshalb
# nicht geben.
#
# Achtung: keine Garantie auf Schutzwirkung, deshalb zur Verifizierung
# mit nmap von außerhalb testen!


# ChangeLog:
# hier sollte eine Historie aufgebaut werden,
# damit Änderungen nachvollzogen werden können

# Source function library.
. /etc/rc.d/init.d/functions

# Get config.
. /etc/sysconfig/network

# Check that networking is up.
if [ ${NETWORKING} = "no" ] then
exit 0
fi

[ -x /sbin/ipchains ] || exit 1
[ -x /sbin/sysctl ] || exit 1
RETVAL=0

# Ausführen von ipchains, zeigt die Regel an, falls fehlerhaft
ipchains() {
rule="$*"
#echo "$rule"
/sbin/ipchains $rule

if [ $? -gt 0 ]; then
echo -e "\\a Fehler in Regel: $rule"
fi
}

# See how we were called.
case "$1" in
start)
echo -n $"Starting firewalling: "

# Aktiviere TCP-Syncookies
sysctl -w net.ipv4.tcp_syncookies=1
# Reagiere nicht auf seltsame ICMP-Pakete
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
# Reagiere nicht auf Pings an die Broadcastadresse
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# Setze Limits für die Aussenderate von ICMP-Paketen
# in jiffies (auf Intel 1/100s)
sysctl -w net.ipv4.icmp_destunreach_rate=100
sysctl -w net.ipv4.icmp_echoreply_rate=100
sysctl -w net.ipv4.icmp_paramprob_rate=100
sysctl -w net.ipv4.icmp_timeexceed_rate=100
# Deaktiviere globales IPv4 forwarding
sysctl -w net.ipv4.ip_forward=0

# Checke Portbereich für ausgehende Pakete
portstart="`sysctl net.ipv4.ip_local_port_range | awk '{ print $3 }'`"
portende="`sysctl net.ipv4.ip_local_port_range | awk '{ print $4 }'`"
if [ "$portstart" != "32768" -o "$portende" != "60099" ]; then
echo "Firewalling benötigt eine spezielle Einstellung bzgl. der ip_local_port_range" >/dev/stderr
echo " bitte folgende Zeilen in /etc/sysctl.conf einfügen und rebooten:" >/dev/stderr
echo " # Ändere Portbereich für ausgehende Pakete" >/dev/stderr
echo " net.ipv4.ip_local_port_range = 32768 60099" >/dev/stderr
exit 1
fi

# Defragmentiere immer
sysctl -w net.ipv4.ip_always_defrag=1

# Diverse pro-Interface Schalter im Kernel aktivieren
find /proc/sys/net/ipv4/conf/ -mindepth 1 -maxdepth 1 -type d | awk -F/ '{ print $NF}' | while read interface; do
# Protokolliere Pakete mit unmöglichen IPv4-Adressen
sysctl -w net.ipv4.conf.$interface.log_martians=1
# Nichtakzeptieren von IPv4 source routing
sysctl -w net.ipv4.conf.$interface.accept_source_route=0
# Nichtakzeptieren von ICMP redirects
sysctl -w net.ipv4.conf.$interface.accept_redirects=0
# Stelle Antispoofingfilter auf streng
sysctl -w net.ipv4.conf.$interface.rp_filter=2
# Deaktiviere Weiterleitung von Paketen, die an dieser Schnittstelle eintreffen
sysctl -w net.ipv4.conf.$interface.forwarding=0
done
# Setze Policies
ipchains -P input DENY
ipchains -P forward REJECT
ipchains -P output REJECT

# Loopback-Verkehr erlauben
ipchains -A input -i lo -j ACCEPT
ipchains -A output -i lo -j ACCEPT

# Eigene Regeln ab hier

# Protokolliere Pakete, die das Ende der Liste erreiche
ipchains -A input -j DENY -l
ipchains -A forward -j REJECT -l
ipchains -A output -j REJECT -l
;;
stop)
echo -n $"Stopping firewalling: "

# Schalte Forwarding aus
sysctl -w net.ipv4.ip_forward=0

# Setze Policies
ipchains -P input DENY
ipchains -P forward REJECT
ipchains -P output REJECT
# Lösche alle Regeln in den Standard-Filterlisten
ipchains -F forward
ipchains -F output
ipchains -F input

# Lösche alle Regeln in den benutzerdefinierten Filterlisten
cat /proc/net/ip_fwnames | egrep -v "input|forward|output" | while read list rest; do
ipchains -F $list
done

# Lösche alle benutzedefinierten Filterlisten
cat /proc/net/ip_fwnames | egrep -v "input|forward|output" | while read list rest; do
ipchains -X $list
done

# Entfernen aller Masquerading-Module
lsmod | grep ^ip_masq | awk '{ print $1 }' | while read module; do rmmod $module; done
;;
restart|reload)
$0 stop
$0 start
;;
*)#
echo $"Usage: firewalling {start|stop|restart|reload}"
exit 1
esac

exit $RETVAL