#!/bin/sh
#Packetfilter für Linux
#Script geschrieben von Markus Ungermann <m.ungermann@tuxhausen.de>
#
#Diese Script ist nur ein Beispiel zum Aufbau eines Packetfilters unter
#Linux 2.2. Es ist ein "statisches Script", d.h. es aendert sich nicht, es
#beruecksichtigt keine dynamischen IP-Adressen
#
#Dieses Script beinhaltet keine Garantie auf irgendwas !!
#Jeder Benutzer dieses Scriptes sollte es auf die eigenen Verhaeltnisse
#anpassen !!
#
#Version 1.2
################# Einstellungen #############################
#Name der Firewall
FWNAME=server.tuxhausen.de
#Adressraum im LAN
LAN=192.168.44.0/24
#Die Netzwerkarte
DEV_LAN=eth0
#IP-Adresse des LAN-Servers (wird momanten nicht benutzt)
IP_SERVER=192.168.44.10
#Internetadressen
GLOBAL=0/0
#Internet-Device
DEV_INET=ippp0
#Benutze Programme und deren Verzeichnis
IPCHAINS=/sbin/ipchains
#In diesem Verzeichnis steht das Script
SCRIPT_PATH=/root/bin/
###############################################################
FW_SCRIPT=$SCRIPT_PATH/firewall
case $1 in
start) #Firewall stoppen und alle Regeln starten
$FW_SCRIPT start_lan
$FW_SCRIPT start_inet
;;
start_lan) #Starten der Regeln für das LAN
#Die Hauptregeln -> Zuerst mal ALLES sperren
$IPCHAINS --policy input REJECT
$IPCHAINS -P output REJECT
$IPCHAINS -P forward REJECT
#Das localhost Device nicht filtern
$IPCHAINS -A input -i lo -j ACCEPT
$IPCHAINS -A output -i lo -j ACCEPT
#------------------ Sperr-Regeln-------------------------------
$IPCHAINS -N sperr
$IPCHAINS -A input -j sperr
#Diese Dienste IMMER verbieten
$IPCHAINS -A sperr -d $GLOBAL 23 -p tcp -j REJECT #telnet
$IPCHAINS -A sperr -d $GLOBAL 79 -p tcp -j REJECT #finger
$IPCHAINS -A sperr -d $GLOBAL 11 -p tcp -j REJECT #sysstat
$IPCHAINS -A sperr -d $GLOBAL 15 -p tcp -j REJECT #netstat
#Anti-IP-Spoofing -> Diese Adresse dürfen nicht da sein
$IPCHAINS -A sperr -s 127.0.0.0/8 ! -i lo -j REJECT
$IPCHAINS -A sperr -s 10.0.0.0/8 -j REJECT
$IPCHAINS -A sperr -s 172.16.0.0/12 -j REJECT
$IPCHAINS -A sperr -s 192.168.0.0/16 ! -i $DEV_LAN -j REJECT
echo "Firewall: Sperr-Regeln auf $FWNAME gestartet"
#---------------------Regeln für ICMP Packete-------------------
#Technik: Nur festgelegte ICMPs freigeben
#Neue Chain erzeugen für INPUT
$IPCHAINS -N icmp
$IPCHAINS -A input -p icmp -j icmp
$IPCHAINS -A output -p icmp -j icmp
#Die ICMP-Regeln
$IPCHAINS -A icmp -p icmp --icmp-type echo-reply -j ACCEPT
$IPCHAINS -A icmp -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPCHAINS -A icmp -p icmp --icmp-type source-quench -j ACCEPT
$IPCHAINS -A icmp -p icmp --icmp-type echo-request -j ACCEPT
$IPCHAINS -A icmp -p icmp --icmp-type time-exceeded -j ACCEPT
echo "Firewall: ICMP-Regeln auf $FWNAME gestartet"
#-------------------- Regeln fürs LAN ---------------------------
#Neue Chain erzeugen für INPUT und OUTPUT
$IPCHAINS -N lnet
$IPCHAINS -A input -j lnet
$IPCHAINS -A output -j lnet
#DHCP-Server freigeben
$IPCHAINS -A lnet -s $GLOBAL 67:68 -d $GLOBAL 67:68 -p tcp -j ACCEPT
#Alles andere ist im LAN erlaubt
$IPCHAINS -A lnet -s $LAN -d $LAN -i $DEV_LAN -j ACCEPT
echo "Firewall: LAN-Regeln auf $FWNAME gestartet"
;;
start_inet) #Starten der Regeln für das Internet
#--------------------Regeln fürs INTERNET---------------------
#Packete die nicht im LAN liegen werden maskiert ueber DEV_INET
#gesendet
#IP Forward und aktivieren
echo 1 > /proc/sys/net/ipv4/ip_forward
#Alle nicht lokalen Ziele ueber DEV_INET maskieren
$IPCHAINS -A forward -j MASQ -i $DEV_INET
#Diverse Module fuer Masquerading laden
#Die Module muessen beim Kernel kompilieren erzeugt werden
#und ICMP masquerading micht vergessen (kein Modul)
modprobe ip_masq_ftp
modprobe ip_masq_irc
modprobe ip_masq_raudio
#--------------- Regelliste ----------------------
#Neue Chain erzeugen für INPUT und OUPUT
$IPCHAINS -N inet_in
$IPCHAINS -N inet_out
$IPCHAINS -A input -j inet_in
$IPCHAINS -A output -j inet_out
#Ports fuer Internet sperren
#NetBios
$IPCHAINS -A inet_in -s $GLOBAL -d $GLOBAL 137:139 -p tcp -j REJECT
$IPCHAINS -A inet_in -s $GLOBAL -d $GLOBAL 137:139 -p udp -j REJECT
#X
$IPCHAINS -A inet_in -s $GLOBAL -d $GLOBAL 6000:6010 -p tcp -j REJECT
#SWAT (mein Port)
$IPCHAINS -A inet_in -s $GLOBAL -d $GLOBAL 4444 -p tcp -j REJECT
#Squid
$IPCHAINS -A inet_in -s $GLOBAL -d $GLOBAL 3128 -p tcp -j REJECT
#NFS
$IPCHAINS -A inet_in -s $GLOBAL -d $GLOBAL 2049 -p tcp -j REJECT
#WWW-Dienste | Port 80 | TCP
#LAN -> Internet
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL www -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL www -p tcp -j ACCEPT
#Internet -> LAN
$IPCHAINS -A inet_in -s $GLOBAL www -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL www -d $LAN 1024: -p tcp -j ACCEPT
#Verchlüsselte WWW-Dienste (SSL) | Port 443 | TCP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL 443 -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL 443 -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL 443 -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL 443 -d $LAN 1024: -p tcp -j ACCEPT
#Domain-Name-Server-Dienste (Namensauflösung) | Port 53 | TCP & UDP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL domain -p udp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL domain -p udp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL domain -d $GLOBAL 1024: -p udp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL domain -d $LAN 1024: -p udp -j ACCEPT
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL domain -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL domain -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL domain -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL domain -d $LAN 1024: -p tcp -j ACCEPT
#POP3 (Emails holen) | Port 110 | TCP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL pop3 -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL pop3 -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL pop3 -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL pop3 -d $LAN 1024: -p tcp -j ACCEPT
#Verschlüsselte POP3 | Port 995 | TCP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL 995 -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL 995 -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL 995 -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL 995 -d $LAN 1024: -p tcp -j ACCEPT
#SMTP | Port 25 | TCP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL 25 -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL 25 -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL 25 -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL 25 -d $LAN 1024: -p tcp -j ACCEPT
#NNTP News-Groups | Port 119 | TCP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL 119 -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL 119 -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL 119 -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL 119 -d $LAN 1024: -p tcp -j ACCEPT
#IRC | Port 6666-6667 | TCP
$IPCHAINS -A inet_in -s $LAN 1024: -d $GLOBAL 6666:6667 -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL 6666:6667 -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL 6666:6667 -d $GLOBAL 1024: -p tcp -j ACCEPT ! -y
$IPCHAINS -A inet_out -s $GLOBAL 6666:6667 -d $LAN 1024: -p tcp -j ACCEPT
#FTP | Port 20-21, >1024 | TCP
#Für passives FTP muessen alle Port über 1024 geoeffnet werden. Also
#nur aktivieren, wenn wirklich FTP gebraucht wird
$IPCHAINS -A inet_in -s $GLOBAL 1024: -d $GLOBAL 1024: -p tcp -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -d $GLOBAL 1024: -p tcp -j ACCEPT
$IPCHAINS -A inet_in -s $LAN 1024: -p tcp -d $GLOBAL 20:21 -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 1024: -p tcp -d $GLOBAL 20:21 -j ACCEPT
$IPCHAINS -A inet_in -s $GLOBAL 20:21 -p tcp -d $GLOBAL 1024: -j ACCEPT
$IPCHAINS -A inet_out -s $GLOBAL 20:21 -p tcp -d $LAN 1024: -j ACCEPT
#Alles was jetzt noch uebrig bleibt, wird gesperrt und mitgeschrieben
$IPCHAINS -A input -l -j REJECT
$IPCHAINS -A forward -l -j REJECT
$IPCHAINS -A output -l -j REJECT
echo "Firewall: Internet-Regeln auf $FWNAME gestartet"
;;
stop_inet) #Internet Regeln stoppen und dann LAN-Regeln starten
$FW_SCRIPT stop
$FW_SCRIPT start_lan
;;
stop) #Stoppt die Firewall und oeffnet alle Ports GEFAEHRLICH!!!!
#aber manchmal noetig
#Alle Chains loeschen
$IPCHAINS -F
$IPCHAINS -X
#Die Hauptregeln -> ALLES oeffnen
$IPCHAINS -P input ACCEPT
$IPCHAINS -P output ACCEPT
$IPCHAINS -P forward ACCEPT
echo "Firewall: Firewall angehalten!!
WARNUNG !!!!!!!!
KEINERLEI SICHERHEIT !!!!!!!!!!"
;;
not) #Notfall Regeln alles sperren
#Alle Chains loeschen
$IPCHAINS -F
$IPCHAINS -X
#Die Hauptregeln -> ALLES sperren
$IPCHAINS -P input REJECT
$IPCHAINS -P output REJECT
$IPCHAINS -P forward REJECT
echo "Firewall: Notfall-Betrieb = ALLES GESPERRT"
;;
status) #Aktuelle Regeln ansehen
$IPCHAINS -L -n -v | less -S -q
;;
*)
echo "gebrauch : $0 option
option:
start startet alle Regeln
start_lan startet die LAN - Regeln
start_inet startet die Internet - Regeln
stop stoppt Firewall !!GEFAEHRLICH!!
stop_inet stoppt die Internet - Regeln
not ALLES sperren !!NOTFALL!!
status aktuelle Regeln ansehen
Script geschrieben von: M. Ungermann <m.ungermann@tuxhausen.de>"
;;
esac
|