Netfilter

Netfilter ist eine KernelKomponente ähnlich wie der LinuxPacketScheduler. Beide dienen der Steuerung und Regelung des Netzwerkverkehrs indem einzelne Pakete aufgrund ihrer Merkmale und den eingestellten Regeln zufolge manipuliert werden. Mit Netfilter lässt sich z.B. Network Address Translation durchführen und auch die Filterung von Paketen zur Errichtung einer Firewall.

iptables Grundlagen

Das iptables-Regelwerk ist in Form von Ketten aufgebaut. Die enthaltenen Regeln werden der Reihe nach abgearbeitet, bis eine Regel sagt, dass Schluss sei, oder wenn die Kette zu Ende ist.

Im Kernel gibt es immer (mindestens) drei Ketten: INPUT, OUTPUT und FORWARD. Je nachdem wo ein Paket herkommt (lokal oder extern) und wo es hingeht (lokal oder extern) gelangt es in eine dieser drei Ketten.

Wenn im Kernel das Forwarding nicht aktiviert ist, oder wenn der Kernel nicht weiß, wie er ein Paket weiterleiten soll, dann wird das Paket ohne Abarbeitung der FORWARD-Kette weggeworfen.

                               _____
Eingehend                     /     \         Ausgehend
       -->[Routing- ]   ---> |FORWARD|------->
          [entscheidung]      \_____/      ^
                 |                         |
                 v                        ____
                ___                      /    \
               /   \                    |OUTPUT|
              |INPUT|                    \____/
               \___/                       ^
                 |                         |
                  ----> Lokaler Prozess ---

Eine Regel in einer Kette sagt Wenn ein Paket bestimmten Kriterien entspricht, mache dies oder jenes damit. Wenn die Kriterien einer Regel nicht auf das Paket zutreffen, wird die nächste Regel befragt. Wenn die Kette zu Ende ist, ohne dass eine Regel gepasst hat, dann entscheidet die Policy der Kette, was mit dem Paket geschehen soll. Wenn man keine Regeln definiert hat, ist die Policy ACCEPT, d.h. das Paket wird akzeptiert und wandert in obigem Diagramm weiter.

Um einen wirksamen Paketfilter aufzubauen, sollte man zuerst die Policy der Ketten auf DROP setzen. Dadurch können erstmal gar keine Pakete den Kernel passieren.

iptables -P <Kette> DROP

Danach schaltet man nach und nach die benötigten Dienste wieder frei.

iptables -A <Kette> <kriterien> -j ACCEPT

Kriterien können z.B. sein:

Beispiel:

iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

Pakete einer bereits bestehenden Verbindung hereinlassen

Regelwerk anzeigen lassen:

iptables -L -v [Kette]

Für weitere Filterkriterien und Möglichkeiten der Kettenbearbeitung sollte man die ManPage zu iptables konsultieren.

Beispiel einer einfachen Paketfilter-FireWall

(alle Verbindungsversuche von aussen abblocken) für einen einzelnen per Modem oder DSL an's Internet angeschlossenen Linuxrechner (wer ISDN benutzt, muss ppp+ durch ippp+ ersetzen):

# Alles, worauf keine Regel passt, verwerfen
iptables -P input DROP

# Pakete, die zu bereits bestehenden Verbindungen gehören (oder damit zusammenhängen) erlauben
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# neue Verbindungen nur dann erlauben, wenn sie NICHT über das externe Interface pppX reinkommen
iptables -A INPUT -m state --state NEW -i ! ppp+ -j ACCEPT

# unerwünschte (=alle noch nicht akzeptierten) Pakete in's Log schreiben
iptables -A INPUT -m limit -j LOG --log-prefix "Bad packet:"

Achtung: Das LOG Ziel führt nicht dazu, dass die Abarbeitung der Kette beendet wird.

Bemerkungen

Debian: Paketfilter automatisch laden

Zunächst einmal von Hand eingeben (oder Script schreiben und ausführen):

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! ppp+ -j ACCEPT
iptables -A INPUT -m limit -j LOG --log-prefix "Bad packet:"

dann:

# /etc/init.d/iptables save active

Ausgabe:

Saving iptables ruleset: save "active" with counters.

Damit werden die Regeln nach /var/lib/iptables/active geschrieben.

und dann:

# dpkg-reconfigure iptables

Auf die Frage Enable the iptables init.d script? mit Yes antworten.

Daraufhin wird der Link /etc/rcS.d/S40iptables -> ../init.d/iptables angelegt.

Fertig. Nach dem nächsten Reboot sollte der Paketfilter automatisch geladen werden.

Löschen von Regeln

Möchte man eine Regel löschen, muss man zuerst feststellen, welche Nummer sie hat:

iptables -t nat --list --line-numbers

Nach -t wird die Tabelle erwartet, was nebst nat auch filter, mangle oder raw sein kann. Das ergibt eine ähnliche Ausgabe wie diese hier:

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  anywhere             anywhere            tcp dpt:smtp to:192.168.1.2 
2    DNAT       tcp  --  anywhere             anywhere            tcp dpt:pop3 to:192.168.1.2 
3    DNAT       tcp  --  anywhere             anywhere            tcp dpt:nntp to:192.168.1.2 
4    DNAT       tcp  --  anywhere             anywhere            tcp dpt:www to:192.168.1.64 

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  192.168.1.0/24       anywhere            
2    MASQUERADE  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Möchte man nun beispielsweise das Weiterleiten von Paketen zu 192.168.1.64:80 löschen, gibt man

iptables -t nat -D PREROUTING 4

ein.

Weitere Beispiele

Transparenter Proxy

Dies ist ein beliebter Trick, um HTTP-Verbindungen grundsätzlich über einen Proxy zu lenken. Am Einfachsten ist das mit squid, dazu braucht man folgende Einträge in der squid.conf:

httpd_accel_host [<ip des eigentlichen Servers>|virtual]
httpd_accel_port [<port des eigentlichen Servers>|0]
# wir wollen auch noch cachen
httpd_accel_with_proxy on
# wir wollen auf den Host: haeder schauen
httpd_accel_uses_host_header on

Des weiteren muss man alle http-Verbindungen zum Proxy umlenken:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <ip>:<proxy port>

FTP/IRC & Connection Tracking

Damit Protokolle mit getrennter Daten- und Kontrollverbindung (ftp (aktiv und passiv), irc dcc) auch hinter einer Firewall richtig funktionieren, muss man das Connection Tracking aktivieren. Dies passiert, indem man die entsprechenden Kernel Module lädt: ip_conntrack, ip_conntrack_ftp für ftp und ip_conntrack_irc für irc (dcc).

Zusätzlich sollte man, wenn man NAT benutzt, noch die Module ip_nat_ftp für ftp und ip_nat_irc für irc laden.

Debian: Console sauber halten

Die Defaulteinstellungen von Debian führen zu oft unerwünschten Ausgaben auf der aktuellen Konsole - Lösung siehe Seite klogd.

weitere Infos

Tools und Distributionen

sind auf der FireWall Seite.

Fragen & Antworten

Netfilter (zuletzt geändert am 2012-03-19 17:50:08 durch stgt-5f709628)