TCP/IP-Implementierung bei UNIX:
Das folgende Bild zeigt am Beispiel einer E-Mail die Verpackung der Nutzinformation und somit das Zusammenspiel der verschiedenen beteiligten Protokolle:
Sniffer verwenden einen speziellen Zugang zur Subnetzschicht (Data Link Layer), also zur Ebene der Gerätetreiber, um die über die verschiedenen Netzwerk-Geräte (z.B. eth0, ppp0, lo) gesendeten bzw. empfangenen Pakete beobachten zu können. Manche Sniffer gestatten auch das Erzeugen und Absenden von Paketen. Der Zugang zur Subnetzschicht (Datalink Access) kann sich zwischen den verschiedenen UNIX-Systemen stark unterscheiden. Hier einige Beispiele:
Die beiden genannten Bibliotheken sind unter folgenden URLs zu finden:
Download:
http://www.packetfactory.net/Projects/libnet/dist/
Sniffer für UNIX:
Um "Datenmüll" (Garbage) am Ende eines Pakets zu ignorieren, sollte man die entsprechende Zeile im Perl-Skript dumptcplink aktivieren, wie der folgende Patch zeigt:
--- dumptcplink Mon Mar 13 10:26:26 2000 +++ dumptcplink_new Fri Mar 10 12:54:05 2000 @@ -119,7 +119,7 @@ if ($procLine==$ipEndLine) { # Remove end of packet garbage. # Can be omitted if you know there is none. - #$tcpData=substr($tcpData,1,($ipLen-$HeaderLen)<<1); + $tcpData=substr($tcpData,1,($ipLen-$HeaderLen)<<1); $turbo=($ipEndLine-$procLine); } }
Dieses Werkzeug erkennt bei neueren tcpdump-Versionen, bei denen IP-Pakete durch die Zeichenkette "ip" und nicht durch die hexadezimale Typkennung "0800" gekennzeichnet werden, die IP-Pakete nicht als solche und kann sie daher nicht wie gewünscht dekodieren. Folgender Patch löst dieses Problem:
--- tcpshow.c Wed Jan 5 08:49:19 2000 +++ tcpshow_new.c Mon Mar 6 11:43:43 2000 @@ -1042,7 +1042,7 @@ (void)sscanf(pkt, "%s %s %s %s", time, efrom, eto, etype); - isip = (boolean)(strcmp(etype, "0800") == 0); + isip = (boolean)(!strcmp(etype, "ip") || !strcmp(etype, "0800")); (void)strcpy(efrom, etheraddr(efrom)); (void)strcpy(eto, etheraddr(eto));