Linux IP Firewalling Chains - IPCHAINS
Vortrag für das 26. Treffen der Chemnitz Linux User Group (CLUG) am
1998-10-09.
Autor : Alexander Schreiber
als@informatik.tu-chemnitz.de
1. Einführung
Linux ipchains ist eine Weiterentwicklung des alten Linux IPv4
Kernel-Level Firewall Codes welcher weitestgehend von BSD übernommen
wurde sowie eine Weiterentwicklung des ipfwadm Tools welches
seinerseits vom BSD ipfw Tool abstammt.
Mit der Kernelversion 2.1.102 löst ipchains das alte
ipfwadm-System offiziell ab. Ebenfalls verfügbar sind Patches
für die aktuellen production-Kernel (2.0.x).
Gründe für die Entwicklung von ipchains gibt es mehrere,
speziell Schwächen des alten Firewalling-Codes :
- nur 32-bit Zähler (jedenfalls auf x86),
- erlaubt nur Behandlung der Protokolle TCP, UDP und ICMP,
- keine Fragment-Behandlung,
- größere Änderungen können nicht atomar
durchgeführt werden,
- keine inversen Regeln,
- schwierig zu handhaben
Die offizielle Homepage des IPCHAINS-Projektes findet
sich unter http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html.
Weiterhin gibt es auch eine Mailingliste : ipchains, subscribe erfolgt via
Mail an ipchains-request@wantree.com.au, die Liste selbst ist unter
ipchains@wantree.com.au erreichbar.
Dieser Vortrag basiert auf dem aktuellen IPCHAINS-Howto.
2. Grundlagen von IPCHAINS
Ich werde an dieser Stelle nicht tiefer in die Grundlagen des Firewalling
mit all seinen Möglichkeiten eindringen als im Sinne der Erläuterung
von ipchains notwendig. Stattdessen will ich die Gelegenheit nutzen
alle an diesem Thema Interessierten auf das 27. CLUG-Treffen am
1998-11-06 hinzuweisen das sich ausgiebig mit diesem Thema beschäftigen
wird.
Grundlage von ipchains ist das Filtern auf Paketebene. Dabei
durchlaufen die Pakete mehrere Filterebenen. Der Kernel beginnt dabei mit
3 Regellisten, diese werden als Firewall-Ketten (firewall chains) oder
auch einfach nur als chains bezeichnet. Diese 3 anfänglichen
chains sind :
Wenn ein Paket, z.B. durch ein Ethernet-Interface, hereinkommt so
durchläuft es zuerst zwei Tests : einen Prüfsummen-Test um
sicherzustellen daß das Paket unbeschädigt ist sowie einen
Sanity-Test der ''verdrehte'' Pakete, die ansonsten die Filterlogik
verwirren könnten, wegwirft und dies im syslog vermerkt. Erst dann
verwendet
der Kernel die Regeln der input chain um über das weitere Schicksal
dieses Paketes zu entscheiden. Wenn es diese Stufe ''überlebt'', dann
wird anhand der Routingtabellen über den weiteren Weg des Paketes
entschieden. Ist es für eine andere Maschine bestimmt, so wird die
forward chain konsultiert. Schließlich, bevor es die Maschine
verläßt, werden die Regeln der output chain angewendet.
Jede chain besteht dabei aus einem Satz Regeln die das weitere Schicksal
des Paktes anhand der Paketheader entscheiden. Wenn keine Regel auf das Paket
zutrifft so testet der Kernel die nächste Regel in der chain. Bleibt
keine Regel zum Testen mehr übrig so wird schließlich die
chain policy befragt.
3. Einsatz von IPCHAINS
Man kann mit ipchains eine ganze Menge anstellen :
-
Operationen zum Verwalten kompletter chains. Dabei startet man mit den
eingebauten und nicht löschbaren chains input,
forward und output.
- Anlegen einer neuen chain (-N),
- Löschen einer leeren chain (-X),
- Ändern der Policy einer eingebauten chain (-P),
- Auflisten der Regeln in einer chain (-L),
- Löschen der Regeln einer chain (-F),
- Reseten der Paket- und Byte-Zähler aller Regeln einer
chain (-Z)
-
Operationen zum Manipulieren der Regeln innerhalb einer chain
- Anhängen einer neuen Regel an die Kette (-A),
- Einfügen einer neuen Regel an einer bestimmten Position in
der chain (-I),
- Ersetzen einer Regel an einer bestimmten Stelle in der chain (-R),
- Löschen einer Regel an einer bestimmten Stelle in der chain
(-D),
- Löschen der ersten passenden Regel in der chain (-D)
-
Weiterhin gibt es noch das Masquerading betreffende Operationen
- Auflisten der derzeit masqueradierten Verbindungen (-M L),
- Setzen der Timeout-Werte für das Masquerading (-M -S)
-
Schließlich gibt es noch eine Option um zu testen, was passiert wenn
ein gegebenes Paket eine gegebene chain durchläuft (-C).
4. Operationen mit IPCHAINS
Das Manipulieren einzelner Regeln ist eigentlich die Elementaroperation von
ipchains. Dazu werden typischerweise die -D (delete) und die -A
(append) Kommandos benutzt deren Konzepte durch die Kommandos -I (insert) und
-R (replace) lediglich erweitert werden. Dabei beschreibt jede Regel
einen Satz an Bedingungen die das Paket erfüllen muß und was
in diesem Falle mit dem Paket geschehen soll.
4.1 Filterspezifikationen
Mit ipchains ist es möglich sehr exakte Paketspezifikationen
aufzubauen :
-
Quell- und Zieladresse angeben : die geschieht mit den Optionen -s (source)
und -d (destination). Dabei sind unterschiedliche Adress-Spezifikationen
möglich :
- Hostname, z.B.
ipchains -A input -s localhost
- IP-Adresse, z.B.
ipchains -A input -s 127.0.0.1
- Adressbereiche mit Netzmaske, z.B. :
ipchains -A -input -s 192.168.0.0/255.255.0.0
- Adressbereiche mit Bitmaske, z.B. :
ipchains -A -input -s 192.168.0.0/16
(dabei sind die beiden letzten Notationen gleichwertig)
-
Definition von inversen Regeln :
ipchains -A input -s !localhost
trifft alle Pakete die nicht vom localhost kommen
-
Angabe des Protokolls, entweder numerisch (wenn Protokollnummer bekannt)
oder symbolisch für TCP, UDP und ICMP, z.B. :
ipchains -A input -p tcp
(bei diesen vordefinierten Prokollen ist Groß-/Kleinschreibung
egal)
-
Spezifikation der TCP und UDP Ports :
-
Angabe von ICMP Typ und Code oder einfacher mit den ICMP Namen. Diese
Liste ist etwas länger, man erhält sie mit dem Kommando
ipchains -h icmp
ICMP Namen können derzeit nicht
negiert werden.
-
Angabe eines Interfaces (negierbar) :
ipchains -A input -i eth0
-
Explizit nur SYN-Pakete (Verbindungsaufbau) matchen :
ipchains -A input -p tcp -d 127.0.0.1 -y
-
Behandlung von Fragmenten : dies ist mit der -f Option
möglich, man kann dies jedoch eleganter mit der Kernel-Option
always defragment lösen, wodurch das Problem der
Fragmentbehandlung von vornherein vermieden wird.
4.2 Seiteneffekte beim Filtern
Wann immer eine Regel auf ein Paket zutrifft passiert folgendes :
-
Der Bytezähler für diese Regel wird erhöht
(volle Paketlänge)
-
Der Paketzähler für diese Regel wird erhöht
-
Wenn die Regel dies erfordert wird das Paket geloggt (syslog)
-
Wenn die Regel dies erfordert wird das Paket markiert (nicht in
den 2.0.x-Kerneln)
-
Die Targetangabe der Regel wird untersucht um festzustellen wie mit dem
Paket weiter zu verfahren ist
4.3 Angabe eines Targets
Um festzulegen wie dem Paket weiter verfahren werden soll kann man bei
den Regeln mit der -j (jump) Option Targets angeben. Dafür sind
folgende Werte möglich :
-
ACCEPT - Paket wird akzeptiert,
-
DENY - Paket wird fallengelassen als hätte es nie existiert,
-
REJECT - Paket wird fallengelassen, es wird jedoch ein
ICMP unreachable an den Sender geschickt,
-
MASQ - Paket wird masqueradiert (nur für die
forward chain gültig),
-
REDIRECT - das Paket wird an einen lokalen Port umgeleitet, dabei
folgt die Portspezifikation dem REDIRECT. Dies ist nur bei
den Protokollen TCP und UDP möglich.
-
Der Name einer weiteren chain. Sollte diese chain das Schicksal des Pakets
nicht entscheiden so wird mit der Auswertung der nächsten Regel
fortgefahren.
4.4 Loggen von Paketen
Mit der Option -l können Pakete geloggt werden. Dabei werden die
Parameter des Paketes sowie das Target im syslog vermerkt.
4.5 TOS-Manipulation
Ebenfalls möglich ist die Manipulation des TOS-Feldes (Type Of Service)
im IP-Header mittels der -t Option. Dabei mögliche Werte sind :
-
0x01 0x10 - minimum delay (min. Verzögerung),
-
0x01 0x08 - maximum throughput (max. Durchsatz),
-
0x01 0x04 - maximum reliability (max. Zuverlässigkeit),
-
0x01 0x02 - minimum cost (min. Kosten)
4.5 Setzen der Policy
Mit dem Kommando -P kann die Policy einer chain gesetzt werden. Dafür
mögliche Werte sind ACCEPT, DENY, REJECT oder MASQ,
dabei ist MASQ jedoch nur für die forward chain
zulässig.
4.6 Testen eines Paketes
Mit dem -C Kommando ist es möglich die Behandlung eines bestimmten
Paketes durch eine bestimmte chain zu testen. Zum Beispiel :
# ipchains -C input -p tcp -y -s 192.168.1.1 60000 -d 192.168.1.2 www
packet accepted
#
5. IPCHAINS und ipfwadm
Neben der anderen Kommandosyntax gibt es noch weitere Unterschiede zwischen
alten und neuem Firewalling-Code :
-
Es werden beliebige chains unterstützt, daher haben auch die eingebauten
chains volle Namen,
-
Angabe mehrerer Quell- und Zielports ist nicht mehr möglich,
-
Interfaces können nur mittels Namen und nicht mittels Adresse
ausgewählt werden,
-
Es gibt keine expliziten accounting chains mehr,
-
Fragmente werden untersucht und nicht automatisch durchgelassen,
-
Es können beliebige IP-gestützte Protokolle angeben werden
-
Die Zähler sind jetzt 64 statt 32 Bit groß,
-
inverse Regeln möglich,
-
Untersützung von ICMP Codes,
-
Interface wildcards unterstützt;
-
sanitychecks für TOS-Manipulationen,
Um den Übergang von ipfwadm auf ipchains zu vereinfachen
gibt es auch ein Wrapper-Script : ipfwadm-wrapper welches die
Kommandos von ipfwadm-Syntax auf ipchains-Syntax umsetzt.
Weiterhin sind in der Utility-Sammlung noch die beiden Tools
ipchains-save und ipchains-restore mit denen die gesetzten
ipchains-Regeln in eine Datei gesichert und aus ihr wieder
hergestellt werden können.