#! /bin/sh

# Author: Alexander Busam
#
# /etc/init.d/iptables_script
#
### BEGIN INIT INFO
# Provides:       iptables
# Required-Start: $network 
# Should-Start: 
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# Description:    start the iptables configuration
### END INIT INFO


# IP-Adresse des Netzwerkinterfaces
ip_nr=192.168.1.27

# IP-Adresse des lokalen DNS-Servers
ip_ldns=192.168.1.26/32

# IP-Adresse des lokalen LDAP-Servers
ip_lldap=192.168.1.26/32


# IP-Adresse des lokalen Netzes
ip_lnet=192.168.1.0/24

# IP-Adresse des Backupserver (hmbackupsrv)
ip_backupsrv=192.168.2.28

IPT=/usr/sbin/iptables


. /etc/rc.status

# Reset status of this service
rc_reset

case "$1" in

    start)

	#Kernelmodul für hylafax laden

	if (( `/sbin/lsmod | grep nf_conntrack_ftp | /usr/bin/wc -l` > 0 ))
	then
		/sbin/rmmod nf_conntrack_ftp
	fi

	/sbin/modprobe ip_conntrack_ftp ports=4559
	

        #Alle Regeln löschen
        
	$IPT -F
        $IPT -X
        $IPT -t nat -F
        $IPT -t nat -X


	# Durch unsere default-Regel (P=policy) machen wir alles zu.
	$IPT -P INPUT DROP
	$IPT -P OUTPUT DROP
#	$IPT -P OUTPUT -p tcp -j REJECT --reject-with tcp-reset
#        $IPT -A OUTPUT -p udp -j REJECT
	$IPT -P FORWARD DROP


        # Auf loopback alles erlauben
        $IPT -A INPUT -i lo -p all -j ACCEPT
        $IPT -A OUTPUT -o lo -p all -j ACCEPT


	# Wir erlauben nun pauschal alle Verbindungen, die zu bereits
	# aufgebauten Verbindungen gehören. WELCHE Verbindungen aufgebaut
	# werden dürfen, regeln wir anschließend.
	# Wir ziehen diesen Regelsatz vor, da wir Rechenpower sparen: Ein
	# Großteil der Pakete wird durch diese Regel durchgelassen, und so
	# können wir recht früh die Prüfung beenden.

	$IPT -A INPUT  -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
	$IPT -A OUTPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

	$IPT -A INPUT  -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
	$IPT -A OUTPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

	#
	# Benötigte Dienste müssen wir nun einzeln freischalten:
	#


	# Mailempfang SMTP weltweit
	#$IPT -A INPUT  -p TCP -d $ip_nr --sport 1024: --dport 25 \
	#$IPT -A INPUT  -p TCP -d $ip_nr  --dport 25 \
	$IPT -A INPUT  -p TCP -d $ip_nr --sport 1024: --dport 25 \
         -m state --state NEW -j ACCEPT

	# Alternativ-Beispiel: Mailempfang nur von den IPs 91.198.250.0/24
	# zulassen -- beispielsweise einem externen Spamfilterservice:
	#$IPT -A INPUT  -p TCP -d \$ip_nr --sport 1024: --dport 25 \
	#         -s 91.198.250.0/24 -m state --state NEW -j ACCEPT


	# Amavis als lokaler Server.
#        $IPT -A INPUT -p TCP -s 127.0.0.1 -d 127.0.0.1 --sport 1024: --dport 10025 -m state --state NEW -j ACCEPT
#	$IPT -A INPUT -p TCP -s 127.0.0.1 -d 127.0.0.1 --sport 1024: --dport 10024 -m state --state NEW -j ACCEPT
#        $IPT -A OUTPUT -p TCP -s 127.0.0.1 -d 127.0.0.1 --sport 1024: --dport 10025 -m state --state NEW -j ACCEPT
#        $IPT -A OUTPUT -p TCP -s 127.0.0.1 -d 127.0.0.1 --sport 1024: --dport 10024 -m state --state NEW -j ACCEPT

        # Der Server darf Nachrichten an pyzor-Server senden:
	$IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport 24441 -m state --state NEW -j ACCEPT
        $IPT -A OUTPUT -p UDP -s $ip_nr --sport 1024: --dport 24441 -m state --state NEW -j ACCEPT

        # Der Server darf Nachrichten an razor2-Server senden:
	$IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport 2703 -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport 7 -m state --state NEW -j ACCEPT



	# Mailversand weltweit
	#$IPT -A OUTPUT -p TCP -s $ip_nr --sport 25 --dport 1024: \
	#$IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport 25 \
	$IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport 25 \
         -m state --state NEW -j ACCEPT

	# POP3, POP3s, IMAP, IMAPs aus dem LAN erlauben 110 143 993 995
	$IPT -A INPUT  -p TCP -d $ip_nr \
         --sport 1024: --dport 143 \
         -m state --state NEW -j ACCEPT


	# Der Server darf NTP-Server abfragen:
	$IPT -A OUTPUT -p TCP -s $ip_nr --sport ntp --dport ntp -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT -p UDP -s $ip_nr --sport ntp --dport ntp -m state --state NEW -j ACCEPT


	# Der Server darf http-Server abfragen:
        $IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport 80 -m state --state NEW -j ACCEPT

        # Der Server darf ftp-Server abfragen:
        #$IPT -A OUTPUT -p TCP -s $ip_nr --sport 1024: --dport ftp -m state --state NEW -j ACCEPT
	#$IPT -A OUTPUT -p TCP --sport 1024: --dport 1024: -m state --state NEW -j ACCEPT
        # alternativ ==> s. u. 
	#$IPT -A OUTPUT -p TCP -o eth0 --sport 1024: --dport ftp -m state --state NEW -j ACCEPT
        #$IPT -A OUTPUT -p TCP -o eth0 --sport 1024: --dport 1024: -m state --state NEW -j ACCEPT	

	# Anfragen an den DNS-Server unseres LANs (TCP und UDP) erlauben
	# (angenommen, unser Mailserver nutzt ausgehend einen Port >1024)
	$IPT -A OUTPUT -p TCP -s $ip_nr -d $ip_ldns \
         --sport 1024: --dport 53 \
         -m state --state NEW -j ACCEPT

	$IPT -A OUTPUT -p UDP -s $ip_nr -d $ip_ldns \
         --sport 1024: --dport 53 \
         -m state --state NEW -j ACCEPT


	# LDAP-Zugriff erlauben. 
	$IPT -A OUTPUT -p TCP -s $ip_nr -d $ip_lldap \
         --sport 1024: --dport 389 \
         -m state --state NEW -j ACCEPT

	# Sofern SSH tatsächlich eingesetzt wird, schalten wir es
	# noch für einige IP-Nummern/Netze frei:
	# Unser LAN:
	$IPT -A INPUT  -p TCP -d $ip_nr -s $ip_lnet \
         --sport 1024: --dport 22 \
         -m state --state NEW -j ACCEPT

        # Sofern SSH tatsächlich eingesetzt wird, schalten wir es
        # noch für einige IP-Nummern/Netze frei:
        # Unser LAN:
        $IPT -A OUTPUT -p TCP -s $ip_nr -d $ip_lnet \
         --sport 1024: --dport 22 \
         -m state --state NEW -j ACCEPT

	# Sofern SSH tatsächlich eingesetzt wird, schalten wir es
	# noch für einige IP-Nummern/Netze frei:
	# Unser LAN:
	$IPT -A INPUT  -p TCP -d 192.168.2.27 -s 192.168.2.0/24 \
         --sport 1024: --dport 22 \
         -m state --state NEW -j ACCEPT

        # Sofern SSH tatsächlich eingesetzt wird, schalten wir es
        # noch für einige IP-Nummern/Netze frei:
        # Unser LAN:
        $IPT -A OUTPUT -p TCP -s 192.168.2.27 -d $ip_backupsrv \
         --sport 1024: --dport 22 \
         -m state --state NEW -j ACCEPT

        # Hylafax (lokal)
#A        $IPT -A OUTPUT -p TCP -s 127.0.0.1 -d 127.0.0.0/8 \
#A          --sport 1024: --dport 4559 \
#A        -m state --state NEW -j ACCEPT

	# Hylafax (lokal)
#A        $IPT -A INPUT -p TCP -s 127.0.0.0/8 -d 127.0.0.1 \
#A          --sport 1024: --dport 4559 \
#A         -m state --state NEW -j ACCEPT
	
        # Hylafax (fuer eingehende Faxe)
        $IPT -A INPUT  -p TCP -d $ip_nr -s $ip_lnet \
	  --sport 1024: --dport 4559 \
         -m state --state NEW -j ACCEPT

        # Hylafax (fuer eingehende Faxe)
        #$IPT -A OUTPUT  -p TCP -s $ip_nr -d $ip_lnet \
        #  --sport 1024: --dport 4559 \
        # -m state --state NEW -j ACCEPT


        # Alles loggen
        $IPT -A OUTPUT -j LOG --log-prefix="IPTABLES-OUTPUT: " --log-level 7
        $IPT -A INPUT -j LOG --log-prefix="IPTABLES-INPUT: " --log-level 7
        $IPT -A FORWARD -j LOG --log-prefix="IPTABLES-FORWARD: "

        # Alles abweisen
        $IPT -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
        $IPT -A OUTPUT -p udp -j REJECT

        $IPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset
        $IPT -A INPUT -p udp -j REJECT


	echo -n  "ip-tables gestartet"

	# Remember status and be verbose
	rc_status -v

	;;

    stop)

	#Alle Regeln loeschen

	$IPT -F
	$IPT -X
	$IPT -t nat -F
	$IPT -t nat -X
	
	$IPT -P INPUT ACCEPT
	$IPT -P OUTPUT ACCEPT
	$IPT -P FORWARD ACCEPT

	echo -n "ip-tables geloescht"

	# Remember status and be verbose
	rc_status -v

	;;

    status)

	$IPT -L
	$IPT -t nat -n -L

	rc_status -v

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

esac
rc_exit
