Suche im Katalog
Linux Netzwerker-Handbuch

Linux Netzwerker-Handbuch


Tony Bautts, Terry Dawson & Gregor N. Purdy
3. Auflage Juli 2005
ISBN 3-89721-414-8
382 Seiten
Weitere Informationen zur gedruckten Version des Buches finden Sie unter:
www.oreilly.de/catalog/linag3ger/

Zur Übersicht aller OpenBooks


TOC PREV NEXT INDEX

Kapitel 8

IP-Accounting

In der heutigen Welt der kommerziellen Internetdienste wird es immer wichtiger zu wissen, wie viele Daten Sie überhaupt über Ihre Netzwerkverbindungen übertragen und empfangen. Für Internet Service Provider, die ihre Kunden nach Datenvolumen abrechnen, ist das sogar von entscheidender Bedeutung. Wenn Sie ein Kunde eines solchen Internet Service Providers sind, dann begrüßen Sie es sicher, wenn Sie ein Mittel in die Hand bekommen, mit dem Sie die korrekte Abrechnung Ihres Datenverkehrs überprüfen können.

Es gibt aber auch noch andere Anwendungen für Netzwerk-Accounting, die nichts mit Geld und Rechnungen zu tun haben. Wenn Sie einen Server verwalten, der verschiedene Arten von Netzwerkdiensten zur Verfügung stellt, ist es vielleicht nützlich für Sie zu wissen, wie viel Daten von den einzelnen Diensten überhaupt erzeugt werden. Solche Informationen können Ihnen bei mancher Entscheidung behilflich sein, etwa welche Hardware zu kaufen ist oder wie viele Server Sie brauchen.

Der Linux-Kernel enthält eine Einrichtung, die Ihnen die Sammlung vielerlei nützlicher Informationen über den Netzwerkverkehr ermöglicht. Diese Einrichtung wird als IP-Accounting bezeichnet.

Den Kernel für IP-Accounting konfigurieren

Die IP-Accounting-Funktion von Linux hängt eng mit der Linux-Firewall-Software zusammen. Die Stellen, an denen Sie Accounting-Daten sammeln wollen, sind dieselben Stellen, an denen Sie Ihre Firewall-Filter einsetzen würden: dort, wo die Daten in einen Netzwerk-Host hinein- bzw. aus ihm herauskommen, und in der Software, die die Datagramme routet. Wenn Sie das Kapitel über Firewalls noch nicht gelesen haben, sollten Sie das jetzt nachholen, da wir auf einige der in Kapitel 7 beschriebenen Konzepte zurückgreifen werden.

IP-Accounting konfigurieren

Da IP-Accounting eng mit IP-Firewalls zusammenhängt, kann man das gleiche Werkzeug dazu verwenden, um es zu konfigurieren: iptables. Die Befehlssyntax ist derjenigen für die Firewall-Regeln sehr ähnlich. Wir gehen daher nicht noch einmal ausführlich darauf ein, zeigen Ihnen aber, wie Sie damit einen tieferen Einblick in die Natur Ihres Netzwerkverkehrs bekommen können.

Die allgemeine Befehlssyntax lautet:

# iptables -A kette regelspezifikation

Der iptables-Befehl erlaubt es Ihnen, die Richtung auf eine Weise anzugeben, die den Firewall-Regeln entspricht.

Die Befehle sind fast dieselben wie bei den Firewall-Regeln, mit der Ausnahme, dass die Richtlinienregeln hier nicht wirksam werden. Wir können Accounting-Regeln hinzufügen, einfügen, löschen und auflisten. Im Fall von ipchains und iptables sind alle gültigen Regeln auch Accounting-Regeln. Jeder Befehl, der nicht die Option -j angibt, führt nur ein Accounting durch.

Die Parameter zur Regelspezifikation für IP-Accounting sind identisch mit denen, die auch für IP-Firewalls benutzt wurden. Wir verwenden sie, um genau zu definieren, welchen Netzwerkverkehr wir abrechnen und aufsummieren wollen.

Accounting anhand von Adressen

Nun zeigen wir anhand eines Beispiels, wie wir IP-Accounting anwenden können.

Stellen Sie sich vor, wir hätten einen Linux-basierten Router, der zwei Abteilungen der virtuellen Brauerei bedient. Der Router verfügt über zwei Ethernet-Geräte, nämlich eth0 und eth1, die jeweils eine Abteilung bedienen, und ein PPP-Gerät, ppp0, das uns über eine Hochgeschwindigkeitsleitung mit dem Haupt-Campus der Groucho-Marx-Universität verbindet.

Stellen wir uns außerdem vor, dass wir zur Kostenberechnung den Umfang des Datenverkehrs wissen wollen, der von den beiden Abteilungen über die seriellen Leitungen übertragen wird. Für Verwaltungszwecke wollen wir außerdem wissen, wie viele Daten zwischen den beiden Abteilungen hin- und herwandern.

Tabelle 8-1 zeigt die Schnittstellenadressen, die wir in unserem Beispiel benutzen:

Tabelle 8-1
Schnittstellen und ihre Adressen
Schnittstelle
Adresse
Netzmaske
eth0
172.16.3.0
255.255.255.0
eth1
172.16.4.0
255.255.255.0

Wie viele Daten überträgt jede Abteilung über die PPP-Verbindung? Um diese Frage zu beantworten, könnten wir etwa folgende Regeln benutzen:

# iptables -A FORWARD -i ppp0 -d 172.16.3.0/24
# iptables -A FORWARD -o ppp0 -s 172.16.3.0/24
# iptables -A FORWARD -i ppp0 -d 172.16.4.0/24
# iptables -A FORWARD -o ppp0 -s 172.16.4.0/24

Die ersten beiden Regeln besagen: »Zähle alle Daten, die in beiden Richtungen über die Schnittstelle namens ppp0 laufen, mit der Quell- oder Zieladresse 172.16.3.0/24.« Die beiden letzten Regeln machen das Gleiche, allerdings für das zweite Ethernet-Netzwerk auf unserer Site.

Um die zweite Frage beantworten zu können, nämlich »Wie viele Daten werden zwischen den beiden Abteilungen bewegt?«, benötigen wir eine solche Regel:

# iptables -A FORWARD -s 172.16.3.0/24 -d 172.16.4.0/24
# iptables -A FORWARD -s 172.16.4.0/24 -d 172.16.3.0/24

Diese Regeln zählen alle Pakete mit einer Quelladresse aus einem Netzwerk unserer Abteilungen und mit einer Zieladresse, die zum anderen Netzwerk gehört.

Accounting anhand von Service-Ports

Okay, jetzt nehmen wir einmal an, wir wollten nicht nur etwas über den Umfang, sondern auch Näheres über die Art des übertragenen Datenverkehrs wissen. Wir könnten zum Beispiel wissen wollen, wie viel Leitungskapazität von FTP-, SMTP- und WWW-Diensten in Anspruch genommen wird.

Dazu könnten wir ein Skript mit Regeln zusammenstellen, etwa so:

#!/bin/sh
# Erstellt eine Statistik des FTP-, SMTP- und WWW-Datenaufkommens
# über unsere PPP-Verbindung mit iptables.
#
iptables -A FORWARD -i ppp0 -p tcp --sport 20:21
iptables -A FORWARD -o ppp0 -p tcp --dport 20:21
iptables -A FORWARD -i ppp0 -p tcp --sport smtp
iptables -A FORWARD -o ppp0 -p tcp --dport smtp
iptables -A FORWARD -i ppp0 -p tcp --sport www
iptables -A FORWARD -o ppp0 -p tcp --dport www

In dieser Konfiguration sind einige interessante Funktionen enthalten. Erstens haben wir das Protokoll spezifiziert. Wenn wir in unseren Regeln Ports angeben, müssen wir auch ein Protokoll benennen, da TCP und UDP verschiedene Portmengen angeben. Da all diese Dienste TCP-basiert sind, haben wir TCP auch hier als Protokoll angegeben. Zweitens haben wir die beiden Dienste ftp und ftp-data in einem Befehl festgelegt. Der iptables-Befehl erlaubt entweder einzelne Ports oder Portbereiche, was wir hier auch ausgenutzt haben. Die Syntax »20:21« bedeutet »Ports 20 (ftp-data) bis 21 (ftp)« und ist die Art und Weise, wie wir Portbereiche in iptables beschreiben (die Filtererweiterung tcp erlaubt es Ihnen, in Bereichsangaben Portnamen einzusetzen, die Filtererweiterung multiport dagegen nicht - es ist aber sowieso besser, für Bereiche Zahlen zu verwenden, damit Sie nicht versehentlich mehr Ports aufnehmen als beabsichtigt). Wenn Sie eine Liste mit Ports in einer Accounting-Regel haben, bedeutet dies, dass alle Daten addiert werden, die über irgendeinen der Ports laufen. Wir erinnern uns, dass der FTP-Dienst immer zwei Ports braucht, nämlich einen für die Befehle und einen für die Datenübertragungen. Deshalb haben wir beide Ports angegeben, um den gesamten FTP-Verkehr zu addieren.

Den zweiten Punkt können wir noch ausweiten, um einen etwas differenzierteren Einblick in die Daten unserer Verbindung zu bekommen. Dazu klassifizieren wir FTP-, SMTP- und WWW-Daten als essenziellen Datenverkehr und alle anderen Daten als nicht essenziell. Um nun das Verhältnis von essenziellem zu nicht-essenziellem Datenverkehr zu ermitteln, geben wir etwa Folgendes ein:

# iptables -A FORWARD -i ppp0 -p tcp -m multiport \
--sports ftp-data,ftp,smtp,www -j ACCEPT
# iptables -A FORWARD -j ACCEPT

Die erste Regel würde unseren essenziellen Datenverkehr zählen, die zweite Regel alles andere.

Alternativ können wir benutzerdefinierte Ketten verwenden (das wäre sinnvoll, wenn die Regeln zum Ermitteln des essenziellen Datenverkehrs komplexer wären):

# iptables -N a-essent
# iptables -N a-noness
# iptables -A a-essent -j ACCEPT
# iptables -A a-noness -j ACCEPT
# iptables -A FORWARD -i ppp0 -p tcp -m multiport \
--sports ftp-data,ftp,smtp,www -j a-essent
# iptables -A FORWARD -j a-noness

Hier erzeugen wir zwei benutzerdefinierte Ketten - eine namens a-essent, mit der wir Accounting-Daten für essenzielle Dienste erfassen, und eine weitere namens a-noness, die Accounting-Daten für nicht-essenzielle Dienste erfasst. Danach fügen wir die Regeln zu unserer Weitergabe-Kette hinzu, die unsere essenziellen Dienste filtert und sie an die a-essent-Kette weiterleitet. Dort haben wir nur eine Regel, die alle Pakete akzeptiert und zählt. Die letzte Regel in unserer Weitergabe-Kette ist eine Regel, die zu unserer a-noness-Kette verzweigt, wo wir wieder nur noch eine Regel haben, die alle Pakete akzeptiert und zählt. Die Regel, die zur a-noness-Kette verzweigt, wird von unseren essenziellen Diensten nicht erreicht, da diese in ihrer eigenen Kette akzeptiert worden sind. Unsere Zähler für die essenziellen und nicht-essenziellen Dienste sind daher in den Regeln dieser Ketten verfügbar. Diese Vorgehensweise ist nur eine Möglichkeit; es gibt auch noch andere.

Das Ganze sieht ja ziemlich einfach aus. Leider taucht ein kleines, aber unvermeidliches Problem auf, wenn man versucht, Accounting nach Diensttypen durchzuführen. In einem früheren Kapitel haben wir ja bereits darüber gesprochen, welche Rolle die MTU in TCP/IP-Netzwerken spielt. Die MTU (Maximum Transmission Unit) definiert das größte Paket, das von einem Netzwerkgerät übertragen wird. Wenn von einem Router ein Paket empfangen wird, das größer als die MTU der Schnittstelle ist, die die Übertragung fortsetzen soll, dann wendet der Router einen besonderen Trick an, nämlich eine so genannte Fragmentierung. Dabei zerteilt der Router das große Paket in leichter verdauliche Häppchen, die jeweils nicht größer als die MTU der Schnittstelle sind, und überträgt diese dann. Dabei erzeugt der Router in jedem dieser kleinen Teile jeweils einen neuen Header, der zur Rekonstruktion der ursprünglichen Daten am Zielort dient. Unglücklicherweise wird bei der Zerteilung die Information über den verwendeten Port nur im ersten Fragment abgespeichert, in den nachfolgenden Fragmenten ist das nicht mehr der Fall. Das bedeutet, dass das IP-Accounting fragmentierte Pakete natürlich nicht mehr richtig zählen kann. Es kann nur das jeweils erste Fragment eines zerteilten Pakets sowie unzerteilte Pakete zählen. Um sicherzugehen, dass wir auch das zweite und alle folgenden Fragmente erwischen, könnten wir eine solche Regel verwenden:

# iptables -A FORWARD -i ppp0 -m tcp -p tcp -f

Damit erfahren wir zwar nichts über den Ausgangsport für diese Daten, aber zumindest sind wir in der Lage festzustellen, wie viele unserer Daten fragmentiert sind, und können daher Angaben über deren Datenumfang machen.


Bei der Verbindungsverfolgung (Connection Tracking) wird automatisch eine Defragmentierung vorgenommen, so dass diese Technik oft nicht sehr sinnvoll ist. Falls Sie allerdings keine Verbindungsverfolgung durchführen, können Sie sie einsetzen.

Accounting von ICMP-Paketen

Das ICMP-Protokoll kann mit Portnummern nichts anfangen und ist daher etwas schwieriger zu handhaben, was die Sammlung von Informationen über jene betrifft. ICMP benutzt unterschiedliche Arten von Paketen. Viele von diesen sind »harmlos« und normal, während andere nur unter ganz bestimmten Umständen auftauchen sollten. Manche Zeitgenossen, die mit ihrer Zeit nichts anzufangen wissen, versuchen absichtlich, Netzwerkverbindungen anderer Leute zu unterbrechen, indem sie eine Unmenge von ICMP-Nachrichten erzeugen. Dieses Verfahren wird allgemein als Ping Flooding bezeichnet (der Oberbegriff für diese Art der Denial-of-Service-Attacke lautet Packet Flooding, Ping Flooding ist aber auch gebräuchlich). IP-Accounting kann nichts gegen solche Probleme unternehmen (IP-Firewalls hingegen schon!), wir können aber zumindest Regeln einführen, die uns zeigen, ob irgendjemand versucht hat, uns auf diese Weise anzugreifen.

ICMP benutzt keine Ports, wie es TCP und UDP tun, sondern ICMP-Nachrichtentypen. Wir können Regeln einführen, die ein Accounting dieser ICMP-Nachrichtentypen durchführen. Dazu geben wir im Portfeld des Accounting-Befehls die ICMP-Nachricht und die Typnummer an.

Eine IP-Accounting-Regel zur Sammlung von Informationen über den Umfang von Ping-Daten, die zu Ihnen gesendet werden oder die Sie erzeugen, könnte so aussehen:

# iptables -A FORWARD -m icmp -p icmp --sports echo-request
# iptables -A FORWARD -m icmp -p icmp --sports echo-reply
# iptables -A FORWARD -m icmp -p icmp -f

Die erste Regel sammelt Informationen über »ICMP Echo Request«-Pakete (Ping-Anfragen), die zweite Regel über »ICMP Echo Reply«-Pakete (Ping-Antworten). Die dritte Regel ist schließlich für ICMP-Paketfragmente zuständig. Das ist ein Trick, der dem bereits für die fragmentierten TCP- und UDP-Datagramme beschriebenen ähnelt.

Wenn Sie in Ihren Regeln Quell- und/oder Zieladressen angeben, können Sie nachverfolgen, woher die Pings kommen und ob sie ihren Ursprung innerhalb oder außerhalb Ihres Netzwerks haben. Sobald Sie festgestellt haben, woher die üblen Pakete kommen, können Sie entscheiden, ob Sie dort Firewall-Regeln einführen wollen, um solche Angriffe zu vermeiden, oder ob Sie irgendetwas anderes vorziehen, wie zum Beispiel den Eigentümer des angreifenden Netzwerks anzurufen und ihn über das Problem zu informieren, oder Sie könnten sogar rechtliche Schritte in Erwägung ziehen.

Accounting anhand des Protokolls

Stellen wir uns nun vor, wir wollten wissen, welche Anteile TCP, UDP und ICMP am gesamten Datenverkehr in unserer Verbindung haben. Dafür würden wir etwa folgende Regeln benutzen:

# iptables -A FORWARD -i ppp0 -m tcp -p tcp
# iptables -A FORWARD -o ppp0 -m tcp -p tcp
# iptables -A FORWARD -i ppp0 -m udp -p udp
# iptables -A FORWARD -o ppp0 -m udp -p udp
# iptables -A FORWARD -i ppp0 -m icmp -p icmp
# iptables -A FORWARD -o ppp0 -m icmp -p icmp

Mit diesen Regeln wird der gesamte Datenverkehr über die ppp0-Schnittstelle analysiert, um festzustellen, ob es sich dabei um TCP-, UDP- oder ICMP-Daten handelt. Für jedes dieser Protokolle wird der entsprechende Zähler aktualisiert.

IP-Accounting-Ergebnisse

Schön und gut, nun können wir diese Informationen sammeln, aber wie bekommen wir sie überhaupt zu Gesicht? Um Zugriff auf unsere Accounting-Daten und die konfigurierten Accounting-Regeln zu erhalten, benutzen wir unsere Firewall-Konfigurationsbefehle. In der Ausgabe erscheinen die Paket- und Bytezähler der einzelnen Regeln.

Accounting-Daten auflisten

Wir müssen beim Befehl iptables die Option -v angeben, um die Accounting-Zähler zu Gesicht zu bekommen. Zur Auflistung unserer Accounting-Daten geben wir Folgendes ein:

# iptables -L -v

Wie beim ipchains-Befehl erhalten Sie mit der Option -x exakte Ausgaben.

Zähler zurücksetzen

Nach einer bestimmten Zeit laufen die IP-Accounting-Zähler über, wenn Sie nichts dagegen unternehmen. Wenn sie einmal übergelaufen sind, haben Sie Probleme, ihre tatsächlichen Werte zu bestimmen. Sie sollten die Zählerstände daher in regelmäßigen Abständen auslesen, aufzeichnen und sie dann wieder auf null zurücksetzen, um das Accounting für das nächste Zeitintervall neu zu beginnen.

Der iptables-Befehl bietet Ihnen hierfür eine einfache Möglichkeit:

# iptables -Z

Sie können sogar das Auflisten und Zurücksetzen der Zähler miteinander kombinieren und so sicherstellen, dass keine Aufzeichnungen verloren gehen:

# iptables -L -Z -v

Dieser Befehl listet zuerst die Accounting-Daten auf, löscht sie unmittelbar danach und setzt das Accounting unverzüglich fort. Wenn Sie daran interessiert sind, die Sammlung und Anwendung dieser Informationen in regelmäßigen Zeitabständen automatisch zu wiederholen, werden Sie die Anweisungen wohl in ein Skript schreiben wollen, das dann vom cron-Befehl periodisch ausgeführt wird.

Den Regelsatz verwerfen

Ein Befehl ist noch übrig, der sich als besonders nützlich erweisen könnte. Er ermöglicht es Ihnen, alle von Ihnen konfigurierten IP-Accounting-Regeln zu verwerfen. Das ist besonders dann zweckmäßig, wenn Sie Ihren Regelsatz radikal ändern wollen, ohne Ihren Rechner neu starten zu müssen.

Der iptables-Befehl unterstützt das Argument -F, das alle Regeln des von Ihnen angegebenen Typs verwirft:

# iptables -F

Das verwirft alle Ihre konfigurierten Regeln (nicht nur die Accounting-Regeln), das heißt, es entfernt sie alle und erspart Ihnen die Mühe, sie einzeln zu löschen.

Passive Sammlung von Accounting-Daten

Es gibt noch einen Trick, den Sie vielleicht überdenken sollten. Wenn Ihr Linux-Rechner an ein Ethernet angeschlossen ist, können Sie Accounting-Regeln auf alle Daten des Segments anwenden, nicht nur auf die, die von Ihrer Maschine übertragen werden oder an sie gerichtet sind. Ihre Maschine hört passiv alle Daten im Segment ab und zählt sie.

Sie sollten dafür zunächst IP-Forwarding auf Ihrem Linux-Rechner abstellen, damit er nicht versucht, die empfangenen Pakete zu routen.1 Führen Sie dazu diesen Befehl aus:

# echo 0 >/proc/sys/net/ipv4/ip_forward

Nun müssen Sie noch auf Ihrer Ethernet-Schnittstelle den Promiscuous-Modus aktivieren; dazu verwenden Sie den Befehl ifconfig. Damit wird ein Ethernet-Gerät dazu gebracht, alle Pakete an das Betriebssystem auszuliefern und nicht nur diejenigen Pakete mit seiner Ethernet-Adresse als Zielangabe. Das ist nur relevant, wenn das Gerät an ein Broadcast-Medium (wie etwa ungeswitchtes Ethernet) angeschlossen ist. Geben Sie beispielsweise Folgendes ein, um den Promiscuous-Modus an der Schnittstelle eth1 zu aktivieren:

# ifconfig eth1 promisc

Jetzt können Sie Accounting-Regeln aktivieren, die es Ihnen erlauben, Informationen über die Pakete zu sammeln, die über Ihr Ethernet laufen, ohne Ihren Linux-Accounting-Rechner in die Route einzubeziehen.

1Das ist allerdings nicht angebracht, wenn Ihre Linux-Maschine als Router tätig ist. Falls Sie IP-Forwarding abstellen, ist Schluss mit Routen! Machen Sie das also nur auf einer Maschine mit einer einzigen physischen Netzwerkschnittstelle.

TOC PREV NEXT INDEX


O'Reilly Home | O'Reilly-Partnerbuchhandlungen | Bestellinformationen
Kontakt | Über O'Reilly | Datenschutz

© 2005, O'Reilly Verlag GmbH & Co. KG