#!/bin/sh # # /usr/etc/ipchain/ipchain.jo # # Dieses Skript konfiguriert einen einfachen Firewall mit IP-Maskerading # fuer ein lokales Netz $LOCAL und eine externe Verbindung zum Internet $EXTERN # es werden die ueblichen Dinste (www, ftp, ...) erlaubt, alles uebrige wird # abgeblockt # # Weitere Information: # http://www.jwiesemann.de/linux/ipchains.html # c't 17/99, Seite 194 # ipchains HowTo # # setze Variablen: Interface und Netz fuer internes Netz (loopback) INTERN=lo INTERNADR=127.0.0.1 INTERNNET=127.0.0.0/255.255.255.255 # setze Variablen: Interface, Adresse und Netz fuer lokales Netz LOCAL=eth0 LOCALADR=192.168.0.1 LOCALNET=192.168.0.0/255.255.255.0 # setze Variablen: Interface fuer externes Netz EXTERN=ppp0 # setze ipchains vollstaendig zurueck # loesche alle chains und setzte "Politik" auf nicht akzeptieren logger setze ipchains fuer firewalling a la Jo ipchains -F ipchains -P input DENY ipchains -P forward DENY ipchains -P output ACCEPT # erzeuge chains zur einfacheren Verwaltung ipchains -N loc2ext 2>/dev/null ipchains -N loc2int 2>/dev/null ipchains -N ext2int 2>/dev/null ipchains -N any2ext 2>/dev/null ipchains -N int2loc 2>/dev/null ipchains -F loc2ext ipchains -F loc2int ipchains -F ext2int ipchains -F any2ext ipchains -F int2loc # fuer ICPM Error Packete ipchains -N icmp-acc 2>/dev/null ipchains -F icmp-acc #----------------------------------------------------------------------------- # setze input chain # akzeptiere Fehlermeldungen von ueberall ipchains -A input -p ICMP -j icmp-acc # Kommunikation zwischen extern und intern / lokal (kein return) ipchains -A input -i $EXTERN -j ext2int # Kommunikation zwischen lokal und intern (kein return) ipchains -A input -i $LOCAL -d $LOCALADR -j loc2int # Kommunikation zwischen lokal und extern (wird in forward chain gefiltert) ipchains -A input -i $LOCAL -j ACCEPT # Kommunikation zwischen intern und extern / lokal ipchains -A input -i $INTERN -j ACCEPT # Schluss mit lustig! ipchains -A input -j DENY -l #----------------------------------------------------------------------------- # setze forward chain # Teile Pakete in die einzelnen Chain (je nach Richtung) # was uebrigbleibt wird abgelehnt und ge"logged" # (in forward chain ist Interface das, wo es rausgeht!) ipchains -A forward -s $LOCALNET -i $EXTERN -j loc2ext # Schluss mit lustig! ipchains -A forward -j DENY -l #----------------------------------------------------------------------------- # setze output chain # Kommunikation nach extern (kein return) ipchains -A output -i $EXTERN -j any2ext # Kommunikation von intern nach lokal (kein return) ipchains -A output -i $LOCAL -s $LOCALADR -j int2loc # restliche Pakete (demaskierte Antworten) werden ueber Policy akzeptiert #----------------------------------------------------------------------------- # setze chain fuer ICPM-Error Packete # wird aus input chain aufgerufen: # ipchains -A input -p ICMP -j icmp-acc # Fehlermeldungen werden akzeptiert, sonst klappt keine Kommunikation # der anderen Protokolle, der Rest geht wieder zurueck in die aufrufende # chain ipchains -A icmp-acc -p ICMP --icmp-type destination-unreachable -j ACCEPT ipchains -A icmp-acc -p ICMP --icmp-type source-quench -j ACCEPT ipchains -A icmp-acc -p ICMP --icmp-type time-exceeded -j ACCEPT ipchains -A icmp-acc -p ICMP --icmp-type parameter-problem -j ACCEPT # akzepiere Anworten auf Ping von ueberall ipchains -A icmp-acc -p ICMP --icmp-type pong -j ACCEPT #----------------------------------------------------------------------------- # setze chain extern to intern # wird aus input chain aufgerufen: # ipchains -A input -i $EXTERN -j ext2int # verhindere spoofing (vortaeuschung falscher Adressen) ipchains -A ext2int -s $INTERNNET -j DENY -l ipchains -A ext2int -s $LOCALNET -j DENY -l # verhindere Verbindungsaufbau von aussen ipchains -A ext2int -p TCP -y -j DENY -l # akzepiere Anworten auf Ping nach extern ipchains -A ext2int -p ICMP --icmp-type pong -j ACCEPT # akzeptiere Antworten auf maskierte Pakete (gehen nach local!) ipchains -A ext2int -p TCP --dport 61000:65096 -j ACCEPT ipchains -A ext2int -p UDP --dport 61000:65096 -j ACCEPT # verhindere Zugriff auf X-Windows ipchains -A ext2int -p TCP --dport 6000:6063 -j DENY -l ipchains -A ext2int -p UDP --dport 6000:6063 -j DENY -l # akzeptiere Anwortenen auf Pakete von intern ipchains -A ext2int -p TCP --dport 1024: -j ACCEPT ipchains -A ext2int -p UDP --dport 1024: -j ACCEPT # Schluss mit lustig! ipchains -A ext2int -j DENY -l #----------------------------------------------------------------------------- # setze chain local to intern # wird aus input chain aufgerufen: # ipchains -A input -i $LOCAL -d $LOCALADR -j loc2int # kein spoofing ipchains -A loc2int -s ! $LOCALNET -j DENY # akzepiere Nameserveranfragen von lokal ipchains -A loc2int -p TCP --dport domain -j ACCEPT ipchains -A loc2int -p UDP --dport domain -j ACCEPT # akzepiere email von /nach lokal ipchains -A loc2int -p TCP --dport pop3 -j ACCEPT ipchains -A loc2int -p TCP --dport imap -j ACCEPT ipchains -A loc2int -p TCP --dport smtp -j ACCEPT # akzeptiere www / proxy von lokal ipchains -A loc2int -p TCP --dport http -j ACCEPT ipchains -A loc2int -p TCP --dport https -j ACCEPT ipchains -A loc2int -p TCP --dport 8080 -j ACCEPT # akzeptiere telnet von lokal ipchains -A loc2int -p TCP --dport telnet -j ACCEPT ipchains -A loc2int -p TCP --dport ssh -j ACCEPT # akzeptiere netbios von lokal ipchains -A loc2int -p TCP --dport netbios-ns -j DENY -l ipchains -A loc2int -p UDP --dport netbios-ns -j DENY -l ipchains -A loc2int -p TCP --dport netbios-dgm -j ACCEPT ipchains -A loc2int -p UDP --dport netbios-dgm -j ACCEPT ipchains -A loc2int -p TCP --dport netbios-ssn -j ACCEPT ipchains -A loc2int -p UDP --dport netbios-ssn -j ACCEPT # akzepiere ICMP nachrichten an lokal ipchains -A loc2int -p ICMP -j ACCEPT # akzepiere Anworten auf Authentifikationsanfragen nach lokal ipchains -A loc2int -p TCP --sport auth -j ACCEPT # akzeptiere alles, aber logge -> damit koennen die fehlenden # Service vielleicht gefunden werden # ipchains -A loc2int -j ACCEPT -l # Schluss mit lustig! (Lokal werden abgeblockte Pakete gemeldet) ipchains -A loc2int -j REJECT -l #----------------------------------------------------------------------------- # setze chain local to extern (masqerading) # wird aus forward chain aufgerufen: # ipchains -A forward -i $EXTERN -j ext2loc # www -> maskieren und weiterleiten ipchains -A loc2ext -p TCP --dport http -j MASQ ipchains -A loc2ext -p TCP --dport https -j MASQ # akzepiere email von /nach extern ipchains -A loc2ext -p TCP --dport pop3 -j MASQ ipchains -A loc2ext -p TCP --dport smtp -j MASQ # secure shell -> maskieren und weiterleiten ipchains -A loc2ext -p TCP --dport ssh -j MASQ # ftp -> maskieren und weiterleiten (Kommandos und Daten passiv) ipchains -A loc2ext -p TCP --dport ftp -j MASQ ipchains -A loc2ext -p TCP --dport 1024: -j MASQ # ping -> maskieren und weiterleiten ipchains -A loc2ext -p ICMP --icmp-type ping -j MASQ # AOL -> maskieren und weiterleiten ipchains -A loc2ext -p TCP --dport 5200 -j MASQ ipchains -A loc2ext -p UDP --dport 5190 -j MASQ # akzeptiere alles, aber logge -> damit koennen die fehlenden # Service vielleicht gefunden werden #ipchains -A loc2ext -j MASQ -l # Schluss mit lustig! (Lokal werden abgeblockte Pakete gemeldet) ipchains -A loc2ext -j REJECT -l #----------------------------------------------------------------------------- # setze chain any to extern # wird aus output chain aufgerufen: # ipchains -A output -i $EXTERN -j any2ext # akzepiere Nameserveranfragen nach extern ipchains -A any2ext -p TCP --dport domain -j ACCEPT ipchains -A any2ext -p UDP --dport domain -j ACCEPT # akzepiere email von /nach extern ipchains -A any2ext -p TCP --dport pop3 -j ACCEPT ipchains -A any2ext -p TCP --dport smtp -j ACCEPT # akzeptiere www nach extern ipchains -A any2ext -p TCP --dport http -j ACCEPT ipchains -A any2ext -p TCP --dport https -j ACCEPT # akzeptiere ftp nach extern (Kommandos und Daten passiv) ipchains -A any2ext -p TCP --dport ftp -j ACCEPT ipchains -A any2ext -p TCP --dport 1024: -j ACCEPT # akzeptiere ping nach extern ipchains -A any2ext -p ICMP --icmp-type ping -j ACCEPT # akzeptiere AOL nach extern (nur von lokal!) ipchains -A any2ext -s $LOCALNET -p TCP --dport 5200 -j ACCEPT ipchains -A any2ext -s $LOCALNET -p UDP --dport 5190 -j ACCEPT # akzeptiere alles, aber logge -> damit koennen die fehlenden # Service vielleicht gefunden werden #ipchains -A any2ext -j ACCEPT -l # Schluss mit lustig! (nach intern/lokal werden abgeblockte Pakete gemeldet) ipchains -A any2ext -j REJECT -l #----------------------------------------------------------------------------- # setze chain intern to local # wird aus output chain aufgerufen: # ipchains -A output -i $LOCAL -s $LOCALADR -j int2loc # akzepiere Antworten auf Nameserveranfragen von lokal ipchains -A int2loc -p TCP --sport domain -j ACCEPT ipchains -A int2loc -p UDP --sport domain -j ACCEPT # akzepiere Antworten auf email von /nach lokal ipchains -A int2loc -p TCP --sport pop3 -j ACCEPT ipchains -A int2loc -p TCP --sport imap -j ACCEPT ipchains -A int2loc -p TCP --sport smtp -j ACCEPT # akzeptiere Antworten auf www / proxy von lokal ipchains -A int2loc -p TCP --sport http -j ACCEPT ipchains -A int2loc -p TCP --sport https -j ACCEPT ipchains -A int2loc -p TCP --sport 8080 -j ACCEPT # akzeptiere Antworten auf telnet von lokal ipchains -A int2loc -p TCP --sport telnet -j ACCEPT ipchains -A int2loc -p TCP --sport ssh -j ACCEPT # akzeptiere Antworten auf netbios von lokal ipchains -A int2loc -p TCP --sport netbios-ns -j DENY -l ipchains -A int2loc -p UDP --sport netbios-ns -j DENY -l ipchains -A int2loc -p TCP --sport netbios-dgm -j ACCEPT ipchains -A int2loc -p UDP --sport netbios-dgm -j ACCEPT ipchains -A int2loc -p TCP --sport netbios-ssn -j ACCEPT ipchains -A int2loc -p UDP --sport netbios-ssn -j ACCEPT # akzepiere ICMP nach lokal ipchains -A int2loc -p ICMP -j ACCEPT # akzepiere Authentifikationsanfragen nach lokal ipchains -A int2loc -p TCP --dport auth -j ACCEPT # akzeptiere alles, aber logge -> damit koennen die fehlenden # Service vielleicht gefunden werden # ipchains -A intloc -j ACCEPT -l # Schluss mit lustig! (Lokal werden abgeblockte Pakete gemeldet) ipchains -A int2loc -j REJECT -l