Weiter Zurück [Inhalt] Online Suche im Handbuch LITTLE-IDIOT NETWORKING

12.11 Operationen auf eine ganze chain

Eine sehr nützliche Eigenschaft von ipchains ist die Fähigkeit, Regeln in chains zu definieren, die sich auf ganze Gruppen von Hosts beziehen. Die chains können mit beliebigen Namen bezeichnet werden, solange sie nicht mit den internen chains kollidieren (input, output und forward oder den Anweisungen (MASQ,REDIRECT, ACCEPT, DENY, REJECT oder RETURN). Man sollte keine Großbuchstaben als chain Namen verwenden, da diese späteren Erweiterungen vorbehalten sind. Der Name einer chain darf maximal nur 8 Buchstaben lang sein.

Anlegen einer neuen chain

Die chain sollte den Namen test bekommen:

ipchains -N test

Ok, nun können Regeln in diese chain eingefügt werden.

Löschen einer chain

Das Löschen einer chain ist ebenfalls einfach:

ipchains -X test
Warum -X ? Nun es waren keine guten Buchstaben mehr übrig.....

Beim Löschen von chains sind einige Restriktionen zu beachten: Sie dürfen keine Regeln mehr enthalten, Löschen einer chain und sie dürfen in einer Anweisung einer Regel in einer anderen chain enthalten sein. Hier ein paar Beispiele für chains, die nicht gelöscht werden können:

Löschen einer chain

Der einfachste Weg, alle Regeln in einer chain zu löschen, ist die Verwendung der Option -F:

# ipchains -F forward

Wenn nicht explizit eine chain angegeben wird, wird angenommen, daß alle chains gelöscht werden sollen, also Vorsicht !

Anzeigen einer chain

Die eingetragenen Regeln in einer chain können mit der Option -L angezeigt werden:

# ipchains -L input
Chain input (refcnt = 1): (policy ACCEPT)
target     prot opt    source                destination           ports
ACCEPT     icmp -----  anywhere              anywhere              any
# ipchains -L test
Chain test (refcnt = 0):
target     prot opt    source                destination           ports
DENY       icmp -----  localnet/24           anywhere              any
#

Der refcnt, der in test angezeigt wird, ist die Zahl der Regeln, die test als Anweisung angegeben haben. Diese Zahl muß NULL sein, bevor eine chain gelöscht werden kann.

Wenn keine Name der chain angegeben wird, werden alle chains, darunter auch die leeren chains, angezeigt.

Es gibt drei Optionen, die zusammen mit -L aufgerufen werden können. Die Option -n (numeric) ist sinnvoll um ipchains daran zu hindern die IP - Nummer aufzulösen, welche bei jedem Zugriff lange Wartezeiten verursachen kann, falls der DNS-Server nicht im caching mode arbeitet. Im schlimmsten Falle kostet es Telefongebühren. Der Nachteil ist, daß die Ausgabe in Logfiles mit IP - Nummern erfolgt.

Die Option -v zeigt alle Details der Regel, darunter auch die Paket- und Byte-Zählerstände, die TOS Bits, das Interface und die Paketmarkierungen.

# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
 pkts bytes target prot opt   tosa tosx  ifname mark source   destination ports
   10   840 ACCEPT icmp ----- 0xFF 0x00  lo          anywhere anywhere    any

Die Paket- und Bytezähler benutzen die Anhänge K, M, G als Abkürzungen für 1000, 1 Million und 1 Gigabyte. Die Option -x gibt die echten Zahlen aus, unabhängig davon, wie groß diese sind.

Reset von Zählern.

Zähler können mit der Option -Z auf Null gesetzt werden:

# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
 pkts bytes target prot opt   tosa tosx ifname mark source   destination ports
   10   840 ACCEPT icmp ----- 0xFF 0x00 lo          anywhere anywhere    any
# ipchains -Z input
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
 pkts bytes target prot opt   tosa tosx ifname mark source   destination ports
    0     0 ACCEPT icmp ----- 0xFF 0x00 lo          anywhere anywhere    any
#

Das Problem bei dieser Vorgehensweise ist, daß man manchmal die Zählerstände ablesen muß, bevor diese resettet werden. In obigem Beispiel können die Optionen -L und -Z zusammen angewendet werden, um die Zählerstände beim Ablesen zu resetten. Unglücklicherweise ist das nicht möglich, wenn sich die Befehle auf eine einzige chain beziehen. Hierbei müssen dann alle chains zugleich resettet werden.

# ipchains -L -v -Z
Chain input (policy ACCEPT):
 pkts bytes target prot opt   tosa tosx ifname mark source   destination ports
   10   840 ACCEPT icmp ----- 0xFF 0x00 lo          anywhere anywhere    any

Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
    0     0 DENY   icmp ----- 0xFF 0x00 ppp0        localnet/24 anywhere  any
# ipchains -L -v
Chain input (policy ACCEPT):
 pkts bytes target prot opt   tosa tosx  ifname mark source   destination ports
   10   840 ACCEPT icmp ----- 0xFF 0x00  lo          anywhere anywhere    any

Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
    0     0 DENY   icmp ----- 0xFF 0x00  ppp0        localnet/24 anywhere any
#

Setzen der Policy

In den vorangehenden Abschnitten wurde die Problematik der Regeln beschrieben, deren Anweisungen auf chains zeigen, und wie diese chains ohne Sinn durchlaufen werden. Siehe auch Kapitel Definition einer Anweisung. In diesem Fall bestimmt die policy einer chain das Schicksahl eines Paketes. Nur die eingebauten chains (input, output und forward) besitzen policies. Wenn ein Paket am Ende einer Userdefinierten chain "herausfällt", dann werde die Regeln der vorangegengenen chain weiter durchlaufen.

Die Policy kann eine der vier ersten speziellen Anweisungen sein: ACCEPT, DENY, REJECT oder MASQ. MASQ ist nur für die forward chain definiert.

Es ist wichtig, zu erwähnen, daß die Anweisung RETURN in einer Regel in einer der eingebauten chains durchaus sinnvoll ist, wenn das Paket eine Regel erfüllt. In diesem Falle werden die Anweisungen der policy ausgeführt.

Optionen für Masquerading

Es gibt für Masquerading einige anwendbare Parameter. Sie werden zusammen mit ipchains ausgeführt, weil es nicht notwendig ist, hierfür ein neues Toolkit zu benutzen.

Der Befehl zur Aktivierung von Masquerading ist -M, der mit der Option -L kombiniert werden kann, um eventuell gerade maskierte Verbindungen anzuzeigen, oder mit -S, um die Parameter neu zu setzen.

Die Option -L kann mit -n kombiniert werden, um nur IP - Nummern anzuzeigen, oder mit der Option -v, um die Abstände der Sequenznummern (SSN) der TCP Pakete (Seriennummer der TCP Pakete, damit diese nach eintreffen richtig einsortiert werden können)

Der Option -S sollten drei Timeout Werte folgen, jede in Sekunden angegeben: Für einfache TCP Verbindungen, für TCP Verbindungen nach eintreffen eines FIN-Paketes, und für UDP Pakete. Um die Default Einstellungen zu verwenden, kann stets eine Null angegeben werden.

Die Defaultwerte sind in der Datei /usr/include/net/ip_masq.h, die auf 15 Minuten, 2 Minuten und 5 Minuten eingestellt sind.

Der allgemein am Meisten geänderte Wert ist der erste, insbesondere für FTP Verbindungen. Siehe auch FTP Probleme.

Die Problematik mit Timeout - Werten wird auch in dem Anschnitt Kann keine Timeouts für Masquerading setzen !.

Prüfen einer Regel

In einigen Fällen ist es von Interesse, die Firewall chains zu debuggen. Hierfür wurde die Option -C für das ipchains Werkzeug eingeführt. Hierbei werden dieselben Routinen aufgerufen, die der Kernel selber verwendet, um Pakete zu analysieren.

Hierbei muß nur der Name der chain angegeben werden, gefolgt von der Option -C. Während der Kernel selber stets bei den chains input, output oder forward chains beginnt, kann der User jede chain angeben

Die Einzelheiten der Pakete werden in der selben Syntax angegeben, die schon für die Definition der Firewallregeln benutzt wurde. Das schließt auch die Angabe der Optionen -p, -s, -d, -i mit ein. Falls ein Paket von dem Typ TCP oder UDP ist, dann müssen eine einzige Quell und Ziel-IP - Nummer angegeben werden. Für ICMP muß die Code Nummer mit angegeben werden (ohne die Option -f, die nicht erlaubt ist, in diesem Zusammenhang)

Wenn das Protokoll TCP ist, das Flag -f muß das -y Flag mit angegeben werden, um anzuzeigen, daß das Testpaket das SYN Bit gesetzt werden soll. Dies ist zum Testen unerläßlich.

Hier nun endlich ein praktisches Beispiel, um zu testen, ob ein TCP Paket mit SYN Flag (Initiierung einer Verbindung) von unserem Host aus dem Intranet, Port 60000 zu dem Host 192.168.1.2 auf Port 80 (www) auf dem Interface eth0 eingehend, in die input chain hineingelassen wird. Dieses entspricht einem einfachen Verbindungsaufbau für WWW.

# ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
packet accepted
# 
Es sollte stets auch nicht vergessen werden, alle Quellports durchzuprobieren, um sicherzugehen, daß sich kein trojanisches Pferd eingeschlichen hat, wie zuletzt im TCP Wrapper (kleine Anmerkung....)

Das Testen von vielen Regeln zugleich

Manchmal kann ein einziger Test auf mehrere Regeln zutreffen. Dies kann auf zwei verschiedene Weisen erfolgen. Zuerst muß ein Hostname angegeben werden, der in mehrere IP-Adressen sich auflöst (Siehe Netscape Server: 1 Name = 20 IP - Nummern). ipchains wird daraufhin so reagieren, als wären verschiedenste IP - Nummern einzeln getestet worden.

Wenn also der Host Name "www.netscape.com" in 20 IP - Nummern sich auflöst, und der Name "www.intra.net" in 2 IP - Nummern, dann wird der Befehl ipchains -A input -j reject -s www.intra.net -d www.netscape.com direkt 40 Regeln auf der input chain ausgeben, testen und anzeigen.

Der andere Weg, ipchains dazu zu bewegen, mehrere Regeln zugleich zu testen, ist die Angabe des Flags -b, für bidirektional. Diese Regel läßt ipchains sich so verhalten, als wenn der Befehl zweimal eingegeben worden wäre, einmal in der einen Richtung, und einmal in der anderen Richtung, also für eingehende und ausgehende Pakete nacheinander:

# ipchains -b -A forward -j reject -s 192.168.1.1
# 

Die Option -b kann zusammen mit den Optionen -I und -D, sowie -A und -C (Insert, Delete, Append und Check) angewendet werden.

Ein weiteres sinnvolles Flag ist -v, welches angibt, was ipchains mit dem Befehl macht. Zum Beispiel werden hier das Verhalten von Fragmenten zwischen Host 192.168.1.1 und 192.168.1.2 untersucht:

# ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
  tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.1  -> 192.168.1.2    * ->   *
packet accepted
  tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.2  -> 192.168.1.1    * ->   *
packet accepted
# 


Weiter Zurück [Inhalt] Online Suche im Handbuch LITTLE-IDIOT NETWORKING