nc — beliebige TCP- und UDP-Verbindungen und Listener
SYNOPSIS
nc [-46bCDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] [-m minttl] [-O length]
[-P proxy_username] [-p source_port] [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable]
[-W recvlimit] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]
DESCRIPTION
Das nc-Dienstprogramm (oder netcat) wird für fast alles verwendet, was mit TCP, UDP oder Unix-Domain-Sockets zu tun hat. Es kann TCP-Verbindungen öffnen, UDP-Pakete senden, auf beliebigen TCP- und UDP-Ports lauschen, Port-Scans durchführen und sowohl mit IPv4 als auch mit IPv6 arbeiten. Im Gegensatz zu telnet(1) skriptet nc gut und trennt Fehlermeldungen an die Standardfehlerausgabe, anstatt sie, wie telnet(1) es manchmal tut, an die Standardausgabe zu senden.
Häufige Anwendungsfälle sind:
einfache TCP-Proxys
shell-skriptbasierte HTTP-Clients und -Server
Testen von Netzwerk-Daemons
ein SOCKS- oder HTTP-ProxyCommand für [ssh]({filename}../../ssh)(1)
und vieles mehr
Die Optionen sind wie folgt:
-4 Verwenden Sie nur IPv4-Adressen.
-6 Verwenden Sie nur IPv6-Adressen.
-b Erlauben Sie Broadcast.
-C Senden Sie CRLF als Zeilenende. Jedes Zeilenvorschubzeichen (LF) aus den Eingabedaten wird in CR+LF umgewandelt, bevor es in die Socket geschrieben wird. Zeilenvorschubzeichen, die bereits von einem Wagenrücklauf (CR) begleitet werden, werden nicht umgewandelt. Empfangene Daten werden nicht beeinflusst.
-D Aktivieren Sie das Debugging auf dem Socket.
-d Versuchen Sie nicht, von stdin zu lesen.
-F Übergeben Sie den ersten verbundenen Socket unter Verwendung von sendmsg(2) an stdout und beenden Sie den Vorgang. Dies ist nützlich in Verbindung mit -X, um nc die Verbindung mit einem Proxy durchführen zu lassen und den Rest der Verbindung dann einem anderen Programm (z. B. [ssh]({filename}../../ssh)(1) mit der ssh_config(5)-Option ProxyUseFdpass) zu überlassen. Kann nicht zusammen mit -U verwendet werden.
-h Drucken Sie den nc-Hilfetext aus und beenden Sie das Programm.
-I length
Geben Sie die Größe des TCP-Empfangspuffers an.
-i interval
Schlafen Sie für die angegebene Anzahl von Sekunden zwischen gesendeten und empfangenen Textzeilen. Verursacht auch eine Verzögerung zwischen den Verbindungen zu mehreren Ports.
-k Wenn eine Verbindung abgeschlossen ist, lauschen Sie auf eine weitere. Erfordert -l. In Verbindung mit der Option -u ist der Server-Socket nicht verbunden und kann UDP-Datagramme von mehreren Hosts empfangen.
-l Lauschen Sie auf eine eingehende Verbindung, anstatt eine Verbindung zu einem Remote-Host herzustellen. Das Ziel und der Port, auf den gelauscht werden soll, können entweder als nicht optionale Argumente oder mit den Optionen -s bzw. -p angegeben werden. Kann nicht zusammen mit -x oder -z verwendet werden. Darüber hinaus werden alle mit der Option -w angegebenen Timeouts ignoriert.
-M ttl Legen Sie die TTL-/Hop-Grenze für ausgehende Pakete fest.
-m minttl
Weisen Sie den Kernel an, eingehende Pakete mit einer TTL-/Hop-Grenze unterhalb von `minttl` zu verwerfen.
-N Schließen Sie die Netzwerk-Socket nach EOF am Eingang ([`{filename}../../shutdown`](filename:shutdown.md)(2). Einige Server benötigen dies, um ihre Arbeit abzuschließen.
-n Führen Sie keine Domainnamenauflösung durch. Wenn ein Name ohne DNS nicht aufgelöst werden kann, wird ein Fehler gemeldet.
-O length
Geben Sie die Größe des TCP-Sende-Puffers an.
-P proxy_username
Geben Sie einen Benutzernamen an, der an einen Proxy-Server übermittelt werden soll, der eine Authentifizierung erfordert. Wenn kein Benutzername angegeben wird, wird keine Authentifizierung versucht. Die Proxy-Authentifizierung wird derzeit nur für HTTP CONNECT-Proxys unterstützt.
-p source_port
Geben Sie den Quellport an, den `nc` verwenden soll, wobei Privilegienbeschränkungen und Verfügbarkeit zu berücksichtigen sind.
-q seconds
Warten Sie nach EOF auf stdin die angegebene Anzahl von Sekunden und beenden Sie dann das Programm. Wenn `seconds` negativ ist, wird unbegrenzt gewartet (Standard). Das Angeben einer nicht negativen Anzahl von Sekunden impliziert -N.
-r Wählen Sie stattdessen die Quell- und/oder Zielports zufällig aus, anstatt sie innerhalb eines Bereichs oder in der Reihenfolge, in der sie vom System zugewiesen werden, sequenziell auszuwählen.
-S Aktivieren Sie die RFC 2385 TCP MD5-Signatur-Option.
-s sourceaddr
Legen Sie die Quelladresse fest, von der aus Pakete gesendet werden sollen, was auf Maschinen mit mehreren Schnittstellen nützlich ist. Für Unix-Domain-Datagramm-Sockets gibt dies die lokale temporäre Socket-Datei an, die erstellt und verwendet wird, sodass Datagramme empfangen werden können. Kann nicht zusammen mit -x verwendet werden.
-T keyword
Ändern Sie den IPv4-TOS-/IPv6-Traffic-Class-Wert. `keyword` kann eines der folgenden sein: `critical`, `inetcontrol`, `lowcost`, `lowdelay`, `netcontrol`, `throughput`, `reliability` oder einer der DiffServ-Codepunkte: `ef`, `af11` ... `af43`, `cs0` ... `cs7`; oder eine Zahl in Hexadezimal- oder Dezimalschreibweise.
-t Senden Sie RFC 854 DON'T- und WON'T-Antworten auf RFC 854 DO- und WILL-Anfragen. Dadurch ist es möglich, `nc` zum Skripten von Telnet-Sitzungen zu verwenden.
-U Verwenden Sie Unix-Domain-Sockets. Kann nicht zusammen mit -F oder -x verwendet werden. Unter Linux wird, wenn der Name mit einem At-Zeichen (`@`) beginnt, dieser als Abstract-Namespace-Socket behandelt: das führende `@` wird durch ein NUL-Byte ersetzt, bevor die Bindung oder Verbindung hergestellt wird. Weitere Einzelheiten finden Sie unter `unix(7)`.
-u Verwenden Sie UDP anstelle von TCP. Kann nicht zusammen mit -x verwendet werden. Für Unix-Domain-Sockets wird ein Datagramm-Socket anstelle eines Stream-Sockets verwendet. Wenn ein Unix-Domain-Socket verwendet wird, wird ein temporärer Empfangssocket in `/tmp` erstellt, es sei denn, das `-s`-Flag wird angegeben.
-V rtable
Legen Sie die zu verwendende Routing-Tabelle fest.
-v Geben Sie detailliertere Ausgaben aus.
-W recvlimit
Beenden Sie das Programm, nachdem eine bestimmte Anzahl von Paketen (recvlimit) aus dem Netzwerk empfangen wurde.
-w timeout
Verbindungen, die nicht hergestellt werden können oder inaktiv sind, werden nach `timeout` Sekunden beendet. Das `-w`-Flag hat keine Auswirkung auf die Option `-l`, d. h. `nc` hört unabhängig vom Vorhandensein des `-w`-Flags unbegrenzt auf eine Verbindung. Standardmäßig gibt es kein Timeout.
-X proxy_protocol
Verwenden Sie proxy_protocol, wenn Sie mit dem Proxy-Server kommunizieren. Unterstützte Protokolle sind 4 (SOCKS 4, 4A (SOCKS v.4A), 5 (SOCKS v.5) und connect (HTTPS-Proxy). Wenn das Protokoll nicht angegeben ist, wird SOCKS-Version 5 verwendet. Beachten Sie, dass das SOCKS v.4-Protokoll sehr eingeschränkt ist und nur verwendet werden kann, wenn das Ziel-Host in eine IPv4-Adresse aufgelöst werden kann. Die anderen Protokolle übergeben das Ziel als Zeichenkette an den Remote-Proxy zur Interpretation und haben diese Einschränkung nicht.
-x proxy_address[:port]
Verbinden Sie sich mit dem Ziel unter Verwendung eines Proxys unter proxy_address und port. Wenn der Port nicht angegeben ist, wird der bekannte Port für das Proxy-Protokoll verwendet (1080 für SOCKS, 3128 für HTTPS). Eine IPv6-Adresse kann durch das Einschließen von proxy_address in eckige Klammern eindeutig angegeben werden. Ein Proxy kann nicht zusammen mit einer der Optionen -lsuU verwendet werden.
-Z DCCP-Modus.
-z Scannen Sie nur nach lauschenden Daemons, ohne Daten an diese zu senden. Kann nicht zusammen mit -l verwendet werden.
`destination` kann eine numerische IP-Adresse oder ein symbolischer Hostname sein (es sei denn, die Option -n ist angegeben). Im Allgemeinen muss ein Ziel angegeben werden, es sei denn, die Option -l ist angegeben (in diesem Fall wird der lokale Host verwendet). Für Unix-Domain-Sockets ist ein Ziel erforderlich und stellt den Socket-Pfad dar, mit dem eine Verbindung hergestellt werden soll (oder auf dem gelauscht wird, wenn die Option -l angegeben ist).
`port` kann als numerische Portnummer oder als Dienstname angegeben werden. Portbereiche können als numerische Portnummern in der Form nn-mm angegeben werden. Im Allgemeinen muss ein Zielport angegeben werden, es sei denn, die Option -U ist angegeben. Für einige Optionen fordert der Wert 0 an, dass das System eine Portnummer auswählt.
CLIENT/SERVER-MODELL
Es ist recht einfach, ein einfaches Client/Server-Modell mit nc zu erstellen. Auf einer Konsole starten Sie nc, um auf einem bestimmten Port auf eine Verbindung zu warten. Zum Beispiel:
$ nc -l 1234
^ c lauscht nun auf Port 1234 auf eine Verbindung. Auf einer zweiten Konsole (oder einem zweiten Computer) verbinden Sie sich mit dem Computer und dem Port, auf dem gelauscht wird:
$ nc -N 127.0.0.1 1234
Es sollte nun eine Verbindung zwischen den Ports bestehen. Alles, was auf der zweiten Konsole eingegeben wird, wird an die erste Konsole angehängt und umgekehrt. Nachdem die Verbindung hergestellt wurde, spielt nc keine große Rolle, welche Seite als "Server" und welche als "Client" verwendet wird. Die Verbindung kann mit einem EOF (^D) beendet werden, da das Flag -N angegeben wurde.
Es gibt keine Option -c oder -e in diesem netcat, aber Sie können dennoch einen Befehl ausführen, nachdem die Verbindung hergestellt wurde, indem Sie Dateideskriptoren umleiten. Seien Sie hier vorsichtig, denn das Öffnen eines Ports und das Zulassen, dass sich jeder verbindet und beliebige Befehle auf Ihrem System ausführt, ist GEFÄHRLICH. Wenn Sie dies wirklich tun müssen, hier ist ein Beispiel:
Auf der "Server"-Seite:
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
Auf der "Client"-Seite:
$ nc host.example.com 1234
$ (Shell-Eingabeaufforderung von host.example.com)
Durch diesen Vorgang wird eine FIFO unter /tmp/f erstellt und nc wird angewiesen, am Port 1234 der Adresse 127.0.0.1 zu lauschen. Auf der „Server“-Seite wird, wenn ein „Client“ erfolgreich eine Verbindung zu diesem Port herstellt, /bin/sh ausgeführt und die Shell-Eingabeaufforderung an den „Client“ weitergeleitet.
Wenn die Verbindung beendet wird, wird auch nc beendet. Verwenden Sie -k, wenn Sie möchten, dass nc weiterhin auf Verbindungen wartet, aber wenn das ausgeführte Programm beendet wird, wird diese Option nc nicht neu starten oder am Laufen halten. Vergessen Sie außerdem nicht, den Dateideskriptor zu entfernen, sobald Sie ihn nicht mehr benötigen:
$ rm -f /tmp/f
DATENÜBERTRAGUNG
Das im vorherigen Abschnitt gezeigte Beispiel kann erweitert werden, um ein einfaches Datenübertragungsmodell zu erstellen. Alle in ein Ende der Verbindung eingegebenen Informationen werden am anderen Ende ausgegeben, und die Eingabe und Ausgabe können leicht erfasst werden, um eine Dateiverlagerung zu emulieren.
Beginnen Sie mit der Verwendung von nc, um auf einem bestimmten Port zu lauschen, wobei die Ausgabe in eine Datei umgeleitet wird:
$ nc -l 1234 > filename.out
Verwenden Sie auf einer zweiten Maschine nc, um sich mit dem lauschenden nc-Prozess zu verbinden und ihm die zu übertragende Datei zuzuführen:
$ nc -N host.example.com 1234 < filename.in
Nachdem die Datei übertragen wurde, wird die Verbindung automatisch geschlossen.
KOMMUNIKATION MIT SERVERN
Es ist manchmal nützlich, „manuell“ mit Servern zu kommunizieren, anstatt eine Benutzeroberfläche zu verwenden. Dies kann bei der Fehlerbehebung hilfreich sein, wenn es erforderlich ist, zu überprüfen, welche Daten ein Server als Antwort auf vom Client gesendete Befehle sendet. Um beispielsweise die Startseite einer Website abzurufen:
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
Beachten Sie, dass dies auch die vom Webserver gesendeten Header anzeigt. Diese können bei Bedarf mit einem Tool wie sed(1) gefiltert werden.
Es lassen sich komplexere Beispiele erstellen, wenn der Benutzer das Format der vom Server benötigten Anfragen kennt. Als weiteres Beispiel kann eine E-Mail über Folgendes an einen SMTP-Server gesendet werden:
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<_>
RCPT TO:<_>
DATA
Inhalt der E-Mail.
.
QUIT
EOF
PORT-SCAN
Es kann nützlich sein, zu wissen, welche Ports auf einer Zielmaschine geöffnet sind und Dienste ausführen. Mit der Option -z kann nc angewiesen werden, offene Ports anzuzeigen, anstatt eine Verbindung herzustellen. In der Regel ist es sinnvoll, die ausführliche Ausgabe auf die Standardfehlerausgabe (stderr) umzuleiten, indem man diese Option in Kombination mit der Option -v verwendet.
Zum Beispiel:
$ nc -zv host.example.com 20-30
Verbindung zu host.example.com 22 Port [tcp/ssh] erfolgreich!
Verbindung zu host.example.com 25 Port [tcp/smtp] erfolgreich!
Der Portbereich wurde angegeben, um die Suche auf die Ports 20 bis 30 zu beschränken, und wird in aufsteigender Reihenfolge durchlaufen (es sei denn, die Option -r ist gesetzt).
Sie können auch eine Liste von Ports angeben, die gescannt werden sollen, zum Beispiel:
$ nc -zv host.example.com http 20 22-23
nc: Verbindung zu host.example.com 80 (tcp) fehlgeschlagen: Verbindung verweigert
nc: Verbindung zu host.example.com 20 (tcp) fehlgeschlagen: Verbindung verweigert
Verbindung zu host.example.com Port [tcp/ssh] erfolgreich!
nc: Verbindung zu host.example.com 23 (tcp) fehlgeschlagen: Verbindung verweigert
Die Ports werden in der von Ihnen angegebenen Reihenfolge gescannt (es sei denn, die Option -r ist gesetzt).
Alternativ kann es nützlich sein, zu wissen, welche Serversoftware ausgeführt wird und welche Versionen. Diese Informationen sind oft in den Begrüßungsbannern enthalten. Um diese abzurufen, ist es notwendig, zuerst eine Verbindung herzustellen und dann die Verbindung zu unterbrechen, wenn das Banner abgerufen wurde. Dies kann durch Angabe eines kleinen Timeouts mit der Option -w oder durch Senden eines "QUIT"-Befehls an den Server erfolgen:
$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protokoll-Mismatch.
220host.example.com IMS SMTP Receiver Version 0.84 Ready
BEISPIELE
Eine TCP-Verbindung zum Port 42 von host.example.com öffnen, wobei Port 31337 als Quellport und ein Timeout von 5 Sekunden verwendet wird:
$ nc -p 31337 -w 5 host.example.com 42
Eine UDP-Verbindung zum Port 53 von host.example.com öffnen:
$ nc -u host.example.com 53
Eine TCP-Verbindung zum Port 42 von host.example.com öffnen, wobei 10.1.2.3 als IP-Adresse für das lokale Ende der Verbindung verwendet wird:
$ nc -s 10.1.2.3 host.example.com 42
Eine Unix-Domain-Stream-Socket-Verbindung erstellen und darauf hören:
$ nc -lU /var/tmp/dsocket
Eine Verbindung zum Port 42 von host.example.com über einen HTTP-Proxy unter 10.2.3.4, Port 8080 herstellen. Dieses Beispiel könnte auch von ssh(1) verwendet werden; siehe die Option ProxyCommand in ssh_config(5) für weitere Informationen.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
Dasselbe Beispiel noch einmal, diesmal mit aktivierter Proxy-Authentifizierung mit dem Benutzernamen „ruser“, falls der Proxy dies erfordert:
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
SIEHE AUCH
AUTOREN
Ursprüngliche Implementierung von *Hobbit* <_>. Mit IPv6-Unterstützung von Eric Jackson <_> neu geschrieben. Für Debian portiert von Aron Xu ⟨_⟩.
HINWEISE
UDP-Portscans mit der Kombination der Flags -uz melden immer Erfolg, unabhängig vom Zustand der Zielmaschine. In Verbindung mit einem Traffic-Sniffer entweder auf der Zielmaschine oder einem Zwischengerät kann die Kombination -uz jedoch für Kommunikationsdiagnosen nützlich sein. Beachten Sie, dass die Menge des generierten UDP-Datenverkehrs entweder durch Hardware-Ressourcen und/oder Konfigurationseinstellungen begrenzt sein kann.