#!/bin/bash
# 2004-05-12_firewall.sh v0.2, 20040518, Josef Angstenberger
#   Loopbackinterface lo0 in lo umbenannt
# 2004-05-12_firewall.sh v0.1, 20040414, Sebastian Scheible
#
# Eine Beispielimplementierung der am YaLUG-Abend 12.5.2004 gezeigten
# einfachen Firewall. Ich habe bewusst auf komplexe, aber einfacher 
# wartbare Lösungen verzichtet, das hier soll ja leicht zu verstehen sein.
# Die 'man iptables' hilft dabei gerne. Noch was: 
# Um Regeln für die Firewall aufzustellen, sind root-Rechte nötig. 
#
# Dann noch eins, ich zitiere hier mal den Jakob:
# Es koennen Fehler enthalten sein, es wird nicht auf moegliche
# Sicherheitsluecken und Fehlerbehandlung geachtet.
# In keinem Fall sind die Loesungen optimal. Ausserdem ist die
# Anzahl der Kommentare aeusserst unnatuerlich, aber fuer
# Anfaenger notwendig, da es sonst keine Dokumentation gibt.
#
# Es ist reines Anschauungsmaterial und darf nur als solches
# verwendet werden. Insbesondere darf es nicht ausgefuehrt werden.
# Wer dem zuwider handelt, ist fuer saemtliche Folgen selbst
# verantwortlich.

# =============================================================================

# Aufräumen - Ketten leeren (-F) und leere löschen (-X).  
# Die Standardketten INPUT, FORWARD und OUTPUT bleiben bestehen.
iptables -F
iptables -X

# Standardpolitik (policy) setzen. OUTPUT ist OK, INPUT und FORWARD nicht.
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopbackinterface lo ist OK - da geht diverser Netzwerkverkehr zwischen 
# lokalen Prozessen durch.
iptables -A INPUT -i lo -j ACCEPT

# Lokales Netz (hängt an Netzwerkkarte eth0) ist OK. Man kann auch sagen, 
# aller Verkehr, der nicht vom Internet-Device kommt, ist OK, das sieht dann
# aus wie die auskommentierte Zeile danach (man bemerke die Negierung mit "!").
iptables -A INPUT -i eth0 -j ACCEPT
#iptables -A INPUT -i ! ppp0  -j ACCEPT

# Antworten auf meine Anfragen ans Internet (Device ppp0) sind OK
# Dass ein Paket eine Antwort ist, erkennen wir mit Hilfe 
# der Paketzustandserkennung ("--match state --state ESTABLISHED,RELATED"). 
# --match state sagt aus, dass das Paket den im Folgenden definierten Zustand 
# haben muss, damit die Regel angewandt wird. --state ESTABLISHED,RELATED 
# besagt, dass das Paket zu einer bestehenden Verbindung gehört 
# (siehe manpage).  Damit die Zustangserkennung funktioniert, müssen zwei 
# Module geladen sein, "ip_conntrack" und "ipt_state".
modprobe ip_conntrack
modprobe ipt_state
iptables -A INPUT -i ppp0 --match state --state ESTABLISHED,RELATED -j ACCEPT

# Pakete, die bis hier von keiner Regel abgehandelt wurden, werden von der
# Standardpolitik erledigt, also INPUT DROP, FORWARD DROP und OUTPUT ACCEPT.

# Zum Schluss noch die jetzt eingestellten Regeln zur Demonstration ausgeben. 
# Leider wird dabei das device nicht angezeigt. 
iptables -L


