Firewall mit iptables

Grundlagen

In einem Kernel der 2.4.x-Reihe aktiviert man die Netfilter-Unterstützung in der Sektion "Networking". Dann wird das Untermenü IP: Netfilter Configuration benutzbar, worin man die folgenden Optionen anwählt..

[*] Connection tracking (required for masq/NAT)
[*]   FTP protocol support
[*]   IRC protocol support
[ ] Userspace queueing via NETLINK (EXPERIMENTAL)
[*] IP tables support (required for filtering/masq/NAT)
[*]   limit match support
[*]   MAC address match support
[*]   netfilter MARK match support
[*]   Multiple port match support
[*]   TOS match support
[ ]   LENGTH match support
[ ]   TTL match support
[*]   tcpmss match support
[*]   Connection state match support
[ ]   Unclean match support (EXPERIMENTAL)
[ ]   Owner match support (EXPERIMENTAL)
[*]   Packet filtering
[*]     REJECT target support
[*]     MIRROR target support (EXPERIMENTAL)
[*]   Full NAT
[*]     MASQUERADE target support
[*]     REDIRECT target support
[ ]     Basic SNMP-ALG support (EXPERIMENTAL)
[*]   Packet mangling
[*]     TOS target support
[*]     MARK target support
[*]   LOG target support
[*]   TCPMSS target support

Anhand der Fülle der Optionen ist erahnbar, wie mächtig die Netfilter sind. Für DSL-Nutzer sind die Punkte "tcpmss match support" und "TCPMSS target support" unbedingt zu selektieren. Anderfalls sind einige Seiten im Internet nicht erreichbar. Diese beiden Einstellungen bewirken, dass die Paketgröße für PPPoE angepasst wird.

Regeln für das interne Netzwerk

Wir erlauben im Intranet die folgenden Dienste:

Regeln für das interne Netzwerk
Dienst Bedeutung TCP-Port UDP-Port Ziel
icmp damit ping funktioniert und wir Fehlermeldungen erhalten krypton
ftp Datenaustausch via ftp Datenport: 20, Steuerport: 21 alle
ssh verschlüsselte Shell 22 alle
telnet unverschlüsselte Shell 23 alle
smtp Mails versenden 25 krypton
dns Domain Name Server 53 53 krypton auf Port 5353 leiten
http Internet 80 alle, auf krypton Port 8080 leiten
pop3s Mails empfangen 995 krypton
netbios Samba, Windowsfreigaben 137-139 137-139 alle
https verschlüsseltes Internet 443 alle, auf krypton Port 8443 leiten

Das sind die Regeln für den internen Netzverkehr. Ping ist erlaubt. Auch ftp, telnet und ssh dürfen als Ziel krypton haben. Es ist also erlaubt, sich aus dem internen Netz auf krypton anzumelden. Der Mailverkehr (smtp, pop3s) soll auch erlaubt sein. DNS-Anfragen sollen nur an krypton gerichtet werden, da hier ja ein DNS-Server läuft, der auch die Ergebnisse zwischenspeichert. Allerdings werden die Anfragen auf Port 5353 umgeleitet, weil der DNS-Server aus Sicherheitsgründen nicht als root läuft und somit keinen Port, der unter 1024 liegt, verwenden kann. Interne WWW-Anfragen werden auf Port 8080 umgelenkt, die anderen werden erlaubt. Der Samba-Server und die Windows-Klienten senden ihre Daten im NetBios-Format. Deshalb sind diese 3 Ports erlaubt.

Regeln für das externe Netzwerk

Der externe Netzverkehr muss sehr sorgfältig abgesichert werden. Angriffe aus dem Netz sind sonst Tür und Tor geöffnet.

ICMP-Pakete werden akzeptiert, wenn sie aus dem internen Netz kommen. ICMP-Pakete von außerhalb werden nur erlaubt, wenn sie Rückantworten oder spezielle Fehlermeldungen sind. Somit wird das Ausspionieren der Netzstruktur hinter dem Router erschwert.

DNS, SMPT und POP3S düfen nur von krypton selbst initiiert werden. Den anderen Rechnern im Netz sollte dies nicht erlaubt werden, da auf krypton ein Mail- und DNS-Server installiert ist.

Telnet, ssh, rlogin, exec, talk, ntalk und WWW-Anfragen vom Intra- ins Internet werden zugelassen. Die andere Richtung wird jedoch verboten. TCP-Pakete haben das SYN-Bit gesetzt ist, wenn sie eine Verbindung initiieren. Und diese Art von Pakete werden wir verbieten.

FTP braucht die unpriviligierten TCP-Ports (>1024). Deshalb werden diese freigegeben. Dies ist ein Sicherheitsrisiko, da z.B. BackOrifice und andere trojanische Pferde diese Ports für ihre Attacken benutzen. Man kann die bekannten Ports sperren, aber jede neue Version kann neue Ports benutzen, so dass absolute Sicherheit in diesem Fall nicht gewährleistet ist. Abhilfe schafft ein iptables-Modul, dass der neuen Netzfilter-Architektur von Linux beiliegt. Dieses Modul überwacht den FTP-Verkehr, und schaltet nur die benötigten Ports frei, wenn Bedarf besteht.

NetBIOS-Pakete lehnen wir grundsätzlich ab, denn es soll ja keiner auf unsere freigegenen Daten zugreifen dürfen.

Das Skript

iptables hat den Vorteil, die vielen Module und Erweiterungen, wie Portmasquerading, aktives FTP usw., direkt und einfacher zu unterstützen. Damit ist es kaum noch notwendig, extra Module und komplizierte Syntax zu benutzen. Ich gehe davon aus, dass die Kerneltreiber für iptables fest in den Kernel, also nicht modular, eingebunden sind. Anderfalls muss man die entsprechenden Module teilweise händisch nachladen.

Das Skript /etc/init.d/iptables wird in die entsprechenden Runlevels verlinkt.

#!/bin/sh
# Begin /etc/init.d/firewall

source /etc/init.d/functions

LAN_DEV="eth1"
WAN_DEV="ppp0 ippp0"
IPTABLES="/usr/local/sbin/iptables"

LOCAL="127.0.0.1"
SELF="192.168.0.1"
LAN="192.168.0.0/16"

DNS_SERVER="194.25.0.125 194.25.2.129 194.25.2.130 194.25.2.131 145.253.2.11 145.253.2.75 130.149.17.5 130.149.17.13 212.185.151.9"
SMTP_SERVER="193.28.100.151 217.160.132.51"
POP3_SERVER="161.58.167.54 195.20.224.211 195.20.224.215 195.211.178.194 212.227.35.215 212.227.35.219 212.227.126.129 212.227.126.130 212.227.126.131 212.227.126.134 212.227.126.138 212.227.126.141 212.227.126.142  212.227.126.154 212.227.126.165 212.227.126.167 212.227.126.172 151.189.8.101 213.165.65.60 213.165.64.20"

POP3S_SERVER="130.149.17.13 64.39.38.43 161.58.167.54 193.28.100.151 194.29.232.82 195.211.178.194 217.160.132.51"
TIME_SERVER="129.69.1.153 130.149.17.8 130.149.17.21 131.173.17.7 131.188.1.31 131.188.1.40 131.188.1.45 131.188.34.45 131.188.34.75 131.188.34.107 134.93.132.118 192.53.103.103 192.53.103.104 194.95.250.35 194.95.250.36 195.145.119.188"

case "$1" in
start)
  echo "Starting firewall..."

  #load necessary modules
  #/sbin/modprobe ip_conntrack_ftp
  #/sbin/modprobe ip_nat_ftp

  #clear all chains and delete all rules
  $IPTABLES -F
  $IPTABLES -F -t nat
  $IPTABLES -F -t mangle
  $IPTABLES -X
  $IPTABLES -X -t nat
  $IPTABLES -X -t mangle

  #logs all dropped packets
  $IPTABLES -N DROPLOG
  $IPTABLES -A DROPLOG -m limit -j LOG --log-prefix="dropped packet: "
  $IPTABLES -A DROPLOG -j DROP

  #informs about nmaps-Scans
  $IPTABLES -N SCANLOG
  $IPTABLES -A SCANLOG -m limit -j LOG --log-prefix="nmap scan: "
  $IPTABLES -A SCANLOG -j DROP

  #logging of invalid packets, perhaps part of a portscan
  $IPTABLES -N INVALIDLOG
  $IPTABLES -A INVALIDLOG -m limit -j LOG --log-prefix="invalid packet: "
  $IPTABLES -A INVALIDLOG -j DROP

  #INPUT, OUTPUT sperren, FORWARDing aktivieren
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -P PREROUTING  ACCEPT -t nat
  $IPTABLES -P POSTROUTING ACCEPT -t nat
  $IPTABLES -P OUTPUT      ACCEPT -t nat

  #Transferlaenge bei DSL auf 1492 begrenzen, wichtig fuer DSL
  $IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

  echo -n "   Setting up mangle table..."
  #quality of service settings:
  ##ACKS
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp -m length --length :64 -j MARK --set-mark 10

  #SSH/CS/HTTP/IRC (highest priority)
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 22    -j MARK --set-mark 11
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 53    -j MARK --set-mark 11
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p udp --dport 53    -j MARK --set-mark 11
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 80    -j MARK --set-mark 11
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 6667  -j MARK --set-mark 11
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 31337 -j MARK --set-mark 11

  #SMTP/emule als Bulk markieren
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 25   -j MARK --set-mark 13
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 4661 -j MARK --set-mark 13
  $IPTABLES -A POSTROUTING -t mangle -o ppp0 -p tcp --dport 4662 -j MARK --set-mark 13
  print_status success

  ### lo, alles erlauben
  echo -n "   Setting up rules for device lo..."

  #disable spoofing
  #$IPTABLES -A INPUT  -p all -i lo ! -s $LOCAL -j REJECT
  #$IPTABLES -A OUTPUT -p all -o lo ! -d $LOCAL -j REJECT

  #53 -> 5353, 80 -> 8080 (lokal), 80 -> 3128 (remote) und Port 443 -> 8443
  #accept all
  $IPTABLES -A OUTPUT -t nat -o lo -p tcp -d $LOCAL --dport 53  -j DNAT --to $SELF:5353
  $IPTABLES -A OUTPUT -t nat -o lo -p tcp -d $SELF  --dport 53  -j DNAT --to $SELF:5353
  $IPTABLES -A OUTPUT -t nat -o lo -p udp -d $LOCAL --dport 53  -j DNAT --to $SELF:5353
  $IPTABLES -A OUTPUT -t nat -o lo -p udp -d $SELF  --dport 53  -j DNAT --to $SELF:5353
  $IPTABLES -A OUTPUT -t nat -o lo -p tcp -d $LOCAL --dport 80  -j DNAT --to $SELF:8080
  $IPTABLES -A OUTPUT -t nat -o lo -p tcp -d $SELF  --dport 80  -j DNAT --to $SELF:8080
  $IPTABLES -A PREROUTING -t nat -i lo -p tcp -d ! $LAN --dport 80 -j REDIRECT --to-port 3128
  $IPTABLES -A OUTPUT -t nat -o lo -p tcp -d $LOCAL --dport 443 -j DNAT --to $SELF:8443
  $IPTABLES -A OUTPUT -t nat -o lo -p tcp -d $SELF  --dport 443 -j DNAT --to $SELF:8443
  $IPTABLES -A INPUT  -p all -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -p all -o lo -j ACCEPT
  print_status success

  for i in $LAN_DEV
  do
    echo -n "   Setting up rules for device $i..."
    #disable spoofing
    #$IPTABLES -A INPUT  -i $i -p all ! -s $LAN -j REJECT
    #$IPTABLES -A OUTPUT -o $i -p all ! -d $LAN -j REJECT

    #Output erlauben
    $IPTABLES -A OUTPUT  -o $i -j ACCEPT
    $IPTABLES -A INPUT   -i $i -m state --state ESTABLISHED,RELATED -j ACCEPT

    #icmp
    $IPTABLES -A INPUT   -i $i -p icmp -j ACCEPT

    #echo
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 7 -j ACCEPT

    #aktives ftp, telnet, ssh
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 20:23 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --sport 20:23 -j ACCEPT

    #smtp
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 25 -j ACCEPT

    #DNS
    $IPTABLES -A PREROUTING -t nat -i $i -p tcp -s $LAN -d $SELF --dport 53 -j REDIRECT --to-port 5353
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 5353 -j ACCEPT
    $IPTABLES -A PREROUTING -t nat -i $i -p udp -s $LAN -d $SELF --dport 53 -j REDIRECT --to-port 5353
    $IPTABLES -A INPUT   -i $i -p udp -s $LAN -d $SELF --dport 5353 -j ACCEPT

    #DHCP
    $IPTABLES -A INPUT   -i $i -p udp --dport 67:68 -j ACCEPT

    #www (lokale www-Anfragen an Port 8088 leiten, sonst erlauben)
    #www (entfernte Anfragen ueber transparenten Proxy leiten)
    $IPTABLES -A OUTPUT  -t nat -o $i -p tcp -d $SELF --sport 80 -j DNAT --to $SELF:8080
    $IPTABLES -A PREROUTING -t nat -i $i -p tcp -d $SELF --dport 80 -j DNAT --to $SELF:8080
    $IPTABLES -A PREROUTING -t nat -i $i -p tcp -d ! $LAN --dport 80 -s 192.168.0.3 -j REDIRECT --to-port 3128

    $IPTABLES -A INPUT   -i $i -p tcp --dport 80 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 8080 -j ACCEPT

    #pop3
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 110 -j ACCEPT

    #auth
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN --dport 113 -j ACCEPT

    #erlaubt netbios (ns, dgm, ssn)
    $IPTABLES -A INPUT   -i $i -p tcp --dport 137:139 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp --sport 137:139 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p udp --dport 137:139 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p udp --sport 137:139 -j ACCEPT

    #https
    #$IPTABLES -A OUTPUT -t nat -o $i -p tcp -d $SELF --dport 443 -j DNAT --to $SELF:8443
    $IPTABLES -A PREROUTING -t nat -i $i -p tcp -d $SELF --dport 443 -j REDIRECT --to-port 8443
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 8443 -j ACCEPT

    #LPRng
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --sport 445 -j ACCEPT

    #pop3s
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 995 -j ACCEPT

    #squid
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 3128 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -d $LAN -s $SELF --sport 3128 -j ACCEPT

    #mysql
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 3306 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -d $LAN -s $SELF --sport 3306 -j ACCEPT

    #mldonkey
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 4000:4002 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 4080 -j ACCEPT

    #hylafax
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 4558:4559 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -d $LAN -s $SELF --sport 4558:4559 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 32998 -j ACCEPT

    #counter-strike
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN --dport 27015 -j ACCEPT

    $IPTABLES -A INPUT   -i $i -p udp -s $LAN --dport 27005:27015 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p udp -s $LAN --sport 27005:27015 -j ACCEPT

    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --sport 27060 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 27060 -j ACCEPT

    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --sport 24347 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN -d $SELF --dport 24347 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p udp -s $LAN -d $SELF --sport 24347 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p udp -s $LAN -d $SELF --dport 24347 -j ACCEPT

    #wc3
    $IPTABLES -A INPUT   -i $i -p tcp -s $LAN --dport 6112 -j ACCEPT
    $IPTABLES -A INPUT   -i $i -p udp -s $LAN --dport 6112 -j ACCEPT
    print_status success
  done

  for i in $WAN_DEV
  do
    echo -n "   Setting up rules for device $i..."

    #MASQUERADING: hier wird alles maskiert, was rausgehen darf
    $IPTABLES -A POSTROUTING -t nat -o $i -s $LAN -d ! $LAN -j MASQUERADE

    #allow all outgoing traffic
    $IPTABLES -A OUTPUT -o $i -p all -j ACCEPT

    #allow established incoming connections
    $IPTABLES -A INPUT -i $i -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

    #icmp
    $IPTABLES -A INPUT  -i $i -p icmp --icmp-type 0  -j ACCEPT
    $IPTABLES -A INPUT  -i $i -p icmp --icmp-type 3  -j ACCEPT
    $IPTABLES -A INPUT  -i $i -p icmp --icmp-type 11 -j ACCEPT

    #ssh auf krypton weiterleiten
    $IPTABLES -A PREROUTING -t nat -i $i -p tcp --sport 1024: --dport 22 -j DNAT --to 192.168.0.50:22

    #www (81-90) auf krypton weiterleiten
    $IPTABLES -A PREROUTING -t nat -i $i -p tcp --sport 1024: --dport 81:90 -j DNAT --to 192.168.0.50:81-90

    print_status success
    #fi
  done

  ##NMAP Scans protokollieren
  ## NMAP FIN/URG/PSH
  $IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j SCANLOG
  ## Xmas Tree
  $IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j SCANLOG
  ## Another Xmas Tree
  $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j SCANLOG
  ##Null Scan(possibly)
  $IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j SCANLOG

  #drop all invalid packets
  $IPTABLES -A INPUT --match state --state INVALID --jump INVALIDLOG

  # den Rest protokollieren und wegschmeissen
  $IPTABLES -A INPUT  -j DROPLOG
  $IPTABLES -A OUTPUT -j DROPLOG
  ;;
stop)
  echo -n "Shutting down firewall"
  $IPTABLES -F -t nat
  $IPTABLES -F -t mangle
  $IPTABLES -F

  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT

  $IPTABLES -X -t nat
  $IPTABLES -X -t mangle
  $IPTABLES -X

  print_status success
  ;;
restart|reload)
  $0 stop && $0 start
  ;;
status)
  $IPTABLES -L -v -n -x -t nat
  $IPTABLES -L -v -n -x
  ;;
*)
  echo "Usage: $0 {start|stop|restart|reload|status}"
  exit 1
esac

exit 0

Am Anfang werden einige globale Variablen definiert. Zuerst wird festgelegt, welche Netzwerkgeräte intern (LAN) und extern (WAN) sind. Im internen Bereich wird man normalerweise mehr erlauben als dem Rest der Welt. Danach folgt die Angabe, der Nameserver, die wir befragen wollen. Die Benutzung anderer Nameserver wird verwehrt. Analog gilt das für die SMTP-Server. Hier werden die Rechner angegeben, über die wir unsere Mail versenden. In diesem Falle ist es genau einer. In POP3-Server stehen alle Server, von denen wir Mail abholen. In POP3S analog, wo wir die Mails verschlüsselt abholen. Zum Schluss wird noch angegeben, welche Zeitserver wir zur Uhrzeitsynchronisation benutzen. Damit sollte es keine Probleme bereiten, dieses Skript eigenen Bedürfnissen anzupassen und zu verwenden.

Das iptables Programm ermöglicht es, Regeln in Grupen zusammenzufassen. Zum Beispiel deklariere ich die Gruppe DROPLOG, in der die abgelehnten Pakete zuerst limitiert protokolliert und dann verworfen werden. Später genügt es dann einfach, als Ziel diese Gruppe anzugeben. Der Sinn dieser Gruppe ist es, eine moderate und kontrollierte Protokollierung sicherzustellen. Falls zu schnell zu viele Pakete abgelehnt werden, wird das nur einige Male ins Log geschrieben.

Bei der Initialisierung der Firewallregeln werden zunächst alle Gruppen geleert, dann gelöscht und schließlich alle Regeln entfernt. Zusätzlich werden die Standardregeln auf restriktive Werte gesetzt. Auch hier gilt, man sollte immer erst alles verbieten, und dann nach und nach die Dienste erlauben, die man benötigt bzw. zulassen möchte.

Dem loopback-Gerät wird generell alles erlaubt. Einige Dienste wie DNS-Anfragen werden jedoch auf andere Ports umgeleitet. Der Nameserver läuft nicht mehr unter Rootkennung, dafür muss er auf einem größeren Port als 1024 laufen. Die Programme erwarten aber, dass ein Nameserver auf Port 53 lauscht. Ich werde also alle Anfragen nach Port 53 auf Port 5353 weiterleiten. Analog leite ich lokale Webanfragen an Port 8080 bzw. 8443. Sollte bei einer dieser Regeln eine Fehlermeldung auftauchen, so ist der Kernel nicht mit den benötigten Netfilter-Optionen ordnungsgemäß übersetzt bzw. das entsprechende Modul nicht geladen worden.

Die Konfiguration des externen Netzwerkgerätes ist etwas komplizierter. Hier sollte man wirklich nur das freigeben, was wirklich nötig ist. Die erste Regel dient dem Maskieren ausgehender Pakete. Das bedeutet, dass die ins Internet versendeten Pakete eine gültige Absendeadresse erhalten. Hier wird automatisch die Originaladresse durch die IP-Nummer des externen Netzwerkgerätes ersetzt. Die meisten Regeln nutzen die Fähigkeiten von iptables aus, nicht nur einfacher Paketfilter zu sein, sondern die Besonderheiten des TCP-Protokolls zu beachten (Stateful Firewall). Damit lassen sich weitaus genauere Regeln erstellen und sogar die meisten Portscans erkennen.

Portweiterleitung

Eine Besonderheit ist das Weiterleiten eingehender Verbindungen an interne Rechner. Normalerweise weiß die Firewall ja nicht, zu welchem Client die ankommende Verbindung gehört. Hier leite ich z.B. explizit eingehende Aimster-Verbindungen an den Rechner mig mit der IP 192.168.0.2 weiter.

#aimster (eingehende Verbindungen an 192.168.0.2 weiterleiten)
i="ppp0"
$IPTABLES -A INPUT -p tcp -i $i --dport 5190 --sport 1024: -j ACCEPT
$IPTABLES -A INPUT -p udp -i $i --dport 5190 --sport 1024: -j ACCEPT
$IPTABLES -A PREROUTING -t nat -i $i -p tcp --dport 5190 -j DNAT --to 192.168.0.2:5190
$IPTABLES -A PREROUTING -t nat -i $i -p udp --dport 5190 -j DNAT --to 192.168.0.2:5190

Für alle Pakete, für die keine Regel zuständig war, werden weiter untersucht. Zuerst werden sie auf Merkmale einige wichtiger Portscan-Methoden überprüft. Zum Schluß werden sie protokolliert und abgelehnt.