[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:sudo: Root-Rechte] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] Netcat, kurz '''nc''', ist ein universelles Kommandozeilenwerkzeug. Es kann im Terminal oder in Skripten für die Kommunikation über [wikipedia:Transmission_Control_Protocol:TCP]- und [wikipedia:User_Datagram_Protocol:UDP]-Netzwerkverbindungen ([wikipedia:Internet Protocol:] Version 4 und [:IPv6:Version 6]), aber auch lokale [wikipedia:Unix_Domain_Socket:UNIX Domain Sockets] genutzt werden. Damit eignet es sich für zahlreiche Anwendungsfälle zum Thema Netzwerkverbindungen. = Installation = Das Paket '''netcat-openbsd''' ist Bestandteil jeder Ubuntuinstallation, kann aber ansonsten über das Paket: * '''netcat-openbsd''' installiert werden. Alternativ können auch die Pakete [packages:netcat-traditional:] oder [packages:netcat6:] verwendet werden. Die bevorzugte Variante kann dann mit dem [:Alternativen-System:] eingestellt werden. = Aufruf = Netcat wird mit dem Befehl [1]: {{{#!vorlage Befehl nc [OPTIONEN] HOST PORT }}} aufgerufen, um sich mit einem bereits laufenden Server zu verbinden. Um stattdessen selbst an einem bestimmten Port auf eingehende Verbindungen zu warten, verwendet man: {{{#!vorlage Befehl nc [OPTIONEN] -l PORT }}} In diesem Fall können Portnummern unter `1024` nur mit Root-Rechten [2] genutzt werden. Die bestimmten Varianten von Netcat aus den unterschiedlichen Paketen können auch ganz explizit aufgerufen werden, falls man ein anderes Programm als den eingestellten Standard benutzen möchte: {{{#!vorlage Befehl nc.openbsd # aus netcat-openbsd nc.traditional # aus netcat-traditional nc6 # aus netcat6 }}} nc liest jetzt zu sendende Daten von der Standardeingabe ''(stdin)'' und schreibt empfangene Daten auf die Standardausgabe ("stdout"). Meldungen werden auf die Standardfehlerausgabe ("stderr") geschrieben. So kann nc interaktiv genutzt, aber auch für [:Shell/Umleitungen:Shell-Umleitungen] eingesetzt werden. [#Beispiele Beispiele] dazu sind weiter unten zu finden. Die folgende Tabelle gibt einige der Optionen für nc.openbsd an. [#Unterschiede-und-Kompatibilitaet Unterschiede] zu den anderen Versionen sind weiter unten zu finden. {{{#!vorlage Tabelle <-2 tablestyle="width: 97%;" rowclass="titel"> Optionen von nc +++ Option Beschreibung +++ `-4` / `-6` Erzwingt die Nutzung von IP Version 4 bzw. 6. +++ `-u` Nutzt UDP statt TCP. +++ `-U` Nutzt Unix Domain Sockets. Es gelten die [#Unix-Domain-Sockets unten beschriebenen Besonderheiten]. +++ `-l` nc wartet auf eingehende Verbindungen ("listen"), anstatt selbst eine Verbindung zu einem anderen Host aufzubauen. Die Angabe eines HOSTs entfällt (siehe oben). Erlaubt die Option `-k` zu verwenden, sollte aber nicht zusammen mit `-p`, `-s` oder `-z` verwendet werden. +++ `-k` nc wartet nach Verbindungsende auf eine neue Verbindung. Nur in Verbindung mit `-l` möglich. +++ `-z` nc scannt nur nach lauschenden ("listening") Diensten (Portscan), anstatt Daten zu senden. +++ `-s IP` Gibt an, über welche Netzwerkschnittstelle die Daten gesendet werden sollen. +++ `-p PORT` Gibt den lokalen Port an, von dem aus nc die Verbindung aufbauen soll. +++ `-q SEKUNDEN` nc wartet die angegebene Zeit nach einem [wikipedia:End of File:]-Zeichen (EOF) auf der Standardeingabe und beendet sich dann. Bei einem negativen Wert wartet nc unendlich lange (bis die Netzwerkverbindung getrennt wird). +++ `-w TIMEOUT` Verbindungen, die nicht aufgebaut werden können oder nicht genutzt werden, werden nach TIMEOUT Sekunden beendet. `-w` hat keine Auswirkung, wenn `-l` ("listen") verwendet wird. +++ `-v` Aktiviert ausführlichere Ausgaben. }}} Mehr Optionen findet man in der [:Manpage:] von nc. == Unterschiede und Kompatibilität == Die jeweils akzeptierten Optionen unterscheiden sich teilweise. Die oben angegebene Tabelle gilt für nc.openbsd. * Optionen, die nc.traditional nicht kennt: `-4` / `-6`, `-U`, `-k` * Optionen, die nc6 nicht kennt: `-U`, `-k` (aber stattdessen `--continuous`) Laut der [:Manpage:] für nc.openbsd sollte `-p` nicht in Verbindung mit `-l` verwendet werden, aber es scheint dennoch zu funktionieren. Bei nc.traditional und nc6 muss die `-p`-Option angegeben werden, wenn ein "listen"-Port bestimmt werden soll. Außerdem bricht nc.openbsd ab, wenn es ein [wikipedia:End of File:]-Zeichen (EOF) über die Standardeingabe liest, während dies nc.traditional und nc6 nicht tun. Bei allen dreien kann der Abbruch bei EOF mit `-q 0` erzwungen und mit `-q -1` deaktiviert werden. == Unix Domain Sockets == nc.traditional und nc6 beherrschen den Umgang mit Unix Domain Sockets nicht. Die Syntax für Unix Domain Sockets ist etwas anders: {{{#!vorlage Befehl nc -U [-l] [-u] [WEITERE_OPTIONEN] SOCKET-DATEI }}} nc verbindet sich so mit einem bestehenden Socket bzw. erstellt mit `-l` einen Socket, auf dem es lauscht. Es verwendet dazu einen stream socket (stateful = zustandsbehaftet, ähnlich TCP). Mit `-u` werden stattdessen datagram sockets (stateless = zustandslos, ähnlich UDP) genutzt, doch das funktioniert nicht in allen Ubuntu-Versionen. = Beispiele = Hier ein paar simple Beispiele zum Einsatz von nc. Sie sollen die vielfältigen Einsatzmöglichkeiten aufzeigen, jedoch gibt es dabei auch (fast) immer spezialisierte Programme, die bestimmte Aufgaben wesentlich besser lösen (z.B. Datei- oder Webserver). == Simpler Dateitransfer == Wie man schnell ein Dateiarchiv über ein Netzwerk (bzw. zwischen Host und Gast einer Virtuellen Maschine) übertragen kann, ist im [:QEMU#Einzelne-Dateien:QEMU-Artikel] beschrieben. Ein anderes Beispiel soll hier noch gegeben werden. Dazu führt man folgenden Befehl auf dem Rechner aus, der die Datei empfangen soll: {{{#!vorlage Befehl nc -l 8080 > ZIELDATEI }}} Nun auf dem Computer, der die Datei senden soll. Dateinamen, IP-Adresse und ggf. auch die Portnummern müssen dabei passend ersetzt werden. ## 192.0.2.123 dient Dokumentationszwecken, ähnlich wie example.com bei Domains, und wird nicht vergeben (https://de.wikipedia.org/wiki/IP-Adresse#Besondere_IP-Adressen) {{{#!vorlage Befehl nc 192.0.2.123 8080 < QUELLDATEI }}} Zu beachten bleibt, dass die Datei ohne Verschlüsselung oder andere Sicherheitsmaßnahmen übertragen wird. Dafür sollten andere Werkzeuge wie z.B. [:SSH#scp:scp] verwendet werden. == Manuell mit einem Server "sprechen" == Möchte man genau sehen, was ein Server antwortet, um z.B. Fehler zu beheben, kann man auch dazu nc benutzen. Beispiel Webserver: {{{#!vorlage Befehl echo -e "GET / HTTP/1.1\nHost: ubuntuusers.de\n" | nc ubuntuusers.de 80 }}} Hier das Versenden einer Mail per SMTP und [:Postfix:]. Die Zeilen, die mit einer Zahl beginnen, sind Serverantworten: {{{#!vorlage Befehl nc localhost 25 }}} {{{ 220 A ESMTP Postfix (Ubuntu) HELO localhost 250 A MAIL FROM: 250 2.1.0 Ok RCPT TO: 250 2.1.5 Ok DATA 354 End data with . Dies ist eine Test-E-Mail. Sie wird per SMTP an Postfix übergeben. . 250 2.0.0 Ok: queued as C2D2140147 QUIT 221 2.0.0 Bye }}} == Portscan == Auch simple Portscans sind mit nc möglich. Diese Beispiele zeigen auch, wie man mehrere Ports gleichzeitig angibt. * Port-Bereich scannen: {{{#!vorlage Befehl nc -zv localhost 22-25 }}} {{{ nc: connect to localhost port 22 (tcp) failed: Connection refused nc: connect to localhost port 23 (tcp) failed: Connection refused nc: connect to localhost port 24 (tcp) failed: Connection refused Connection to localhost 25 port [tcp/smtp] succeeded! }}} * Zwei einzelne Ports scannen: {{{#!vorlage Befehl nc -zv localhost 53 631 }}} {{{ nc: connect to localhost port 53 (tcp) failed: Connection refused Connection to localhost 631 port [tcp/ipp] succeeded! }}} = Links = * [wikipedia:Netcat:Wikipedia] * [:Shell/Befehlsübersicht:] - Übersicht über verschiedene Shellbefehle #tag: Netzwerk, Shell