menu.jpg  ::  Home ::  Computing ::  Downloads ::  Scooter ::  Links ::  Music ::  Nonsense ::  Mail :: 

1. Aufgaben meines Routers

Ein Router ermöglicht einem Netzwerksegment den Zugriff auf ein weiteres Netzwerksegment, in diesem Falle meinem Home-LAN den Zugriff auf das Internet.

Der reinen Lehre nach sollten sich auf einem Router keine bzw. nur die notwendigsten Dienste installiert sein, im Idealfall befindet sich der Router darüber hinaus hinter einem weiteren Rechner, der als Paketfilter (Firewall) fungiert.

Praktisch möchte ich mir das alles aber nicht antuen, da ich schon meiner Stromrechnung zu Liebe nicht eine Vielzahl von Rechnern "durchlaufen" lasse. Meine Router nimmt neben seiner eigentlichen Aufgabe, sich einzuwählen sowie Pakete aus dem LAN ins Internet und umgekehrt weiterzuleiten, folgende Dienste war:

Die beiden Proxy-Server, durch die meine Web-Browser auf das WWW zugreifen

laufen auf meiner Workstation (AMD K7-650, 256 MB, SCSI), da es sich bei meinem Router "nur" um einen Pentium Classic 133 mit 64 MB auf uralten IDE-Platten handelt (er hat dafür auch nur einen Zwanni gekostet), dem ich diese zusätzlichen Dienste nicht auch noch zumuten wollte.

Ein paar generelle Aussagen zum Sinn und Unsinn von Paketfiltern sowie der Sicherung eines unter *NIX laufenden Rechners findest Du übrigens hier.

2. Konfiguration des Paketfilters auf dem Router

Mein IpChains-Regelwerk läuft in drei Schritten ab:

2.1 IP-Masquerding

Ich habe mir folgendes Skript in den Start-/Stopmechanismus meines Routers (unter Debian unter '/etc/init.d/' mit Start- und Stop-Links in '/etc/rc[1-6].d') eingebaut:

   #!/bin/sh
   #
   # /etc/init.d/masquerade - prepares the system for IP-forwarding
   #
   # Author: Martin Bock
   # Date:   18-Jun-2001

   PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
   DESC="IP-forwarding"
   NAME="masquerade"
   NET="192.168.1.0"
   MASK="255.255.255.0"
   EXTIF=ppp0
   IPC=/sbin/ipchains
 
   set -e
    
   # if the kernel doesn't support masquerading, exit here
   #
   test -f /proc/net/ip_masquerade || exit 1;
 
   case "$1" in
     start)
           echo -n "Starting $DESC in $NAME..."
           #
           # Setting forwarding and dynamic ip-addresses in kernel
           #
           if [ -e /proc/sys/net/ipv4/ip_forward ]
           then
                   echo 1 > /proc/sys/net/ipv4/ip_forward
           fi
           if [ -e /proc/sys/net/ipv4/ip_dynaddr ]
           then
                   echo 7 > /proc/sys/net/ipv4/ip_dynaddr
           fi
           $IPC -P forward DENY
           $IPC -A forward -i $EXTIF -d 0/0 -s $NET/$MASK -j MASQ
           $IPC -M -S 7200 10 160
           echo " done."
           ;;
     stop)
           echo -n "Stopping $DESC in $NAME..."
           #
           # Unsetting forwarding and dynamic ip-addresses in kernel
           #
           for i in /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/ip_dynaddr
           do
               if [ -e $i ]
               then
                   echo 0 > $i
               fi
           done
           $IPC -P forward ACCEPT
           $IPC -D forward -i $EXTIF -d 0/0 -s $NET/$MASK -j MASQ
           echo " done."
           ;;
     restart)
           $0 stop
           $0 start
           ;;
     *)
           N=/etc/init.d/$NAME
           echo "Usage: $N {start|stop|restart}" >&2
           exit 1
           ;;
   esac
 
   exit 0

Dieses Skript ist grösstenteils aus dem "Ganten-Buch" von Peter H. Ganten abgekupfert und aktiviert das IP-Forwarding; d.h., herausgehende IP-Pakete mit lokalen IP Nummern, die der Router von Rechnern meines LAN's erhält, maskiert er mit der von meinem Provider jeweils zugewiesenen Internet-IP's und umgekehrt.

Damit dient der Rechner als Einwahlserver für mein LAN, ist aber einer Menge möglicher Zugriffe aus dem Internet relativ "schutzlos" ausgesetzt.

2.2 Starten des Paketfilters

Um den Rechner vor unerwünschten Zugriffen Dritter aus dem Internet zu schützen, sollte man nach Herstellen der Verbindung einen Paketfilter starten. Diesen kann man je nach Mechanismus der jeweiligen Distribution über lokale Skripte, wie z.B. '/etc/ppp/ppp.local' oder '/etc/ppp/ip-up.d/1firewall' anstossen.

Mein Skript, dass ich mir ursprünglich mal für einen Standalone DialUp-Rechner geschrieben habe, sieht folgendermassen aus:

   #!/bin/sh
   #
   # /etc/ppp/ip-up.d/1firewall-up
   #
   # IPChains-Paketfilter, der Pakete an
   # * alle privilegierten Ports (0:1023) REJECTed
   # * alle High-Ports (1024:65535) mit definierten Ausnahmen ACCEPTed
   # * alle gespooften Adressen DENYid
   # * div. bad icmp-pakets DENYed
   #
   # Author: Martin Bock
   # Date:   19-Nov-2000
 
   # ---- Einige globale Variablen
   #
   IPC="/sbin/ipchains"
   EXTIF=ppp0
   INTIF=eth0
   LOCALIP=`ifconfig $EXTIF | grep inet | cut -d : -f 2 | cut -d \  -f 1`
   LOCALMASK=`ifconfig $EXTIF | grep Mask | cut -d : -f 4`
   NETWORK=`grep network /etc/network/interfaces | cut -d" " -f3`
   LOCALNET="$LOCALIP/$LOCALMASK"
   LOCALNETWORK="$NETWORK/$LOCALMASK"
   INTERNET="0/0"
   LOOPBACK="127.0.0.0/8"
   CLASS_A="10.0.0.0/8"
   CLASS_B="172.16.0.0/12"
   CLASS_C="192.168.0.0/16"
 
   # ---- IP-Spoofing Schutz
   #
   if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
   then
       for i in /proc/sys/net/ipv4/conf/*/rp_filter
       do
           echo 1 > $i
       done
   fi
 
   # ---- SYN Flood Schutz
   #
   if [ -e /proc/sys/net/ipv4/tcp_syncookies ]
   then
       echo 1 > /proc/sys/net/ipv4/tcp_syncookies
   fi
    
   # ---- Source routed packets
   #
   for i in /proc/sys/net/ipv4/conf/*/accept_source_route
   do
       echo 0 > $i
   done
    
   # ---- Einige Module laden
   #
   for i in /lib/modules/$(uname -r)/ipv4/ip_masq_*
   do
       /sbin/modprobe $(basename $i .o)
   done
    
   # ---- Paketfilter
    
   # 1. Alles flushen
   #
   # $IPC -F forward (look at /etc/init.d/masquerade)
   $IPC -F input
   $IPC -F output
    
   # 2. Default Policy
   #
   #$IPC -P forward ACCEPT (look at /etc/init.d/masquerade)
   $IPC -P input ACCEPT
   $IPC -P output ACCEPT
    
   # 3. Type Of Service (TOS) f. maximalen Durchsatz optimieren
   #
   $IPC -A output -p tcp -d 0/0 www -t 0x01 0x10
   $IPC -A output -p tcp -d 0/0 telnet -t 0x01 0x10
   $IPC -A output -p tcp -d 0/0 ftp -t 0x01 0x10
   $IPC -A output -p tcp -d 0/0 nntp -t 0x01 0x02
   $IPC -A output -p tcp -d 0/0 pop-3 -t 0x01 0x02
   $IPC -A output -p tcp -d 0/0 ftp-data -t 0x01 0x02
    
   # 4. Pakete an Loopback-Device ACCEPTen
   #
   $IPC -A input -i lo -s 0/0 -d 0/0 -j ACCEPT
   $IPC -A output -i lo -s 0/0 -d 0/0 -j ACCEPT
    
   # 5. ICMP-Pakete
   #
   # ankommende ICMP-Pakete teilweise ACCEPTen
   #
   for ICMP in echo-reply \
               destination-unreachable \
               time-exceeded \
               parameter-problem \
               source-quench
   do
       $IPC -A input -p icmp -s $INTERNET -d $LOCALNET --icmp-type $ICMP -j ACCEPT
   done
   $IPC -A input -p icmp -s $INTERNET -d $LOCALNET -j DENY -l
    
   # rausgehende ICMP-Pakete ACCEPTen
   #
   $IPC -A output -p icmp -s $LOCALNET -d $INTERNET -j ACCEPT
    
   # 6. Gespoofte Adressen DENYen (logged)
   #
   $IPC -A input -i $EXTIF -s $LOOPBACK -j DENY -l
   $IPC -A input -i $EXTIF -s $CLASS_A -j DENY -l
   $IPC -A input -i $EXTIF -s $CLASS_B -j DENY -l
   $IPC -A input -i $EXTIF -s $CLASS_C -j DENY -l
    
   # 7. TCP und UDP Pakete an privilegierte Ports REJECTen (0:1023 - logged)
   #
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 0:1023 -j REJECT -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 0:1023 -j REJECT -l
    
   # 8. bestimmte High-Ports DENYen (logged)
   #
   # rpc.mount (1024 tcp, 1026 udp)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 1026 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 1024 -j DENY -l
   #
   # Network File System (2049)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 2049 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 2049 -j DENY -l
   #
   # MySQL (3306)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 3306 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 3306 -j DENY -l
   #
   # Postgres SQL (5432)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 5432 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 5432 -j DENY -l
   #
   # Junkbuster Filter Proxy (5865)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 5865 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 5865 -j DENY -l
   #
   # X (6000:6063)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 6000:6063 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 6000:6063 -j DENY -l
   #
   # X Font Server (7100:7101)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 7100:7101 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 7100:7101 -j DENY -l
   #
   # WWWOffle Cache Proxy (8080:8081)
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET 8080:8081 -j DENY -l
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET 8080:8081 -j DENY -l
   #
    
   # 8. Alle anderen Pakete ACCEPTen (aktives FTP und eMail-Empfang)
   #
   $IPC -A input -p udp -i $EXTIF -s $INTERNET -d $LOCALNET -j ACCEPT
   $IPC -A input -p tcp -i $EXTIF -s $INTERNET -d $LOCALNET -j ACCEPT

Dieses Skript verwirft alle ankommenden Pakete an privilegierte Ports, akzeptiert Pakete an allen nicht expliziet definierten High-Ports, lässt keine gespooften Pakete durch, und, und...

2.3 Beenden des Paketfilters

Ich mag es persönlich immer gern, nach Erledigung einer Aufgabe den Urzustand wieder herzustellen. Genau dies macht das folgende Skript, das unmittelbar vor Beendigung der Verbindung zum Internet ausgeführt wird:

   #!/bin/sh
   #
   # /etc/ppp/ip-down.d/98firewall-down
   #
   # Mit diesem Skript stellt man den Zustand vor Hochfahren des Skriptes
   # "/etc/ppp/ip-up.d/1firewall-up" wieder her
   #
   # Author: Martin Bock
   # Date:   01-May-2000
    
   # Einige Shell-Variablen
   #
   IPC="/sbin/ipchains"
    
   # Alle Chains loeschen
   #
   # $IPC -F forward (look at /etc/init.d/masquerade)
   $IPC -F input
   $IPC -F output
    
   # Default Policy
   #
   #$IPC -P forward ACCEPT (look at /etc/init.d/masquerade)
   $IPC -P input ACCEPT
   $IPC -P output ACCEPT
   #
   IPC="/sbin/ipchains"
    
   # Alle Chains loeschen
   #
   # $IPC -F forward (look at /etc/init.d/masquerade)
   $IPC -F input
   $IPC -F output
    
   # Default Policy
   #
   #$IPC -P forward ACCEPT (look at /etc/init.d/masquerade)
   $IPC -P input ACCEPT
   $IPC -P output ACCEPT
    
   # Die geladenen Module wieder entladen
   #
   for i in /lib/modules/$(uname -r)/ipv4/ip_masq_*
   do
       /sbin/rmmod $(basename $i .o) 1> /dev/null 2> /dev/null
   done
   

3. Sonstiges

Du kannst Die die Skripte von meiner Download-Site herunterladen.

Zur Ergänzung jetzt noch ein paar Links:


Valid XHTML 1.0

Zurück zur Main-Site
Impressum
Created with GNU-Emacs on Tue Jun 26 17:08:43 CEST 2001

Valid CSS