Navigationsleiste   |    Direktzugriff   |    Software   |    Home   

Packet-Filter mit ipchains

Dieser Artikel zeigt ein Beispiel eines Packet-Filters unter Linux mit Hilfe von ipchains. Ab Kernel 2.4 wurde ipchains durch netfilter ersetzt. Deswegen beschreibe ich ipchains in diesem Artikel auch nicht, sondern zeige nur mal ein Beispiel.
Dieser Artikel wendet sich also an Admins die schon wissen wie ipchains prinzipiell funktioniert, allen anderen sollten das ipchains HOWTO lesen.
Eine andere gute deutsche Anleitung findest du auf der Homepage von Berthold Müller

Sinn und Einsatz des Packet-Filters-Scriptes



Hier noch einige URL von denen man seinen Rechner aus dem Internet durchscannen lassen kann, und nur seinen !!.


Das Packetfilter-Script

Dieses Script ist praktisch erprobt, es läuft in ähnlicher Form auf diversen Rechnern, aber bitte umbedingt an die eigenen Bedürfnisse anpassen !!!
Aber nichts ist wohl perfekt (von Laetitia Casta mal abgesehen ;-)), wenn du einen Fehler oder schlimmer ein Loch siehst, melde dich bitte !!

Hier erstmal zum downloaden mit MD5-Checksumme:

7af24edfd9328bc06125a1b3739f5680    packetfilter_tuxhausen.sh.tar.gz

Und nun das Script selber :

#!/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	    

Erstellt: 2001-05-06 Autor: Markus Ungermann (mu@tuxhausen.de)
Letztes Update: 2001-08-26      URL: http://www.tuxhausen.de/software_ipchains.html