UNIX Netzwerk-Tools

Prof. Jürgen Plate

1 Standard-Tools für Netzwerker

1.1 Client und Server

Die meisten Anwendungen in TCP/IP-Netzenfunktionieren nach dem Client-Server-Prinzip. Im einfachsten Fall kommunizieren dabei zwei Rechner miteinander, wobei auf dem einen ein Client- und auf dem anderen der Serverprozeß laufen. Der Client interpretiert die Eingaben des Anwenders und führt die Anweisung entweder selbst aus oder setzt sie in Anweisungen um und schickt sie als Auftrag dem Server. Von diesem erhält er dann die Ergebnisse des Auftrags zurück (oder nur eine Meldung über die erfolgreiche oder fehlerhafte Ausführung). Der Server kann dabei weit entfernt sein, sich im gleichen lokalen Netz oder sogar auf dem gleichen Rechner wie der Client befinden. Auf einem Rechner können mehrere Server-Programme laufen - ein Rechner kann damit mehrere Server-Dienste zur Verfügung stellen. Wenn wir von Servern reden, sollten wir deshalb unterscheiden, ob wir von einem Server-Rechner reden oder von einem Server-Dienst bzw. dem entsprechenden Server-Programm. Der Client-Prozeß wird in der Regel auch erst bei Bedarf gestartet und versucht dann, Kontakt mit dem Serverprozeß aufzunehmen. Dies setzt natürlich voraus, daß der Server schon 'wartet', d. h. ständig an einem System läuft.

Der Server (bzw. das Server-Programm) stellt also einen Dienst zur Verfügung, der vom Client angefordert werden kann. Client und Server unterhalten sich dabei in einer speziellen Sprache - dem entsprechenden Dienstprotokoll. So gibt es ein Protokoll zwischen dem Mail-Server und dem Mail-Client (z.B. SMTP, IMAP oder POP3), eines für den Dateiaustausch zwischen FTP-Client und FFP-Server, ein weiteres für WWW u.s.w.

1.2 Ports - Eingänge für Server

Unterschiedliche Serverprogramme bzw. Serverdienste werden innerhalb eines Rechners durch unterschiedliche Ports angesprochen, wobei ein Port eine Art logischer Kommunikationseingang im Rechner bzw. Betriebssystem ist. Den verschiedenen Servern (bzw. Diensten) sind im Standardfall feste Portnummern zugeordnet. Welcher Port für welchen Dienst verwendet wird, braucht uns als Endbenutzer jedoch in der Regel nicht kümmern. Der Client sollte dies wissen. Nur in Ausnahmefällen, wenn eine besondere Server-Variante oder ein anderer Port benutzt wird, gibt man im Client den vom Standard abweichenden Port an.

1.3 Dokumentation

Alle Protokolle und Vereinbarungen über Internet-Protokolle sind in Dokumenten festgehalten, die den Namen 'Request for Comment', kurz RFC, tragen. Die Dokumente sind durchnumeriert und im Netz frei erhältlich, können aber auch auf CD-ROM erworben werden. Ein RFC wird auch nicht ungültig, sondern bei Änderungen im Protokoll durch ein Nachfolgedokument ('Son of RFC xxx') ergänzt oder ersetzt. Die RFCs enthalten nicht nur technische Dokumente, sondern auch für den technischen Laien geeignete Bedienungsanleitungen. Wer sich mit den RFCs zu gebräuchlichen Diensten beschäftigt, wird feststellen, daß viele Protokolle sehr einfach gehalten sind und daher die Implementierung auf verschiedenen Rechnern schnell möglich ist. Die RFC werden vom InterNIC verwaltet.

1.4 Standard-Tools

Viele der gebräuchlichen Internet-Protokolle sind einfache Wechselgespräche, die man fast schon mit Shell-Skripten implementieren kann. Dieser Teil beschreibt einige kleine Tools, die man zum Zuschauen und Mitmachen braucht, und zeigt, wie einfach FTP, HTTP und andere Protokolle tatsächlich aufgebaut sind.

Ping

Ob man ein anderes System erreichen kann, untersucht man in der Regel mit ping. Das Programm ping erzeugt ICMP-Echo-Request-Pakete, die mit ICMP-Echo-Response-Paketen beantwortet werden, wenn sie das angegebene System erreichen.
$ ping www.e-technik.fh-muenchen.de
PING www.e-technik.fh-muenchen.de (129.187.206.140): 56 data bytes
64 bytes from 129.187.206.140: icmp_seq=0 ttl=242 time=48.9 ms
64 bytes from 129.187.206.140: icmp_seq=1 ttl=242 time=41.9 ms
64 bytes from 129.187.206.140: icmp_seq=2 ttl=242 time=41.3 ms
64 bytes from 129.187.206.140: icmp_seq=3 ttl=242 time=39.9 ms
64 bytes from 129.187.206.140: icmp_seq=4 ttl=242 time=44.9 ms
64 bytes from 129.187.206.140: icmp_seq=5 ttl=242 time=42.9 ms
64 bytes from 129.187.206.140: icmp_seq=6 ttl=242 time=45.4 ms
64 bytes from 129.187.206.140: icmp_seq=7 ttl=242 time=40.5 ms
64 bytes from 129.187.206.140: icmp_seq=8 ttl=242 time=41.4 ms
64 bytes from 129.187.206.140: icmp_seq=9 ttl=242 time=42.3 ms

--- www.e-technik.fh-muenchen.de ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 39.9/42.9/48.9 ms

Arp

Bei einigen Netzproblemen kann es aufschlußreich sein, einen Blick auf die ARP-Tabelle des Kernels zu werfen oder sie sogar zu verändern. Das "Address Resolution Protocol" dient der Zuordnung von Internet-Adressen zu Ethernet-Adressen. Zu diesern Zwecke existiert eine Adreßumwandlungstabelle (adress-translation table), die normalerweise vom ARP selbständig aktualisiert wird. Die Kommandozeilenoptionen von ARP lauten:
arp [-v] [-t hwtype] -a [hostname] 
arp [-v] [-t hwtype] -s hostname hwaddr 
Alle hostname-Argumente können als symbolische Hostnamen oder als IP-Adressen angegeben werden.

Der erste Aufruf gibt den ARP-Eintrag für die angegebene IP-Adresse bzw. Hostnamen aus. Fehlt hostname, werden Informationen über alle bekannten Hosts ausgegeben. Zum Beispiel ergibt die Ausgabe von arp auf www.netzmafia.de etwa folgendes:

arp
Address                  HWtype  HWaddress           Flags Mask  Iface
129.187.206.254          ether   00:04:DE:FE:78:00   C           eth0
ns.e-technik.fh-muenche  ether   00:07:E9:24:EC:15   C           eth0
proxy1.e-technik.fh-mue  ether   00:07:E9:24:EC:15   C           eth0
web1.e-technik.fh-muenc  ether   00:07:E9:24:EB:F5   C           eth0
Die Ausgabe kann mit der -t-Option auch auf bestimmte Hardwaretypen beschränkt werden. Als Argument geben Sie ether, ax25 oder pronet an, was für 10 Mbps Ethernet, AMPR AX.25 und IEEE 802.5 Token Ring steht.

Die Option -s dient dazu, die Hardwareadresse von hostname manuell in die ARP-Tabelle einzutragen. Das Argument hwaddr spezifiziert die Hardwareadresse, die normalerweise als Ethernet-Adresse aus sechs Byte in hexadezimaler Notation angegeben ist. Sie können solche Adressen auch bei anderen Hardwaretypen verwenden, wenn Sie zusätzlich die Option -t angeben. Die Festverdrahtung von Hardwareadressen im ARP-Cache ist eine drastische Maßnahme, um Maschinen aus Ihrem Ethernet daran zu hindern, sich als jemand anderes auszugeben.

Wenn Sie arp mit der Option -d aufrufen, entfernt es alle Einträge für einen bestimmten Host. Es kann dazu benutzt werden, das Interface anzuweisen, eine bereits angeforderte Hardwareadresse einer IP-Adresse nochmals anzufordern, und ist besonders dann nützlich, wenn ein fehlerhaft konfiguriertes System falsche ARP-Informationen sendet (natürlich muß zuerst das fehlerhafte System erneut konfiguriert werden).

Mit der Option "-a" wird der aktuelle Inhalt der Tabelle ausgegeben, z.B.:

arp -a
Net to Media Table
Device   IP Address  -------             Mask      Flags   Phys Addr 
------ --------------------------- --------------- ----- -----------------
le0    brokrz.lrz-muenchen.de      255.255.255.255       00:00:a2:0f:76:97
le0    infoserv.rz.fh-muenchen.de  255.255.255.255       00:e0:29:06:18:d3
le0    flynt.rz.fh-muenchen.de     255.255.255.255       00:e0:29:08:49:f1
le0    kobra.rz.fh-muenchen.de     255.255.255.255       00:08:c7:a9:6c:cc
le0    netmon.rz.fh-muenchen.de    255.255.255.255       00:e0:29:0e:83:92
le0    linux4.rz.fh-muenchen.de    255.255.255.255       00:00:c0:93:19:d3
le0    linux5.rz.fh-muenchen.de    255.255.255.255       00:00:c0:37:19:d3
le0    door2.rz.fh-muenchen.de     255.255.255.255       00:00:c0:3f:fb:a7
le0    wapserv                     255.255.255.255 SP    08:00:20:23:02:88
le0    sun10.rz.fh-muenchen.de     255.255.255.255       08:00:20:86:ce:5e
le0    kiosk1.rz.fh-muenchen.de    255.255.255.255       00:00:c0:60:af:d7
le0    satellit.rz.fh-muenchen.de  255.255.255.255       08:00:20:71:77:b4
le0    kaputt.rz.fh-muenchen.de    255.255.255.255       00:50:56:82:f0:f0

Netstat

Mit Hilfe des Programms netstat können Status-Information über TCP/IP ausgegeben werden. Bei der Fehlersuche kann sich dieses Programm ebenfalls als durchaus nützlich erweisen.

Anzeigen der Routing-Tabelle

Wenn Sie netstat mit dem Flag -r aufrufen, gibt es die Routing-Tabellen des Kernels aus; ähnlich, wie Sie es oben bereits bei route gesehen haben. Zum Beispiel:
netstat -nr 

Kernel IP Routentabelle
Ziel            Router          Genmask         Flags   MSS Fenster irtt Iface
129.187.206.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
0.0.0.0         129.187.206.254 0.0.0.0         UG        0 0          0 eth0

Die Option -n sorgt zusätzlich dafür, daß netstat die Adressen statt als symbolische Host- und Netzwerknamen direkt in dezimaler Notation ausgibt. Das ist dann nützlich, wenn Sie verhindern wollen, daß langwierige Adreßauflösungsanfragen über das Netzwerk ausgeführt werden, zum Beispiel beim DNS- oder NIS-Server. Die zweite Spalte der netstat-Ausgabe zeigt jeweils das Ziel der Route an. Die zweite Spalte gibt das Gateway an, auf das der Routing-Eintrag zeigt. Wird kein Gateway verwendet, wird statt dessen ein Sternchen ausgegeben. Die dritte Spalte gibt Auskunft über die "Allgemeinheit" der Route, d.h. deren Netzmaske. Wenn der Kernel eine IP-Adresse erhält, für die er eine angemessene Route finden soll, dann durchsucht er alle Einträge in der Routing-Tabelle und führt eine bitweise UND-Verknüpfung mit der Adresse und der Genmask durch, bevor er sie mit dem Ziel der Route vergleicht. Die vierte Spalte zeigt verschiedene Flags, die die Route näher charakterisieren.

G Die Route geht durch ein Gateway.
U Das zu verwendende Interface ist aktiv.
H Die Route zeigt auf einen einzelnen Host, wie das z.B. beim Loopback-Eintrag 127.0.0.1 der Fall ist.
D Diese Route wurde dynamisch erzeugt. Dieses Flag ist gesetzt, wenn der Tabelleneintrag von einem Routing-Dämon wie gated oder durch eine ICMP-Redirect-Nachricht generiert wurde.
M Dieses Flag ist gesetzt, wenn der entsprechende Tabelleneintrag durch eine ICMP-Redirect-Nachricht verändert wurde. Der Tabelleneintrag wurde durch einen ICMP-Redirect modifiziert.
! Alle Datagramme werden verworfen.

Die nächsten drei Spalten geben Auskunft über die maximale Segmentgröße (MSS, Maximum Segment Size), das Fenster sowie über die Anfangsumlaufzeit (irtt, initial round trip time), die auf die über diese Route etablierten TCP-Verbindungen anzuwenden sind. Die MSS bezeichnet den Umfang des größten IP-Pakets, das der Kernel über diese Route verschickt. Mit dem Fenster ist die maximale Datenmenge gemeint, die von einem Remote-Host auf einmal empfangen werden kann. Das TCP-Protokoll stellt sicher, daß die Daten zwischen den Hosts zuverlässig übertragen werden. Falls Datenpakete unterwegs verlorengehen, wird die übertragung dieser fehlenden Pakete automatisch wiederholt. Das TCP-Protokoll ermittelt am Anfang einer übertragung, wie lange das gesendete Datenpaket zum Remote-Host braucht, und ermittelt aus der Zeit bis zur Rückantwort einen Wert, der für die weitere Datenübertragung als Maß dient, ob ein IP-Paket ggf. wiederholt werden muß. Diese Zeit wird als round trip time bezeichnet. Der Vorgabewert wird vom TCP-Protokoll beim erstmaligen Verbindungsaufbau benutzt. Nullwerte in diesen Spalten bedeuten, daß Standardwerte benutzt werden. Schließlich gibt das letzte Feld die Netzwerkschnittstelle an, die die Route benutzt.

Anzeige der Interface-Statistiken

Wenn Sie netstat mit dem Flag -i aufrufen, gibt es die Statistiken für die gerade aktiven Netzwerkschnittstellen aus. Geben Sie außerdem das Flag -a mit an, werden alle im Kernel vorhandenen Schnittstellen ausgegeben, nicht nur die konfigurierten.Zum Beispiel:
netstat -i 
Kernel Schnittstellentabelle
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR   TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500   0   31746      0      0      0   14928      0      0      0 BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth0:  1500   0     - keine Statistiken verfügbar -                    BMRU
eth1   1500   0       0      0      0      0    8691      0      0      0 BMRU
lo    16436   0     966      0      0      0     966      0      0      0 LRU
Die Spalten MTU und Met geben die aktuelle MTU und Metrik des Interface an. Die mit RX bzw. TX überschriebenen Spalten geben an, wie viele Pakete fehlerfrei empfangen bzw. gesendet wurden (RX-OK/TX-OK), wie viele beschädigt waren (RX-ERR/TX-ERR), wie viele verworfen werden mußten (RX-DRP/TX-DRP) und wie viele aufgrund eines Overruns verlorengingen (RX-OVR/TX-OVR). Die letzte Spalte zeigt wieder die Flags an, die für die Schnittstelle gesetzt sind. Das sind einbuchstabige Versionen der langen Flag-Namen, die ifconfig ausgibt:

B Eine Broadcast-Adresse wurde gesetzt.
L Die Schnittstelle ist ein Loopback-Device.
M Alle Pakete werden empfangen (promiskuöser Modus).
O ARP ist an dieser Schnittstelle abgeschaltet.
P Es handelt sich um eine Punkt-zu-Punkt-Verbindung.
R Die Schnittstelle ist "running".
U Die Schnittstelle ist aktiv ("up").

Anzeigen der Verbindungen

netstat bietet eine Reihe von Optionen, mit denen Sie aktive und passive Sockets auflisten können. Die Argumente -t, -u, -w und -x zeigen aktive TCP-, UDP-, RAW- und UNIX-Sockets. Wenn Sie zusätzlich -a angeben, sehen Sie außerdem die Sockets, die gerade auf eine Verbindung warten. Auf diese Weise erhalten Sie eine Liste aller Server, die derzeit auf Ihrem System laufen.
netstat -ta 
Aktive Internetverbindungen (Server und stehende Verbindungen)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:imaps                 *:*                     LISTEN
tcp        0      0 *:mysql                 *:*                     LISTEN
tcp        0      0 vweb1.ee.fhm.edu:7788   *:*                     LISTEN
tcp        0      0 *:pop3                  *:*                     LISTEN
tcp        0      0 *:imap                  *:*                     LISTEN
tcp        0      0 *:sunrpc                *:*                     LISTEN
tcp        0      0 *:www-http              *:*                     LISTEN
tcp        0      0 *:bpcd                  *:*                     LISTEN
tcp        0      0 *:vopied                *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN
tcp        0      0 *:bpjava-msvc           *:*                     LISTEN
tcp        0      0 ehg.e-technik.fh-m:smtp mailrelay2.rz.fh-:48063 VERBUNDEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0   1208 vweb.e-technik.fh-m:ssh diale071.ppp.lrz-:58198 VERBUNDEN
tcp        0      0 vweb.e-technik.fh-m:ssh menetekel.e-techn:32862 VERBUNDEN
Man sieht, daß die meisten Server einfach auf eine eingehende Verbindung warten, da sie sich im Zustand LISTEN befinden.

Wenn Sie netstat nur mit der Option -a aufrufen, zeigt es eine Liste aller Sockets aus allen Familien:

Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address          Foreign Address        (State)       User
tcp        0      0 *:netbios-ssn          *:*                    LISTEN        root       
tcp        0      0 *:nntp                 *:*                    LISTEN        root       
tcp        0      0 *:auth                 *:*                    LISTEN        root       
tcp        0      0 *:sunrpc               *:*                    LISTEN        root       
tcp        0      0 *:pop3                 *:*                    LISTEN        root       
tcp        0      0 *:www                  *:*                    LISTEN        root       
tcp        0      0 *:finger               *:*                    LISTEN        root       
tcp        0      0 *:midinet              *:*                    LISTEN        root       
tcp        0      0 *:http-rman            *:*                    LISTEN        root       
tcp        0      0 *:btx                  *:*                    LISTEN        root       
tcp        0      0 *:smtp                 *:*                    LISTEN        root       
tcp        0      0 *:telnet               *:*                    LISTEN        root       
tcp        0      0 *:ftp                  *:*                    LISTEN        root       
tcp        0      0 *:netstat              *:*                    LISTEN        root       
tcp        0      0 *:systat               *:*                    LISTEN        root       
tcp        0      0 *:printer              *:*                    LISTEN        root       
tcp        0      0 *:shell                *:*                    LISTEN        root       
tcp        0      0 *:login                *:*                    LISTEN        root       
tcp        0      0 *:exec                 *:*                    LISTEN        root       
udp        0      0 *:rplay                *:*                    
udp        0      0 *:netbios-ns           *:*                    
udp        0      0 *:sunrpc               *:*                    
udp        0      0 *:ntalk                *:*                    
udp        0      0 *:talk                 *:*                    
udp        0      0 *:syslog               *:*                    
raw        0      0 *:1                    *:*                    
Active UNIX domain sockets
Proto RefCnt Flags      Type            State           Inode Path
unix  1      [ ACC ]    SOCK_STREAM     LISTENING         417 /dev/log
unix  2      [ ]        SOCK_STREAM     CONNECTED         440 
unix  2      [ ]        SOCK_STREAM     UNCONNECTED       441 /dev/log
unix  2      [ ]        SOCK_STREAM     CONNECTED         499 
unix  2      [ ]        SOCK_STREAM     UNCONNECTED       500 /dev/log
unix  2      [ ]        SOCK_STREAM     CONNECTED         517 
unix  2      [ ]        SOCK_STREAM     UNCONNECTED       518 /dev/log
Die erste Spalte enthält das Transportprotokoll. Die zweite und dritte Spalte sagen etwas über die Anzahl der Bytes in der Empfangs- bzw. Sende-Warteschlange aus. Die nächsten beiden Spalten geben lokale und ferne Adressen einer Verbindung an. Diese Adressen bestehen aus der Internet-Adresse und der Portnummer der Kommunikationspartner. Ist der Rechner in der /etc/hosts bzw. der Dienst in der /etc/services eingetragen, so werden statt der Adressen Rechnername bzw. der Name des Services aus gegeben. Dies läßt sich durch den Aufruf von netstat -in verhindern. Handelt es sich 4611 um einen Eintrag für einen aktiven Server, so wird die lokale Adresse in der Form "*.<portnummer>" und ferne Adressen in der Form "*.*" angegeben. Diese Art der Ausgabe zeigt an, daß der entsprechende Dienst bereit ist. Bei TCP-Diensten zeigt zusätzlich die letzte Spalte an, daß der Server auf LISTEN aesetzt ist. Kommt für einen speziellen Dienst keine Verbindung zustande, obwohl andere Programme (z.B. ping) funktionieren. so kann man mittels netstat -a auf dem Zielsystem überprüfen, ob der Server dort aktiv ist. Nur dann kann eine entsprechende Verbindung überhaupt aufgebaut werden.

Traceroute

Um festzustellen, welchen Weg die Datenpakete zu einem fernen Rechner nehmen und wie "gut" die Verbindung dorthin ist, kann man 'traceroute' einsetzen. Das Programm schickt UDP-Pakete mit unterschiedlicher "Lebensdauer" an einen unbenutzten Port und wertet so die Fehlermeldungen der einzelnen Router und Gateways aus. Dem Kommando wird wie bei Ping nur der Rechnername oder eine IP-Nummer als Parameter übergeben. Für jeden Gateway wird dann auf dem Bildschirm eine Zeile ausgegeben:
Zähler Gateway-Name Gateway-IP-Nummer "round-trip"-Zeit (3 Werte)
Traceroute sendet jeweils drei Datenpakete. Wenn auf ein Paket keine Antwort erfolgt, wird ein Sternchen (*) ausgegeben. Ist ein Gateway nicht erreichbar, wird statt einer Zeitangabe '!N' (network unreachable) oder '!H' (host unreachable) ausgegeben. Man kann so feststellen, wo eine Verbindung unterbrochen ist, und auch, welchen Weg die Daten nehmen - wo also der Zielrechner in etwa steht. Bei grafischen Benutzerschnittstellen erfolgt die Parameterangabe über Dialogfelder und nicht in der Kommandozeile.
$ traceroute www.linux.org
traceroute to www.linux.org (198.182.196.56), 30 hops max, 40 byte packets
 1  space-gw2m (194.97.64.8)  2.758 ms  3.637 ms  2.491 ms
 2  Cisco-M-IV.Space.Net (195.30.0.123)  6.413 ms  4.118 ms  4.107 ms
 3  Cisco-M-Fe0-0.Space.Net (195.30.0.126)  4.826 ms  4.508 ms  5.53 ms
 4  Cisco-ECRC-H1-0.Space.Net (193.149.44.2)  5.977 ms  6.273 ms  20.832 ms
 5  munich-ebs2-s0-0-0.ebone.net (192.121.158.189)  14.415 ms  17.018 ms  8.575 ms
 6  newyork-ebs1-s5-0-0.ebone.net (195.158.224.21)  137.35 ms  139.103 ms  138.14 ms
 7  serial0-0-1.br1.nyc4.ALTER.NET (137.39.23.81)  137.132 ms  141.742 ms  141.207 ms
 8  134.ATM2-0.XR1.NYC4.ALTER.NET (146.188.177.178)  135.375 ms  128.12 ms  165.913 ms
 9  189.ATM3-0.TR1.EWR1.ALTER.NET (146.188.179.54)  141.83 ms  144.798 ms  362.469 ms
10  105.ATM4-0.TR1.DCA1.ALTER.NET (146.188.136.185)  145.321 ms  147.889 ms  152.43 ms
11  299.ATM6-0.XR1.TCO1.ALTER.NET (146.188.161.169)  354.577 ms  133.535 ms  348.647 ms
12  193.ATM8-0-0.GW2.TCO1.ALTER.NET (146.188.160.49)  152.444 ms  369.313 ms  150.106 ms
13  uu-peer.oc12-core.ai.net (205.134.160.2)  365.008 ms  509.81 ms  144.898 ms
14  border-ai.invlogic.com (205.134.175.254)  270.065 ms  341.586 ms  153.441 ms
15  router.invlogic.com (198.182.196.1)  356.496 ms  506.371 ms  532.983 ms
16  www.linux.org (198.182.196.56)  584.957 ms  300.612 ms  380.004 ms

Netcat

Netcat ist das "Schweizer Taschenmesser" für Netzwerker. Es handelt sich um ein einfaches Werkzeug, das Daten von einer Netzverbindung liest und auf die Standardausgabe ausgibt oder Daten von der Standardeingabe auf eine Netzverbindung schreibt. Es verwendet dabei zur Kommunikation das TCP- oder UDP-Protokoll. Netcat kann als Client und als Server fungieren. Die TCP- oder UDP-Verbindungen kommunizieren über die Standardeingabe und -ausgabe. Zugleich ist es auch ein Netzwerk-Werkzeug zur Fehlersuche und Erkundung. So besitzt es die Möglichkeit, fast jede Verbindung zu erstellen, die man brauchen könnte. Es ist also ein "Back-End"-Tool für andere Software. Das Programm hat unter anderem folgende Optionen: Zum besseren Verständnis sollte man auf jeden Fall die README-Datei durchlesen.

Netcat ermöglicht die Datenkommunikation mit einer TCP- oder UDP-Verbindung über Standardeingabe und Standardausgabe, beispielsweise aus einem Shellscript heraus. Das Programm kann dabei die Verbindung wahlweise selbst herstellen (Client-Modus):

Beispiel: Webserver abfragen:
(Benutzereingaben fett)

echo -e 'GET / HTTP/1.0\n\n'  | netcat -w 10 www.netzmafia.de 80

HTTP/1.1 200 OK
Date: Wed, 15 Sep 2004 07:07:35 GMT
Server: Apache/1.3.28 mod_ssl/2.8.15 OpenSSL/0.9.7b PHP/4.3.3
X-Powered-By: PHP/4.3.3
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

...

Netcat beendet sich erst, wenn die Verbindung abbricht. Der Parameter -w 10 bewirkt, daß spätestens 10 Sekunden nach dem Ende der Eingabe das Programm abbricht.

Beispiel: Chatten mit Netcat
Um den Chat zu starten, muss einer der Chat-Beteiligeten als Server fungieren. Dieser muss nun folgendes in seiner Konsole eingeben:

nc -l -p 10009
Der Partner muss sich nun mit diesem Server verbinden:
nc <IP des Servers> 10009
Nun kann man einfach seinen Text eingeben und mit der Enter-Taste abschicken. Sobald einer der beiden die Verbindung schließt, ist die Kommunikation beendet.

Beispiel: Daten übers Netz verschicken
Netcat eignet sich ideal, um Daten übers Netz zu verschicken. Beim Rechner, der die Datei empfangen soll, wird folgendes KOmmando gegeben:

nc -l -v -n -p 10110>datei
Der Sender der Datei verschickt diese wie folgt:
nc -v -n <Ziel-IP-Adresse> 10110<datei

Mit netcat und inetd kann man lokale Ports an andere Hosts umleiten. Die folgende Zeile in /etc/inetd.conf auf sleepy stellt den Port 80 von grumpy lokal zur Verfügung:

80 stream tcp nowait nobody /usr/bin/nc /usr/bin/nc -w 3 grumpy 80
beziehungsweise mit dem tcpd:
80 stream tcp nowait nobody /usr/sbin/tcpd /usr/bin/nc -w 3 grumpy 80

Aufruf als Server

Durch den Aufruf

PROGRAM | nc -l -p PORT -w TIMEOUT
  1. erwartet netcat genau eine Verbindung auf Port PORT,
  2. verbindet netcat die Verbindung mit der Ausgabe von PROGRAM und
  3. wartet maximal TIMEOUT Sekunden darauf, daß die Verbindung abgebrochen wird.
Durch den Aufruf
nc -l -p PORT -w TIMEOUT | PROGRAM
  1. erwartet netcat genau eine Verbindung auf Port PORT,
  2. verbindet netcat die Verbindung mit der Eingabe von PROGRAM und
  3. wartet maximal TIMEOUT Sekunden darauf, daß die Verbindung abgebrochen wird.
Soll der Port bidirektional sein (gleichzeitig Ein- und Ausgabe), lautet der Aufruf:
nc -l -p PORT -e PROGRAM
Leider kann netcat keine Parameter an PROGRAM übergeben, daher wird man hier häufig ein Shellscript verwenden. Da netcat beim Ende der Verbindung beendet wird, kann es nur eine einzige Verbindung bedienen. Auch hier kann mittels Shell-Programmierung Abhilfe geschaffen werden. Der Parameter "-e" funktioniert nur, wenn netcat mit der Option -DGAPING_SECURITY_HOLE compiliert worden war. Bei Debian-artigen Distributionen ist das der Fall.

Verzeichnisbäume über ein Internet kopieren

Mit Hilfe von von netcat, tar und bash kann man Verzeichnisbäume von einem Host auf einen anderen kopieren. Die Dateien werden komprimiert und mit ihren Attributen (Zugriffsrechte/änderungsdatum) übertragen. Hierzu läßt man auf dem empfangenden Host netcat auf Port 4711 lauschen und leitet seine Ausgabe in tar um:
$ nc -vlp 4711 | tar xvpf -
listening on [any] 4711 ...
Auf der sendenden Seite ruft man eine Shellfunktion auf, welche die übergebenen Dateien und Verzeichnisse zusammentart und an den Port 4711 des empfangenden Rechners sendet:
$ ( cd QUELLDIR ; tar cvpf - * | nc -w 1 ZIELHOST 4711 )

Auch schön um ganze Festplatten zu spiegeln. Sender:

dd if=/dev/sdb | nc ZIELHOST 4711
Empfänger:
nc -l -p 4711 | dd of=/dev/sdb

Netcat kann auch mit UDP-Paketen umgehen. Der Server wird dann aufgerufen durch:

nc -u -l -p 4711
Der Client:
nc -u <Server> 4711

Einmal-Webserver

Statt eines Netcat-zu-Netcat Transfers kann Netcat auch die Sprache höherer Protokolle wie HTTP sprechen. Das folgende Kommando startet einen Webserver auf dem lokalen Computer, welcher dem ersten Webbrowser die Datei hallo.txt präsentiert.
( echo "HTTP/1.0 200 Ok"; echo; cat hallo.txt; ) | netcat -l -p 8080
Zum Abrufen wird im Webbrowser die URL http://<Hostname>:8080/ eingegeben. Dieser zeigt dann einen Speicherdialog oder die Datei direkt an.

Backup-Webserver

Beispielsweise um Wartungsarbeiten anzuzeigen. Der Server wird immer wieder gestartet, soblad er eine Anfrage "bedient" hat:
while :  
do 
  nc -l -p 80 -q 1 < error.html 
done
Alternativ kann er ein Redirect senden:
while :
do 
 echo -e "HTTP/1.1 302 Found\nLocation: http://www.whatevs.com/index.html" | nc -vvvv -l -p 80
done
Das "-vvvv" macht das Ganze seeeehr geschwätzig.

Netcat als Portscanner

Um nach laufenden Diensten in einer gewissen Port-Range zu suchen, kann Netcat als Portscanner gestartet werden:
nc -zv <Ziel-IP> 11-1024
Noch mehr Informationen bietet die Netcat-Readme-Datei.

Wget

Wget ist ein Download-Tool, das gleichermaßen mit WWW- wie FTP-Servern umgehen kann und dank zahlreicher Optionen genau die Dateien holt, die Sie brauchen. Zugleich ist es aber auch ein nützliches Kommandozeilentool für den Servermanager, um den Zugriff zu testen.

Auf HTTP und FTP aufsetzend kann man beispielsweise ganze Archive oder Homepages spiegeln. Auch mit einer schlechten Anbindung ans Internet eignet sich das Programm hervorragend zum Download im Hintergrund: Nicht nur ein "Anknüpfen" an eine abgebrochene übertragung, sondern auch ein Update ist möglich -- Wget kann aufgrund von Timestamps erkennen, ob es eine aktuelle Version einer Datei schon heruntergeladen hat. Zu finden ist es unter http://www.gnu.org/software/wget/wget.html.

Der Standardaufruf von Wget ist wget [options] URL. Wget ist ein GNU-Tool, d. h. alle Parameter haben eine lange (wget --version) und eine kurze Form (wget -V). Mit wget -h (oder --help) bekommen Sie eine ausführliche Kommandoübersicht. Ein erstes Beispiel:

wget http://www.netzmafia.de/
--16:15:16--  http://www.netzmafia.de:80/
           => `index.html'
Connecting to www.netzmafia.de:80... connected!
HTTP request sent, awaiting response... 200 OK
Length: 8,208 [text/html]

    0K -> ........                             [100%]

12:15:18 (9.01 KB/s) - `index.html' saved [8208/8208]
Auf den lokalen Computer wird die Datei index.html heruntergeladen. Bilder und Unterverzeichnisse sind nicht mit eingeschlossen. Möchten Sie eine Stufe tiefer gehen, probieren Sie die Option -r (für --recursive). Jetzt folgt Wget den Links und der Verzeichnisstruktur der zu spiegelnden Seiten. Wichtig ist in diesem Zusammenhang der Parameter -l num (--level=num), bei dem num die Anzahl der Level festlegt.
Ein Aufruf der Form wget -r --level=1 http://www.netzmafia.de/ bewirkt etwa, daß die Unterverzeichnisse der ersten Ebene einbezogen werden. Es wird dabei ein Verzeichnis www.netzmafia.de angelegt, in dem die geladenen Unterverzeichnisse eingerichtet werden. Als Standard-Level für die Rekursion ist 5 vorgegeben.

Ist ein Download unterbrochen worden, kann mit Hilfe des Parameters -c (--continue) der Ladevorgang wieder aufgenommen werden. Um bestimmte Seiten in regelmäßigen Abständen immer wieder zu sichern, gibt es die Option -N (--timestamping): Es wird bei jeder Datei der Zeitstempel mit dem der lokalen Datei verglichen und nur geladen, wenn die ferne Datei neuer ist als die lokale.

Mit dem Aufruf wget -nd (--no-directories) wird die Verzeichnisstruktur der fernen Site nicht übernommen. Vorsicht ist hier jedoch geboten bei Dateien mit gleichen Namen: sie werden einfach überschrieben. Umgekehrt wird mit der Option -x (--force-directories) die Verzeichnisstruktur der fernen Site auf jeden Fall komplett übernommen. Die Option -nH (--no-host-directories) übernimmt die Verzeichnisstruktur vom Server, aber der Hostname wird nicht mit berücksichtigt, es wird ins aktuelle Verzeichnis gespiegelt.

Wildcards sind unter Wget nicht möglich. Die Option -A "liste" (--accept) schafft Abhilfe. In der "liste" definieren Sie die zu ladenden Dateitypen, zum Beispiel:

wget -r -l1 -A jpg,gif,png http://www.netzmafia.de
Danach finden sich im Verzeichnis nur noch diese Bilddateien und eine Datei index.html, die Wget braucht, um die Bilder zu finden. Hinter den Kulissen saugt Wget eigentlich alle Dateien, entfernt dann aber nicht benötigte.
...
13:03:19 (8.73 KB/s) - `bla.html' saved [8584/8584]

Removing bla.html since it should be rejected.
...
Mit -R liste (--reject) können Sie Dateierweiterungen ausschlie^ßen. Der Aufruf wget -r -l1 -R doc,avi,mpg,mp3 http://www.netzmafia.de würde die angegebenen Dateitypen aussparen. Ein Download-Limit können Sie darüber hinaus mit dem Parameter -Q (--quota) setzen. Die Begrenzung bezieht sich auf die Gesamtmenge der Daten und wird standardmä^ßig in Bytes angegeben. Eine Begrenzung in Kilobytes oder Megabytes ist auch möglich - dazu wird k oder m an die Zahl angehängt.

Fast alle Parameter, die Sie wget beim Start mitgegeben haben, können Sie in eine Konfigurationsdatei mit dem Namen .wgetrc im Heimatverzeichnis eintragen. Zum Beispiel:

tries = 20
reclevel = 8
timestamping = on
dirstruct = on

Weitere Informationen liefert die Wget-Beschreibung.

Einem ganz ähnlichen Zweck dient cURL (Client for URLs). Das Programm ist auf verschiedene Betriebssysteme portiert worden, darunter Linux und Mac OS X. Die zugehörige Programmbibliothek libcurl wird von zahlreichen Programmen und Programmiersprachen verwendet. Es dient zum Herunter- oder Hochladen von Dateien über das Netz, auch POST-Übertragungen zu Webservern sind möglich. Zu den unterstützten Protokollen gehören u. a. HTTP, HTTPS, FTP, FTPS, DICT, LDAP, RTMP und Gopher. Im Gegensatz zu Wget kann cURL Dateien auch hochladen.

Die offizielle Webseite für cURL ist http://curl.haxx.se/. Bei The geek stuff finden sie einige Anwendungsbeispiele.

1.5 Triviale Anfragen an höhere Protokolle

Auch auf den höheren Protokollebenen gibt es triviale Anfragen, mit denen man untersuchen kann, ob ein Partner überhaupt antwortet. Das Hauptwerkzeug ist hier das ganz normale Telnet-Programm, das für nahezu jede Platform verfügbar ist.

"echo" bezeichnet beispielsweise einen Service, nämlich TCP-Port 7, der ankommende Meldungen schlicht zurückschickt (siehe unten). Das kann man direkt mit telnet ausprobieren:

$ telnet localhost echo
Trying 127.0.0.1...
     Connected to localhost.
Escape character is '^]'.
hello world
hello world
^]

telnet> quit
Connection closed.
Auch eine Webserverabfrage mach kein Problem. Nach Aufbau der Telnet-Verbindung gibt man den gewünschten Dateipfad (genauer, ein Kommando des HTTP-Protokolls, im Beispiel unten "GET / HTTP/1.0") und anschliessend eine Leerzeile ein, z.B.:
telnet www.netzmafia.de 80
Trying 129.187.206.160...
Connected to www.netzmafia.de.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 15 Sep 2004 07:46:45 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux mod_ssl/2.8.9 OpenSSL/0.9.6c
Last-Modified: Wed, 12 May 2004 13:47:57 GMT
ETag: "1f7078-797-40a22b0d"
Accept-Ranges: bytes
Content-Length: 1943
Connection: close
Content-Type: text/html; charset=iso-8859-1

<html>

...

</html>


Connection closed by foreign host.

1.6 Einfache Protokolle

Die folgenden Protokoll eignen sich gut, um bei den ersten Versuchen mit der Netzwerkprogrammierung die eigenen Programme zu testen (oder auch den unter !.5. geschilderten Zugriff). Normalerweise sind die entsprechenden Ports gesperrt, man muss sie auf dem Zielrechner meist erst explizit freigeben. Bei Linux geschieht dies in der Steuerdatei /etc/inetd.conf. Nach dem Ändern der Datei muss der inetd-Prozess veranlasst wewrden, die Datei neu einzulesen. Dies geschieht mittels kill -HUP <PID des inetd>.

Das chargen-Protokol

chargen ist ein auf Telnet basierendes Protokoll, das zu Testzwecken Ascii-Zeichen auf den aufrufenden Port sendet. Der Service läuft über den TCP- bzw. UDP-Port 19. Sobald eine Verbindung aufgebaut ist, sendet der Server eine ASCII-Folge bzw. unter UDP ein Datagramm, in dem Zeichen eines Zeichengenerators enthalten sind. Alle weiteren eingehenden Daten werden vom Server nicht verarbeitet, die Verbindung muß vom aufrufenden Host geschlossen werden. Beispiel:
telnet 129.187.206.160 19 
Trying 129.187.206.160... 
Connected to 129.187.206.160.
Escape character is '^]'.
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
,-./012   
^]

telnet> quit
Connection closed.
Das chargen-Protokoll ist somit eine einfache Möglichkeit, Verbindungen und gegebenenfalls Terminal-Einstellungen zu überprüfen. Der Datenfluß wird bei chargen-TCP-Verbindungen durch den normalen TCP-Datenfluß-Kontrollmechanismus gesteuert, so daß Pakete nicht schneller verschickt als empfangen werden können. Dasselbe gilt für UDP, Datagramme werden nur verschickt, wenn die Empfangsbestätigung des letzten Datagramms eingetroffen ist.

Das echo-Protokoll

Echo ist ein auf Telnet basierendes Protokoll, das nichts weiter tut, als die empfangenen Daten an den Erzeuger zurückzuschicken. Dies läuft sowohl unter TCP als auch unter UDP auf Port 7. Sobald der Server Daten unter TCP bzw. Datagramme unter UDP empfängt, sendet er diese unverzüglich zurück. Dies erfolgt solange, bis der anrufende Rechner die Verbindung unterbricht. Beispiel:
telnet 129.187.206.160 7
Trying 129.187.206.160...
Connected to 129.187.206.160.
Escape character is '^]'.
Hallo
Hallo
^]

telnet> quit
Connection closed.

Mit dem echo-Protokoll lassen sich auf sehr einfache Weise speziell Terminaleinstellungen testen, z.B. kann man so einen Überblick über die verwendeten Codetables der eingesetzten Terminals erlangen. Dieser Dienst erzeugt ebenfalls wenig Datenverkehr, so daß sich die Verbindung auch durch langsame Leitungen sehr gut testen läßt.

Das daytime-Protokoll

daytime ist ein auf Telnet basierendes Protokoll, das zur Abfrage der Zeit und des Datums eines entfernt liegenden Rechners dient. Der Service läuft über den TCP- bzw. UDP-Port 13. Sobald eine Verbindung aufgebaut ist, sendet der Server eine ASCII-Zeichenfolge bzw. unter UDP ein Datagramm, in dem das aktuelle Datum und die Zeit des angesprochenen Systems enthalten sind. Alle weiteren eingehenden Daten werden vom Server nicht verarbeitet, und die Verbindung wird nach dem Senden geschlossen. Beispiel:
telnet 129.187.206.160 13
Trying 129.187.206.160...
Connected to 129.187.206.160.
Escape character is '^]'.
Wed Sep 15 15:03:23 2004
Connection closed by foreign host.
Das daytime-Protokoll ist somit eine einfache Möglichkeit, Verbindungen und die Systemzeit vernetzter Rechner zu überprüfen. Beim Zeitabgleich ist die Zeit, die die Nachricht im Netz verbringt, zu berücksichtigen.

Zum Inhaltsverzeichnis Zum nächsten Abschnitt


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: