Inhaltsverzeichnis
Es ist unter /usr/local/sbin/firewall zu finden.
#!/bin/sh
#
# Firewall-Script für Gymnasium Münsingen
#
# /etc/init.d/firewall -> /usr/local/sbin/firewall
# /etc/rc[2345].d/S10firewall -> ../init.d/firewall
#
# Tool iptables vorhanden?
iptables=/sbin/iptables
test -x $iptables || exit 5
# ip_tables-Modul laden
modprobe ip_tables || exit 5
##############################################################
# FUNKTIONEN
##############################################################
function firewall_config() {
    # 1. Interfaces
    # extern -> Internet
    ext_int="ppp+"  ## nicht eth1, das wird quasi nicht verwendet...
    # intern -> Intranet
    int_int="eth0"
    # loopback
    lo_int="lo"
    # 2. IP-Adressen
    # server externe adresse
    server_ext="0/0"  # ist egal, s.o.: auf ppp+ kommen nur pakete an,
                      # die für den comp. bestimmt sind
    # server interne adresse
    server_int="192.168.0.1"
    # intranet adress-bereich
    lan="192.168.0.0/24"
    # 3. Ports
    # alle privilegierten ports
    priv_ports="0:1023"
    # alle unprivilegierten ports
    unpriv_ports="1024:65535"
}
function firewall_init() {
    # Alle regeln und chains löschen
    $iptables -F
    $iptables -t nat -F
    $iptables -X
    # default policy
    $iptables -P INPUT DROP
    $iptables -P FORWARD DROP
    $iptables -P OUTPUT ACCEPT
    # loopback interface aktivieren
    $iptables -A INPUT -i $lo_int -j ACCEPT
    # Schutz vor SYN Flooding
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo "1" > $f
    done
    # IP Forwarding deaktivieren
    echo "0" > /proc/sys/net/ipv4/ip_forward
    # chains
    $iptables -N intranet
    $iptables -N internet
    # spezielle regeln:
    # spezielles dhcp-broadcast-paket
    $iptables -A INPUT -i $int_int -d 255.255.255.255 -p udp --dport 67 \
        -j ACCEPT
    # spezielles smb-broadcast-paket...nötig??
    $iptables -A INPUT -i $int_int -d 192.168.0.255 -p udp --sport 138 \
        --dport 138 -j ACCEPT
    $iptables -A INPUT -i $int_int -d 192.168.0.255 -p udp --sport 137 \
        --dport 137 -j ACCEPT
    $iptables -A INPUT -i $int_int -d 192.168.0.255 -p udp --dport 138 \
        -j ACCEPT
    $iptables -A INPUT -i $int_int -d 255.255.255.255 -p udp --dport 138 \
        --sport 138 -j ACCEPT
    # allgemeine regeln mit userdefined chains
    $iptables -A INPUT -i $int_int -s $lan -d $server_int -j intranet
    $iptables -A INPUT -i $ext_int -j internet
    # erlaube ankommende Pakete von bestehenden Verbindungen
    $iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
    $iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
    # logging:
    $iptables -A INPUT -j LOG --log-prefix "firewall: " -m limit
}
function firewall_intranet () {
    #leere chain intranet
    $iptables -F intranet
    # icmp pakete in
    # see /usr/include/netinet/ip_icmp.h
    $iptables -A intranet -p icmp --icmp-type  0 -j ACCEPT
    $iptables -A intranet -p icmp --icmp-type  3 -j ACCEPT
    $iptables -A intranet -p icmp --icmp-type  4 -j ACCEPT
    $iptables -A intranet -p icmp --icmp-type  8 -j ACCEPT
    $iptables -A intranet -p icmp --icmp-type 12 -j ACCEPT
    # erlaube ssh (tcp,1222) in
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 1222 -j ACCEPT
    # erlaube smtp (tcp,25) in
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 25 -j ACCEPT
    # erlaube domain (udp,53) in
    $iptables -A intranet -p udp --sport $unpriv_ports --dport 53 -j ACCEPT
    # erlaube dhcp (udp,67/68) in
    $iptables -A intranet -p udp --sport $unpriv_ports --dport 67 -j ACCEPT
    $iptables -A intranet -p udp --sport 68 --dport 67 -j ACCEPT
    # erlaube httpd (tcp,80) in
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 80 -j ACCEPT
    # erlaube pop3 (tcp,110) in
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 110 -j ACCEPT
    # erlaube smb (tcp/udp,137:139) in
    $iptables -A intranet -p udp --sport 137 --dport 137 -j ACCEPT
    $iptables -A intranet -p udp --sport 138 --dport 138 -j ACCEPT
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 139 -j ACCEPT
    # erlaube swat (tcp/901) in
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 901 -j ACCEPT
    # reject smb (tcp/445) in
    $iptables -A intranet -p tcp --dport 445 -j REJECT
    # webmin (tcp/10000) in
    $iptables -A intranet -p tcp --dport 10000 -j ACCEPT
    ### proxy - internet-freigabe
    $iptables -A intranet -p tcp --sport $unpriv_ports --dport 3128 -j ACCEPT
    # proxy-manager aufrufen
    /usr/local/sbin/proxy-manager -d
    # transparent proxy (nur für http)
    $iptables -t nat -A PREROUTING -i eth0 -p tcp -d ! $server_int --dport 80 \
        -j REDIRECT --to-port 3128
}
function firewall_internet () {
    # leere chain internet
    $iptables -F internet
    # richtige adresse? -- prüfung entfällt (s.o.), da nur pakete ankommen,
    #                      die auch für dem comp. bestimmt sind.
    #$iptables -A internet -d ! $server_ext -j RETURN
    ### provided services! in
    # icmp pakete in
    $iptables -A internet -p icmp -d $server_ext --icmp-type  0 -j ACCEPT
    $iptables -A internet -p icmp -d $server_ext --icmp-type  3 -j ACCEPT
    $iptables -A internet -p icmp -d $server_ext --icmp-type  4 -j ACCEPT
    $iptables -A internet -p icmp -d $server_ext --icmp-type  8 -j ACCEPT
    $iptables -A internet -p icmp -d $server_ext --icmp-type 12 -j ACCEPT
    # erlaube ssh (tcp,1222) in
    $iptables -A internet -p tcp -d $server_ext --dport 1222 --sport \
        $unpriv_ports -j ACCEPT
    # erlaube http (tcp,80) in
    #$iptables -A internet -p tcp -d $server_ext --dport 80 --sport \
        $unpriv_ports -j ACCEPT
}
function firewall_stop () {
    # proxy-manager beenden
    /usr/local/sbin/proxy-manager -k
    # alle chains leeren
    $iptables -F
    $iptables -t nat -F
    # alle userdefined chains löschen
    $iptables -X
    # default policies
    $iptables -P INPUT ACCEPT
    $iptables -P OUTPUT ACCEPT
    $iptables -P FORWARD ACCEPT
}
##############################################################
runfile=/var/run/firewall
case "$1" in
    start)
        if [ -e $runfile ]; then
            echo "Firewall already running..."
            echo "see: $runfile"
            exit 1;
        fi
        echo "Starting firewall..."
        firewall_config
        echo "config: ext_int: $ext_int"
        echo "        int_int: $int_int"
        echo "        server_ext: $server_ext"
        echo "        server_int: $server_int"
        firewall_init
        firewall_intranet
        firewall_internet
        touch $runfile
        echo "...done"
        ;;
    stop)
        if [ ! -e $runfile ]; then
            echo "Firewall is not running..."
            exit 1;
        fi
        echo -n "Stopping firewall..."
        firewall_stop
        rm $runfile
        echo "done"
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    status)
        /usr/local/sbin/proxy-manager -t
        echo -n "Checking for firewall..."
        if [ -e $runfile ]; then
          echo "running"
        else
          echo "not running!"
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
esac
exit 0