Dies ist das von uns erarbeitete Script für unsere Firewall:
  #!/bin/bash

  # Zensur-Hinweis
  # Da dieses Script von der LUG Krefeld erstellt worden ist, soll es auch
  # innerhalb und ausserhalb dieser Gruppe veroeffentlicht werden duerfen.
  # Da es jedoch teilweise sicherheitsrelevante interne Daten wie z.B.
  # interne IP-Adressen enthaelt, sind einige Zeilen mit "### ZENSUR"
  # gekennzeichnet. Diese Zeilen muessen vor der Veroeffentlichung entfernt
  # werden. Dies kann z.B. erfolgen mit:

  DEV_INET=ppp0
  DEV_BAYENNET=eth0
  DEV_LUGNET=eth1
  # Beispiel:
  # LOCALNET=192.168.1.0/24
  # Die Maske fuer Server im Internet. Sie wird fuer smtp, news etc. benutzt.
  # Im Zweifelsfalle kann hier ! $LOCALNET eingetragen werden.
  # Die hier angegebene scheint fuer T-Online zu taugen.
  PROVIDERSERVER=194.25.134.0/24


  # Wenn ich komplexe Dienste habe, die mehr als einen Port haben und diese nicht
  # global, sondern nur bestimmten Rechnern freigeben will, ist es sinnvoll, hierfuer
  # eigene chains zu erzeugen. Dies geschieht in den folgenden Routinen.

  makechain_tonline(){
    # Wenn auf einem Rechner die T-Online 3.0-Software laufen darf,
    # kommen seine Pakete in diese Chain:
    # Es ist vorher sichergestellt, dass nur ausgehende Verb. hierhergelangen
    TONLINESERVER=194.25.134.0/24
    iptables -N tonline
    # Beim Verbindungsaufbau geht ein einzelnes Paket an diesen Port:
    iptables -A tonline -j ACCEPT -s $LOCALNET -d $TONLINESERVER -p udp --dport 811
    iptables -A tonline -j ACCEPT -d $LOCALNET -s $TONLINESERVER -p udp --sport 811
    # Das ist die eigentliche T-Online-Classic-Verbindung
    iptables -A tonline -j ACCEPT -s $LOCALNET -d $TONLINESERVER -p tcp --dport 866
    iptables -A tonline -j ACCEPT -d $LOCALNET -s $TONLINESERVER -p tcp --sport 866
  }

  makechain_email(){
    # Wenn ein Rechner einen eigenen EMail-Client haben darf,
    # kommen seine Pakete in diese Chain:
    # Es ist vorher sichergestellt, dass nur ausgehende Verb. hierhergelangen
    iptables -N email
    iptables -A email -j ACCEPT -s $LOCALNET -d ! $LOCALNET     -p tcp --dport pop3
    iptables -A email -j ACCEPT -d $LOCALNET -s ! $LOCALNET     -p tcp --sport pop3
    iptables -A email -j ACCEPT -s $LOCALNET -d $PROVIDERSERVER -p tcp --dport smtp
    iptables -A email -j ACCEPT -d $LOCALNET -s $PROVIDERSERVER -p tcp --sport smtp
  }

  makechain_laestig(){
    # Hier werden Pakete, die ab und zu vorkommen, die nervig sind, die aber nicht
    # ins logfile sollen, weil sie bekannt und unvermeidbar sind, verworfen.
    iptables -N laestig
    iptables -A laestig -j DROP -p udp --sport netbios-dgm --dport netbios-dgm \
                                -m limit --limit 10/minute --limit-burst 10
    iptables -A laestig -j DROP -p udp --sport netbios-ns --dport netbios-ns \
                                -m limit --limit 10/minute --limit-burst 10
  }

  makechains(){
    makechain_tonline
    makechain_email
    makechain_laestig
  }

  deletechains(){
    iptables -X tonline >/dev/null 2>&1
    iptables -X email   >/dev/null 2>&1
    iptables -X laestig >/dev/null 2>&1
  }

  flush(){
    iptables -P INPUT   $1
    iptables -P OUTPUT  $1
    iptables -P FORWARD $1
    iptables -F
    iptables -F INPUT
    iptables -F OUTPUT
    iptables -F FORWARD
    iptables -X in_private >/dev/null 2>&1
    iptables -X papierkorb >/dev/null 2>&1
    iptables -X netzeingang >/dev/null 2>&1
    iptables -X netzausgang >/dev/null 2>&1
    iptables -X fweingang >/dev/null 2>&1
    iptables -X fwausgang >/dev/null 2>&1
    deletechains
    # Masquerading und Routing abschalten
    iptables -t nat -F POSTROUTING
    echo 0 >/proc/sys/net/ipv4/ip_forward
  }

  stop() {
    flush ACCEPT
  }

  close() {
    flush DROP
  }

  start() {
    # Erstmal ein Unterprogramm aufrufen, um alles zu sperren
    flush DROP

    # Kette papierkorb
    # hier landen alle Pakete, die geloggt und weggeschmissen werden
    iptables -N papierkorb
    iptables -A papierkorb -j LOG --log-level notice \
             -m limit --limit 60/minute --limit-burst 20
    iptables -A papierkorb -j DROP

    # Verhindern, dass Pakete mit privaten Adressen von draussen hereinkommen
    iptables -N in_private
    iptables -F in_private
    iptables -A in_private -j papierkorb -s 127.0.0.0/8
    iptables -A in_private -j papierkorb -s 10.0.0.0/8
    iptables -A in_private -j papierkorb -s 172.16.0.0/12
    iptables -A in_private -j papierkorb -s 192.168.0.0/16
    iptables -A in_private -j papierkorb -s 224.0.0.0/4
    iptables -A in_private -j papierkorb -s 240.0.0.0/4
    # INPUT und FORWARD auf solche privaten Adressen ueberpruefen
    iptables -A INPUT   -j in_private -i $DEV_INET
    iptables -A FORWARD -j in_private -i $DEV_INET

    # Sachen, die der Nameserver selber im Internet darf:
    iptables -A OUTPUT -j ACCEPT -o $DEV_INET -p tcp --sport 1024: --dport domain \
             -m state --state ESTABLISHED,NEW
    iptables -A OUTPUT -j ACCEPT -o $DEV_INET -p udp --sport 1024: --dport domain \
             -m state --state ESTABLISHED,NEW
    iptables -A INPUT -j ACCEPT -i $DEV_INET -p tcp --sport domain --dport 1024: \
             -m state --state ESTABLISHED
    iptables -A INPUT -j ACCEPT -i $DEV_INET -p udp --sport domain --dport 1024: \
             -m state --state ESTABLISHED

    # Spezialchains erzeugen
    makechains


    # Eingang in die Firewall selber:
   
    ############################################################################
    iptables -N fweingang
    iptables -A INPUT -j fweingang -i $DEV_BAYENNET
    iptables -A INPUT -j fweingang -i $DEV_LUGNET
    iptables -N fwausgang
    iptables -A OUTPUT -j fwausgang -o $DEV_BAYENNET
    iptables -A OUTPUT -j fwausgang -o $DEV_LUGNET
    # Grundvoraussetzungen fuer geroutete Pakete:
    iptables -A fweingang -j papierkorb -s ! $LOCALNET
    iptables -A fweingang -j papierkorb -m state --state INVALID
    iptables -A fwausgang -j papierkorb -d ! $LOCALNET
    iptables -A fwausgang -j papierkorb -m state --state INVALID,NEW
    # Windows-Broadcasts wegfiltern:
    iptables -A fweingang -j laestig

    # ICMP-Pakete freigeben.
    # Typ 3/Code 4 "fragmentation needed" kommt oft vor. Darueber sollte ich
    # interne Clients informieren.
    iptables -A fwausgang -j ACCEPT -p icmp --icmp-type fragmentation-needed

    # und jetzt werden die eigentlichen Protokolle freigegeben
    iptables -A fweingang -j ACCEPT -p tcp --dport ssh
    iptables -A fwausgang -j ACCEPT -p tcp --sport ssh
    # iptables -A fweingang -j ACCEPT -p tcp --dport telnet
    # iptables -A fwausgang -j ACCEPT -p tcp --sport telnet
    iptables -A fweingang -j ACCEPT -p tcp --dport domain
    iptables -A fwausgang -j ACCEPT -p tcp --sport domain
    iptables -A fweingang -j ACCEPT -p udp --dport domain
    iptables -A fwausgang -j ACCEPT -p udp --sport domain

    # Vorschlag:
    # (Das wuenscht sich Kai)
    #tcp fweingang,telnet



    # Ein- und Ausgangspakete fuer die beiden lokalen Netze in gemeinsame Chains
   
    ############################################################################
    iptables -N netzeingang
    iptables -A FORWARD -j netzeingang -i $DEV_INET -o $DEV_BAYENNET
    iptables -A FORWARD -j netzeingang -i $DEV_INET -o $DEV_LUGNET
    iptables -N netzausgang
    iptables -A FORWARD -j netzausgang -o $DEV_INET -i $DEV_BAYENNET
    iptables -A FORWARD -j netzausgang -o $DEV_INET -i $DEV_LUGNET
    # Grundvoraussetzungen fuer geroutete Pakete:
    iptables -A netzeingang -j papierkorb -d ! $LOCALNET
    iptables -A netzeingang -j papierkorb -m state --state INVALID,NEW
    iptables -A netzausgang -j papierkorb -s ! $LOCALNET
    iptables -A netzausgang -j papierkorb -m state --state INVALID

    # und jetzt werden die eigentlichen Protokolle freigegeben
    iptables -A netzeingang -j ACCEPT -p tcp --sport www
    iptables -A netzausgang -j ACCEPT -p tcp --dport www
    iptables -A netzeingang -j ACCEPT -p tcp --sport https
    iptables -A netzausgang -j ACCEPT -p tcp --dport https
    iptables -A netzeingang -j ACCEPT -p tcp --sport nntp
    iptables -A netzausgang -j ACCEPT -p tcp --dport nntp


    # Jetzt backe ich eine Extrawurst fuer den Rechner in der Wohnung
    # Er darf selber EMail machen und Classic T-Online benutzen
    iptables -A netzeingang -j tonline -d $EXTRAWURST
    iptables -A netzausgang -j tonline -s $EXTRAWURST
    iptables -A netzeingang -j email -d $EXTRAWURST
    iptables -A netzausgang -j email -s $EXTRAWURST
    iptables -A netzeingang -j email -d $LUGEXTRAWURST
    iptables -A netzausgang -j email -s $LUGEXTRAWURST
    # ssh-Ausgang z.B. fuer Sourceforge
    iptables -A netzeingang -j ACCEPT -p tcp --sport ssh -d $TESTEXTRAWURST
    iptables -A netzausgang -j ACCEPT -p tcp --dport ssh -s $TESTEXTRAWURST
    iptables -A netzeingang -j ACCEPT -p tcp --sport ssh -d $LUGEXTRAWURST
    iptables -A netzausgang -j ACCEPT -p tcp --dport ssh -s $LUGEXTRAWURST


    # Der Rest kommt in den Muell
   
    ############################################################################
    iptables -A INPUT   -j papierkorb
    iptables -A OUTPUT  -j papierkorb
    iptables -A FORWARD -j papierkorb

    # Fuer ins Internet gehende Pakete Masquerading einschalten
    iptables -t nat -A POSTROUTING -o $DEV_INET -j MASQUERADE
    echo 1 >/proc/sys/net/ipv4/ip_forward
  }



  case $1 in
    start)
      echo -n "Starting IP filtering... "
      start
      echo "done"
      ;;
    restart)
      echo -n "Re-Starting IP filtering... "
      stop
      start
      echo "done"
      ;;
    stop)
      echo -n "Stopping IP filtering... "
      stop
      echo "done"
      ;;
    close)
      echo -n "Closing IP interfaces... "
      stop
      echo "done"
      ;;
    *)
      echo "Usage: $0 start | restart | stop | close"
      exit 1
  esac

  exit 0
in meinem Script sind ein paar denkanstöße zur nutzung von squit, das laden von iptables modulen und ein paar wenige dienste. File --> fw.sh Input Output und forward wird gefiltert! es geht eventuell so einiges nicht mehr durch den router!
Tags:  Firewall, Linux

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
sh
fw.sh 3.7 kB 1 12-Jun-2008 21:46 JensKapitza
« This page (revision-6) was last changed on 12-Jun-2008 21:49 by JensKapitza