2012-04-15 10 views
4

Auf einem Linux-Router schrieb ich ein C-Programm, das pcap verwendet, um den IP-Header und die Länge des Pakets zu erhalten. Auf diese Weise kann ich Statistiken sammeln und Bandbreite basierend auf IP messen. Ziemlich ordentlich. :-)Alternative zu pcap (Linux)

Jetzt ist der Verkehr und die Anzahl der Benutzer gewachsen, und das alte Programm beginnt zu kämpfen. Das heißt, der Router hat Mühe, mit der großen Menge an Paketen fertig zu werden. Es sind insgesamt über 50000 Pakete pro Sekunde in der "Prime Time".

Das Programm selbst ist ziemlich optimiert. Ich möchte nicht angeben, aber ich glaube, es ist so gut wie es nur geht. Es liest den IP-Header und die Paketlänge. Es wandelt dann die IP in einen Index um (nur eine einfache Subtraktion), und die Länge des Pakets wird in einem Array gespeichert (akkumuliert). Hin und wieder (eigentlich ein SIGALRM) speichert es das Array in einer MySQL-Datenbank.

Meine Frage ist: Gibt es eine andere Möglichkeit, ein Ethernet-Gerät anzuzapfen, um den Bit-Stream "billiger" als pcap zu bekommen?

Ich kann natürlich den Ethernet-Treiber ändern, um einzelne IP-Statistiken zu erfassen, aber das scheint ein wenig übertrieben.

Grundsätzlich ist mein Programm ein 'tcpdump' auf einem beschäftigten eth0 und das wird schließlich meinen Router töten.

+0

Können Sie etwas wie Portspiegelung konfigurieren und die Analyse auf einer anderen Maschine durchführen? – cnicutar

+0

Haben Sie verschiedene Netflow-Tools wie [softflowd] (http://code.google.com/p/softflowd/) untersucht? Das klingt schrecklich nah dran. – andri

+0

Andri: Leider basiert softflowd auf libpcap, das hilft nicht viel. –

Antwort

6

Haben Sie in Betracht gezogen PF_RING? Es ist immer noch die pcap -ähnlichen Welt, aber auf Steroiden - dank der zero-copy Mechanismus:

enter image description here

Wie Sie sehen, gibt es ein Kernel-Modul, das Low-Level-Paket Kopieren in den PF_RING Puffer bereitstellt, und es ist der Benutzerlandteil, der den Zugriff auf diesen Puffer ermöglicht.

Wer braucht PF_RING?

Grundsätzlich jeder, der viele Pakete pro Sekunde verarbeiten muss. Der Begriff "viele" ändert sich entsprechend der Hardware, die Sie für die Verkehrsanalyse verwenden. Er kann von 80 k Pkt/Sek. Auf einem 1,2 GHz ARM bis zu 14 M Pkt/Sek. Und darüber auf einem Low-End 2,5 GHz Xeon reichen. PF_RING können Sie nicht nur Pakete schneller erfassen, es fängt auch effizienter Pakete CPU-Zyklen zu bewahren ....

+1

'PF_RING' erfordert das Hinzufügen von Code zu Ihrem Kernel; Linux hat seit einiger Zeit einen separaten eingebauten Nullkopiemechanismus, und libpcap 1.0 und höher verwenden diesen Zero-Copy-Mechanismus (obwohl Sie die neueste Version von libpcap, 1.2.1, haben wollen, um alle Bugfixes oder die Null zu bekommen Kopierunterstützung). –

+0

@GuyHarris: Wird es jetzt standardmäßig verwendet? Vor langer Zeit war es nicht out-of-the-box ...? – Anonymous

+1

Es wird standardmäßig seit 1.0 verwendet. Vor Version 1.0 wurde es überhaupt nicht verwendet, da es keinen Code zur Verwendung hatte. –

0

Stark Ihnen empfehlen PF_RING ZC zu verwenden und könnte unter/Userland/examples_zc finden. Es ist Teil von pf_ring.

Sie können Zig-Gbps-Traffic in Zeilenrate mit pf_ring zc verarbeiten und erfassen.