#!/bin/sh
#
# firewalling    TCP/IP firewalling + masquerading
#
# Light Edition, German Version for Red Hat Linux 6.2
#
# (P) & (C) 2001 by Dr. Peter Bieringer <pb@bieringer.de>
#
# Version: 2001-04-20
#
# description: This script sets various firewall rules
#
# chkconfig: 2345 98 02
#
# processname: firewalling
#
# Beispielkonfiguration beruht auf folgenden Daten:
#  Interne Schnittstelle:  eth0
#  Interne IPv4-Adresse:   192.168.1.1
#  Internes Netzwerk:      192.168.1.0/24
#
#  Externe Schnittstellen: ppp+, ippp+
#  Externe IPv4-Adresse:   dynamisch zugewiesen
#
# 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, zur Verifizierung mit
#  nmap deshalb von außerhalb testen!

# ChangeLog:
#  20010322: Spin-off von der Extended Edition, keine Verwendung von benutzerdefinierten Listen
#  20010324: Review, Einschränkung der Ports
#  20010325: Final review
#  20010405: Fix ip_local_port_range
#  20010417: Ändere RunLevel-Werte, damit Internetconnectivity vor dem Ausführen
#             des Skripts besteht (wg. DNS-Abfragen), Checke ip_local_port_range
#  20010418: Wrapper für sysctl entfernt
#  20010420: Hinweis für /etc/sysctl.conf war buggy (".." funktioniert nicht)


## Schalter
OPTION_BASIC_ICMP="ja"
OPTION_INTERN_DNS="ja"
#OPTION_FORWARD_DMZ="ja"
OPTION_MASQUERADE="ja"
OPTION_MASQ_FTP="ja"
OPTION_MASQ_FTP_ACTIVE="ja"
OPTION_MASQ_PGP="ja"
OPTION_MASQ_POP="ja"
OPTION_MASQ_SMTP="ja"
OPTION_MASQ_ICMP="ja"
OPTION_BLOCK_TONLINE="ja"
OPTION_WEBPROXY_FTP="ja"
#OPTION_LOG_SYN_NACH_EXTERN="ja"


# 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
#set -x


# 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 firewallsetup: "

		# Setze Standardverhalten der eingebauten Filterlisten
        ipchains -P input DENY
        ipchains -P forward REJECT
        ipchains -P output REJECT
        
        # 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



#		# Broadcast-Pakete vom Logging ausnehmen
#		ipchains -N nobroad
#		ipchains -A nobroad -d 0.0.0.255/0.0.0.255         -j DENY
#		ipchains -A nobroad -d 0.0.255.255/0.0.255.255     -j DENY
#		ipchains -A nobroad -d 0.255.255.255/0.255.255.255 -j DENY

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

        # Eigene Regeln ab hier

		if [ "$OPTION_LOG_SYN_NACH_EXTERN" = "ja" ]; then
			ipchains -A output -i ppp0 -p tcp -y -l
		fi

		# intern -> SSH auf Firewall
		ipchains -A input  -i eth0 -p tcp -s 192.168.1.0/24 512:  -d 192.168.1.1 22           -j ACCEPT
		# intern -> SSH auf Firewall (Antwort)
		ipchains -A output -i eth0 -p tcp -s 192.168.1.1 22       -d 192.168.1.0/24 512: ! -y -j ACCEPT

		# intern -> Webproxy auf Firewall + Antwort
		ipchains -A input  -i eth0 -p tcp -s 192.168.1.0/24 1024: -d 192.168.1.1 3128          -j ACCEPT
		ipchains -A output -i eth0 -p tcp -s 192.168.1.1 3128     -d 192.168.1.0/24 1024: ! -y -j ACCEPT

		# Webproxy -> Internet (Port 80/HTTP) + Antwort
		ipchains -A output -i ppp0 -p tcp --sport 32768:60999 --dport 80               -j ACCEPT
		ipchains -A input  -i ppp0 -p tcp --sport 80          --dport 32768:60999 ! -y -j ACCEPT

		# Webproxy -> Internet (Port 443/HTTPS) + Antwort
		ipchains -A output -i ppp0 -p tcp --sport 32768:60999 --dport 443              -j ACCEPT
		ipchains -A input  -i ppp0 -p tcp --sport 443         --dport 32768:60999 ! -y -j ACCEPT

		if [ "$OPTION_WEBPROXY_FTP" = "ja" ]; then
			# Webproxy -> Internet (FTP:Kommandokanal) + Antwort
			ipchains -A output -i ppp0 -p tcp --sport 32768:60999 --dport 21               -j ACCEPT
			ipchains -A input  -i ppp0 -p tcp --sport 21          --dport 32768:60999 ! -y -j ACCEPT

			# Webproxy -> Internet (FTP: passiver Datentransfer) + Antwort
			ipchains -A output -i ppp0 -p tcp --sport 32768:60999 --dport 1024:            -j ACCEPT
			ipchains -A input  -i ppp0 -p tcp --sport 1024:       --dport 32768:60999 ! -y -j ACCEPT
		fi

		# DNS -> Internet (UDP) + Antwort
		ipchains -A output -i ppp0 -p udp --sport 32768:60999 --dport 53          -j ACCEPT
		ipchains -A input  -i ppp0 -p udp --sport 53          --dport 32768:60999 -j ACCEPT

		# DNS -> Internet (TCP) + Antwort
		ipchains -A output -i ppp0 -p tcp --sport 32768:60999 --dport 53               -j ACCEPT
		ipchains -A input  -i ppp0 -p tcp --sport 53          --dport 32768:60999 ! -y -j ACCEPT

		# Internet -> Firewall: auth/ident-lookup (REJECT)
		ipchains -A input  -i ppp0 -p tcp                --dport 113 -y -j REJECT
		# Firewall -> Internet: port unreachable
		ipchains -A output -i ppp0 -p icmp --icmp-type port-unreachable -j ACCEPT

		if [ "$OPTION_INTERN_DNS" = "ja" ]; then
			# intern -> DNS auf Firewall (UDP)
			ipchains -A input  -i eth0 -p udp -s 192.168.1.0/24 1024: -d 192.168.1.1 53            -j ACCEPT
			ipchains -A output -i eth0 -p udp -s 192.168.1.1 53       -d 192.168.1.0/24 1024:      -j ACCEPT

			# intern -> DNS auf Firewall (TCP)
			ipchains -A input  -i eth0 -p tcp -s 192.168.1.0/24 1024: -d 192.168.1.1 53            -j ACCEPT
			ipchains -A output -i eth0 -p tcp -s 192.168.1.1 53       -d 192.168.1.0/24 1024: ! -y -j ACCEPT
		fi

		if [ "$OPTION_BASIC_ICMP" = "ja" ]; then
			# Internet -> Firewall: ICMP-Pakete zur Benachrichtung bei Verbindungsproblemen
			ipchains -A input  -i ppp0 -p icmp --icmp-type destination-unreachable -j ACCEPT
			ipchains -A input  -i ppp0 -p icmp --icmp-type time-exceeded           -j ACCEPT
			ipchains -A input  -i ppp0 -p icmp --icmp-type source-quench           -j ACCEPT
			ipchains -A input  -i ppp0 -p icmp --icmp-type parameter-problem       -j ACCEPT

			# intern -> Firewall: ICMP-Pakete zur Benachrichtung bei Verbindungsproblemen
			ipchains -A input  -i eth0 -p icmp -s 192.168.1.0/24 -d 192.168.1.1 --icmp-type destination-unreachable -j ACCEPT
			ipchains -A input  -i eth0 -p icmp -s 192.168.1.0/24 -d 192.168.1.1 --icmp-type time-exceeded           -j ACCEPT
			ipchains -A input  -i eth0 -p icmp -s 192.168.1.0/24 -d 192.168.1.1 --icmp-type source-quench           -j ACCEPT
			ipchains -A input  -i eth0 -p icmp -s 192.168.1.0/24 -d 192.168.1.1 --icmp-type parameter-problem       -j ACCEPT

			# Firewall -> Internet: ICMP-Pakete für Verbindungstests + Antwort
			ipchains -A output -i ppp0 -p icmp --icmp-type echo-request -j ACCEPT
			ipchains -A input  -i ppp0 -p icmp --icmp-type echo-reply   -j ACCEPT

			# Firewall -> intern: ICMP-Pakete für Verbindungstests + Antwort
			ipchains -A output -i eth0 -p icmp -s 192.168.1.1    -d 192.168.1.0/24 --icmp-type echo-request -j ACCEPT
			ipchains -A input  -i eth0 -p icmp -s 192.168.1.0/24 -d 192.168.1.1    --icmp-type echo-reply   -j ACCEPT

			# Firewall -> Internet: ICMP-Pakete zur Benachrichtigung Flußkontrolle und Path MTU discovery
			ipchains -A output -i ppp0 -p icmp --icmp-type source-quench        -j ACCEPT
			ipchains -A output -i ppp0 -p icmp --icmp-type fragmentation-needed -j ACCEPT

			# Firewall -> intern: ICMP-Pakete zur Benachrichtigung bei Verbindungsproblemen
			ipchains -A output -i eth0 -p icmp -s 192.168.1.1  -d 192.168.1.0/24 --icmp-type source-quench           -j ACCEPT
			ipchains -A output -i eth0 -p icmp -s 192.168.1.1  -d 192.168.1.0/24 --icmp-type destination-unreachable -j ACCEPT
			ipchains -A output -i eth0 -p icmp -s 192.168.1.1  -d 192.168.1.0/24 --icmp-type time-exceeded           -j ACCEPT
			ipchains -A output -i eth0 -p icmp -s 192.168.1.1  -d 192.168.1.0/24 --icmp-type parameter-problem       -j ACCEPT
		fi


		if [ "$OPTION_FORWARD_DMZ" = "ja" ]; then
			# Erlaube forwarding
        	sysctl -w net.ipv4.conf.eth0.forwarding=1
        	sysctl -w net.ipv4.conf.eth2.forwarding=1

			## Forwarding-Beispiel
			# intern -> Webserver in 7.8.9.0/24
			ipchains -A input   -i eth0 -p tcp -s 192.168.1.0/24 1024: -d 7.8.9.0/24 80             -j ACCEPT
			ipchains -A forward -i eth2 -p tcp -s 192.168.1.0/24 1024: -d 7.8.9.0/24 80             -j ACCEPT
			ipchains -A output  -i eth2 -p tcp -s 192.168.1.0/24 1024: -d 7.8.9.0/24 80             -j ACCEPT
			# Antwortpakete
			ipchains -A input   -i eth2 -p tcp -s 7.8.9.0/24 80        -d 192.168.1.0/24 1024: ! -y -j ACCEPT
			ipchains -A forward -i eth0 -p tcp -s 7.8.9.0/24 80        -d 192.168.1.0/24 1024: ! -y -j ACCEPT
			ipchains -A output  -i eth0 -p tcp -s 7.8.9.0/24 80        -d 192.168.1.0/24 1024: ! -y -j ACCEPT


			## intern <-> DMZ

			## Forwarding-Beispiel via benutzerdefinierte Listen
			# Erstelle benutzerdefierte Listen
			ipchains -N int2dmz
			ipchains -N dmz2int
			# Paketverteilung intern -> dmz
			ipchains -A input   -i eth0  -s 192.168.1.0/24  -d 7.8.9.0/24     -j int2dmz
			ipchains -A forward -i eth2  -s 192.168.1.0/24  -d 7.8.9.0/24     -j int2dmz
			ipchains -A output  -i eth2  -s 192.168.1.0/24  -d 7.8.9.0/24     -j int2dmz
			# Paketverteilung dmz -> intern
			ipchains -A input   -i eth2  -s 7.8.9.0/24      -d 192.168.1.0/24 -j dmz2int
			ipchains -A forward -i eth0  -s 7.8.9.0/24      -d 192.168.1.0/24 -j dmz2int
			ipchains -A output  -i eth0  -s 7.8.9.0/24      -d 192.168.1.0/24 -j dmz2int

			# intern -> Webserver in 7.8.9.0/24 via int2dmz/dmz2int HTTP+HTTPS
			ipchains -A int2dmz -p tcp --sport 1024: --dport 80         -j ACCEPT
			ipchains -A int2dmz -p tcp --sport 1024: --dport 443        -j ACCEPT
			# Antwortpakete
			ipchains -A dmz2int -p tcp --sport 80    --dport 1024: ! -y -j ACCEPT
			ipchains -A dmz2int -p tcp --sport 443   --dport 1024: ! -y -j ACCEPT


			## extern <-> DMZ
	
			# Erstelle benutzerdefierte Listen
			ipchains -N ext2dmz
			ipchains -N dmz2ext

			# Paketverteilung extern -> DMZ
			ipchains -A input   -i eth3  -d 7.8.9.0/24     -j ext2dmz
			ipchains -A forward -i eth2  -d 7.8.9.0/24     -j ext2dmz
			ipchains -A output  -i eth2  -d 7.8.9.0/24     -j ext2dmz
			# Paketverteilung DMZ -> extern
			ipchains -A input   -i eth2  -s 7.8.9.0/24     -j dmz2ext
			ipchains -A forward -i eth3  -s 7.8.9.0/24     -j dmz2ext
			ipchains -A output  -i eth3  -s 7.8.9.0/24     -j dmz2ext

			## extern -> FTP-Server 7.8.9.100 via ext2dmz/dmz2ext
			# Kontrollkanal + Antwort
			ipchains -A ext2dmz -p tcp --sport 1024:            -d 7.8.9.100 21          -j ACCEPT
			ipchains -A dmz2ext -p tcp -s 7.8.9.100 21          --dport 1024:       ! -y -j ACCEPT
			# Aktiver Transfer (Verbindungsaufbau vom Server zum Client) + Antwort
			ipchains -A dmz2ext -p tcp -s 7.8.9.100 20          --dport 1024:            -j ACCEPT
			ipchains -A ext2dmz -p tcp --sport 1024:            -d 7.8.9.100 20     ! -y -j ACCEPT
			# Passiver Transfer (Verbindungsaufbau vom Client zum Server) + Antwort
			ipchains -A ext2dmz -p tcp --sport 1024:            -d 7.8.9.100 49152:65534 -j ACCEPT
			ipchains -A dmz2ext -p tcp -s 7.8.9.100 49152:65534 --dport 1024:       ! -y -j ACCEPT

		fi


		if [ "$OPTION_MASQUERADE" = "ja" ]; then

			# Erlaube forwarding
        	sysctl -w net.ipv4.conf.eth0.forwarding=1
        	sysctl -w net.ipv4.conf.ppp0.forwarding=1

			if [ "$OPTION_MASQ_POP" = "ja" ]; then
				## POP via Masquerading
				ipchains -A input    -i eth0 -p tcp -s 192.168.1.0/24 1024: -d ! 192.168.1.0/24 110      -j ACCEPT
				ipchains -A forward  -i ppp0 -p tcp -s 192.168.1.0/24 1024: --dport 110                  -j MASQ
				ipchains -A output   -i ppp0 -p tcp --sport 61000:65095     --dport 110                  -j ACCEPT
				# Antwortpakete (werden demaskiert, treffen nie auf die forward-Liste)
				ipchains -A input    -i ppp0 -p tcp --sport 110             --dport 61000:65095     ! -y -j ACCEPT
				ipchains -A output   -i eth0 -p tcp -s ! 192.168.1.0/24 110 -d 192.168.1.0/24 1024: ! -y -j ACCEPT
			fi

			if [ "$OPTION_MASQ_SMTP" = "ja" ]; then
				# SMTP via Masquerading
				## SMTP via Masquerading
				ipchains -A input    -i eth0 -p tcp -s 192.168.1.0/24 1024: -d ! 192.168.1.0/24 25       -j ACCEPT
				ipchains -A forward  -i ppp0 -p tcp -s 192.168.1.0/24 1024: --dport 25                   -j MASQ
				ipchains -A output   -i ppp0 -p tcp --sport 61000:65095     --dport 25                   -j ACCEPT
				# Antwortpakete (werden demaskiert, treffen nie auf die forward-Liste)
				ipchains -A input    -i ppp0 -p tcp --sport 25              --dport 61000:65095     ! -y -j ACCEPT
				ipchains -A output   -i eth0 -p tcp -s ! 192.168.1.0/24 25  -d 192.168.1.0/24 1024: ! -y -j ACCEPT
			fi

			if [ "$OPTION_MASQ_PGP" = "ja" ]; then

				hostname="europe.keys.pgp.com"
				LC_ALL=C dig $hostname A IN +pfmin | grep "IN A" | awk '{ print $5 }' | while read ipv4addr; do
					## Verbindung zu PGP-Keyservers via Masquerading 
					ipchains -A input    -i eth0 -p tcp -s 192.168.1.0/24 1024:      -d $ipv4addr 11370  -j ACCEPT
					ipchains -A forward  -i ppp0 -p tcp -s 192.168.1.0/24 1024:      -d $ipv4addr 11370  -j MASQ
					ipchains -A output   -i ppp0 -p tcp --sport 61000:65095          -d $ipv4addr 11370  -j ACCEPT
					# Antwortpakete (werden demaskiert, treffen nie auf die forward-Liste)
					ipchains -A input    -i ppp0 -p tcp -s $ipv4addr 11370 --dport 61000:65095      ! -y -j ACCEPT
					ipchains -A output   -i eth0 -p tcp -s $ipv4addr 11370 -d 192.168.1.0/24  1024: ! -y -j ACCEPT
				done
			fi

			if [ "$OPTION_MASQ_ICMP" = "ja" ]; then
				# Ping und Traceroute von intern via Masquerading
				ipchains -A input   -i eth0 -p icmp -s 192.168.1.0/24 -d ! 192.168.1.0/24 --icmp-type echo-request -j ACCEPT
				ipchains -A forward -i ppp0 -p icmp -s 192.168.1.0/24                     --icmp-type echo-request -j MASQ
				ipchains -A output  -i ppp0 -p icmp                                       --icmp-type echo-request -j ACCEPT
				# Antwortpakete 
				ipchains -A input   -i ppp0 -p icmp                                       --icmp-type echo-reply          -j ACCEPT
				ipchains -A input   -i ppp0 -p icmp                                       --icmp-type time-exceeded       -j ACCEPT
				ipchains -A input   -i ppp0 -p icmp                                       --icmp-type host-unreachable    -j ACCEPT
				ipchains -A input   -i ppp0 -p icmp                                       --icmp-type network-unreachable -j ACCEPT
				ipchains -A output  -i eth0 -p icmp                   -d 192.168.1.0/24   --icmp-type echo-reply          -j ACCEPT
				ipchains -A output  -i eth0 -p icmp                   -d 192.168.1.0/24   --icmp-type time-exceeded       -j ACCEPT
				ipchains -A output  -i eth0 -p icmp                   -d 192.168.1.0/24   --icmp-type host-unreachable    -j ACCEPT
				ipchains -A output  -i eth0 -p icmp                   -d 192.168.1.0/24   --icmp-type network-unreachable -j ACCEPT
			fi

			if [ "$OPTION_MASQ_FTP" = "ja" ]; then
				# Modul für FTP-Masquerading laden
				modprobe ip_masq_ftp

				# Passives FTP von intern via Masquerading
				## FTP:Kommandokanal
				ipchains -A input   -i eth0 -p tcp -s 192.168.1.0/24 1024:   -d ! 192.168.1.0/24 21        -j ACCEPT
				ipchains -A forward -i ppp0 -p tcp -s 192.168.1.0/24 1024:   --dport 21                    -j MASQ
				ipchains -A output  -i ppp0 -p tcp --sport 61000:65095       --dport 21                    -j ACCEPT
				# Antwortpakete 
				ipchains -A input   -i ppp0 -p tcp --sport 21                --dport 61000:65095      ! -y -j ACCEPT
				ipchains -A output  -i eth0 -p tcp -s ! 192.168.1.0/24 21    -d 192.168.1.0/24 1024:  ! -y -j ACCEPT
				## FTP:passiver Datenkanal
				ipchains -A input   -i eth0 -p tcp -s 192.168.1.0/24 1024:   -d ! 192.168.1.0/24 1024:     -j ACCEPT
				ipchains -A forward -i ppp0 -p tcp -s 192.168.1.0/24 1024:   --dport 1024:                 -j MASQ
				ipchains -A output  -i ppp0 -p tcp --sport 61000:65095       --dport 1024:                 -j ACCEPT
				# Antwortpakete 
				ipchains -A input   -i ppp0 -p tcp --sport 1024:             --dport 61000:65095      ! -y -j ACCEPT
				ipchains -A output  -i eth0 -p tcp -s ! 192.168.1.0/24 1024: -d 192.168.1.0/24 1024:  ! -y -j ACCEPT

				if [ "$OPTION_MASQ_FTP_ACTIVE" = "ja" ]; then
					# Freischaltung von aktiven Datentransfer bei FTP von intern via Masquerading (Server baut Verbindung auf)
					ipchains -A input   -i ppp0 -p tcp --sport 20              --dport 61000:65095         -j ACCEPT
					ipchains -A output  -i eth0 -p tcp -s ! 192.168.1.0/24 20  -d 192.168.1.0/24 1024:     -j ACCEPT
					# Antwortpakete des Clients
					ipchains -A input   -i eth0 -p tcp -s 192.168.1.0/24 1024: -d ! 192.168.1.0/24 20 ! -y -j ACCEPT
					ipchains -A forward -i ppp0 -p tcp -s 192.168.1.0/24 1024: --dport 20             ! -y -j MASQ 
					ipchains -A output  -i ppp0 -p tcp --sport 61000:65095     --dport 20             ! -y -j ACCEPT
				fi
			fi

		fi # Ende von OPTION_MASQUERADE

		if [ "$OPTION_BLOCK_TONLINE" = "ja" ]; then
			# Blockiere POP-Zugang zu T-Online
			hostname="pop.t-online.de"
			LC_ALL=C dig $hostname A IN +pfmin | grep "IN A" | awk '{ print $5 }' | while read ipv4addr; do
				ipchains -I input    -i eth0 -p tcp -d $ipv4addr 110   -j REJECT -l
				ipchains -I output   -i ppp0 -p tcp -d $ipv4addr 110   -j REJECT -l
			done

			# Blockiere SMTP-Zugang zu T-Online
			hostname="smtp.t-online.de"
			LC_ALL=C dig $hostname A IN +pfmin | grep "IN A" | awk '{ print $5 }' | while read ipv4addr; do
				ipchains -I input    -i eth0 -p tcp -d $ipv4addr 25    -j REJECT -l
				ipchains -I output   -i ppp0 -p tcp -d $ipv4addr 25    -j REJECT -l
			done

			# Blockiere FTP-Zugang zu home-up.t-online.de
			hostname="home-up.t-online.de"
			LC_ALL=C dig $hostname A IN +pfmin | grep "IN A" | awk '{ print $5 }' | while read ipv4addr; do
				ipchains -I input   -i eth0 -p tcp -d $ipv4addr 21      -j REJECT -l
				ipchains -I output  -i ppp0 -p tcp -d $ipv4addr 21      -j REJECT -l
			done
		fi

		# Protokolliere Pakete, die das Ende der Liste erreichen
		ipchains -A forward -j REJECT -l
        ipchains -A input -j DENY -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

