Telnet fungiert als Netzwerkprotokoll, das den Fernzugriff auf ein Rechnersystem ermöglicht und eine textbasierte bidirektionale Kommunikation etabliert. Um diese Interaktion zu realisieren, sind sowohl ein Telnet-Server als auch ein Telnet-Client erforderlich.
Telnet gehört zu den etablierten Dienstprogrammen unter Linux und Windows und hat über einen langen Zeitraum seine Funktion erfüllt.
Ein wesentlicher Nachteil von Telnet in modernen Umgebungen ist seine mangelnde Sicherheit. Die gesamte Kommunikation über Telnet erfolgt in Klartext, wodurch der Netzwerkverkehr unverschlüsselt bleibt. Dies birgt das Risiko, dass Dritte mit entsprechenden Befugnissen und Werkzeugen diesen Verkehr abfangen und einsehen können. Aus diesem Grund ist Telnet auf den meisten aktuellen Linux-Distributionen nicht standardmäßig installiert und von seiner Verwendung wird im Allgemeinen abgeraten.
Mit der Einführung von SSH (Secure Shell), einem verschlüsselten und verbesserten Nachfolger von Telnet, hat sich die Nutzung von Telnet für seinen ursprünglichen Zweck weitgehend erübrigt. Jedoch wird Telnet nach wie vor von vielen Systemadministratoren und Technikinteressierten für eine alternative Anwendung geschätzt: die Überprüfung der Erreichbarkeit von TCP-Ports.
Durch den Telnet-Befehl lässt sich leicht feststellen, ob ein entfernter TCP-Port empfangsbereit ist und ordnungsgemäß antwortet. Das folgende Beispiel demonstriert die Überprüfung der Verfügbarkeit und Funktion von google.com durch Testen der HTTP/HTTPS-Verbindung:
$ telnet google.com 80 Versuche 142.250.183.206... Verbunden mit google.com. Escape-Zeichen ist '^]'. ^] telnet> quit Verbindung geschlossen. $ $ telnet google.com 443 Versuche 142.250.183.206... Verbunden mit google.com. Escape-Zeichen ist '^]'. ^] telnet> quit Verbindung geschlossen. $
Ein TCP-Port, der nicht zugänglich oder geschlossen ist, zeigt bei der Überprüfung mit Telnet folgendes Verhalten:
$ telnet google.com 22 Versuche 142.250.193.174... ^C $
Dies erleichtert in Kombination mit Befehlen wie Ping, Traceroute/Tracepath, Netstat usw. die Diagnose bei grundlegenden Problemen der Netzwerkverbindung.
In RHEL 8 (und sogar älteren Versionen von RHEL/CentOS) steht das Tool nc (oder Ncat, Network Connector) zur Verfügung, das eine Vielzahl von Optionen für die Netzwerkdiagnose bietet. Im Folgenden wird die Installation und Verwendung dieses Tools auf RHEL8-Systemen erläutert.
Was ist nc?
nc (oder Ncat) ist ein universelles Befehlszeilenwerkzeug zum Lesen, Schreiben, Weiterleiten und Verschlüsseln von Daten über ein Netzwerk. Es wurde ursprünglich im Rahmen des nmap-Projekts entwickelt und ist mittlerweile in verschiedenen Implementierungen verfügbar. nc unterstützt sowohl TCP als auch UDP über IPv4 und IPv6 und bietet vielfältige Anwendungsmöglichkeiten.
Einige Hauptfunktionen des Dienstprogramms nc sind:
- Verkettung von nc-Instanzen.
- Weiterleitung von TCP-, UDP- und SCTP-Ports an andere Adressen.
- Verschlüsselung der Kommunikation durch SSL-Unterstützung.
- Proxy-Unterstützung über SOCKS4/5- oder HTTP-Proxys (einschließlich Authentifizierung).
- Kompatibilität mit verschiedenen Plattformen, einschließlich Windows, Linux und macOS.
NC installieren
nc ist in den Standard-Repositorys von RHEL-Systemen enthalten. Die Installation unter RHEL 7 erfolgt durch den folgenden Befehl im Terminal:
$ sudo yum install -y nc
Für RHEL 8-Systeme kann der Befehl dnf verwendet werden:
$ sudo dnf install -y nc
TCP-Konnektivität prüfen
nc bietet eine Vielzahl von Funktionen, die in verschiedenen Anwendungen eingesetzt werden können. Eine der häufigsten Anwendungen ist jedoch die Netzwerk-Fehlerbehebung als Alternative zu Telnet.
Mit nc kann man feststellen, ob ein TCP-Port erreichbar ist. Die Syntax hierfür lautet:
$ nc -vz <IP/DNS> <Port>
Als Beispiel, um zu prüfen, ob wdzwdz über http oder https erreichbar ist, kann dies mit nc wie folgt getestet werden (Port 80 für http, Port 443 für https):
$ nc -vz wdzwdz.com 80 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Verbunden mit 104.26.11.88:80. Ncat: 0 Bytes gesendet, 0 Bytes empfangen in 0.02 Sekunden. $ $ nc -vz wdzwdz.com 443 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Verbunden mit 104.26.10.88:443. Ncat: 0 Bytes gesendet, 0 Bytes empfangen in 0.01 Sekunden. $
Ein nicht erreichbarer oder blockierter Port liefert hingegen eine Ausgabe wie diese (mehrere Adressen werden geprüft, da wdzwdz-DNS auf mehrere IPs zeigt):
$ nc -vz wdzwdz.com 22 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Verbindung zu 172.67.70.213 fehlgeschlagen: Zeitüberschreitung bei der Verbindung. Ncat: Versuche nächste Adresse... Ncat: Verbindung zu 104.26.11.88 fehlgeschlagen: Zeitüberschreitung bei der Verbindung. Ncat: Versuche nächste Adresse... Ncat: Verbindung zu 104.26.10.88 fehlgeschlagen: Zeitüberschreitung bei der Verbindung. Ncat: Versuche nächste Adresse... Ncat: Verbindung zu 2606:4700:20::681a:a58 fehlgeschlagen: Netzwerk nicht erreichbar. Ncat: Versuche nächste Adresse... Ncat: Verbindung zu 2606:4700:20::681a:b58 fehlgeschlagen: Netzwerk nicht erreichbar. Ncat: Versuche nächste Adresse... Ncat: Netzwerk nicht erreichbar. $ $ dig wdzwdz.com +short 104.26.10.88 172.67.70.213 104.26.11.88 $
UDP-Konnektivität prüfen
Telnet kann nur die Kommunikation mit einem entfernten TCP-Port prüfen. nc ermöglicht hingegen die Überprüfung der Konnektivität sowohl über TCP als auch über UDP.
Mit nc lassen sich UDP-Pakete anstelle der standardmäßigen TCP-Pakete durch folgenden Befehl versenden:
$ nc -vzu <IP/DNS> <Port>
Da UDP jedoch ein sitzungsloses Protokoll ist, kann die durchgängige UDP-Konnektivität nicht in allen Szenarien durch einfaches Senden von Paketen an einem Ende bestätigt werden. Nur wenn der Empfangsprozess am entfernten Ende eine Antwort sendet, kann nc bewerten, ob das gesendete Paket das Ziel erreicht hat. nc bietet jedoch eine alternative Methode zur Bestimmung der durchgängigen UDP-Konnektivität, indem es einen UDP-Listener startet, vorausgesetzt, man hat korrekten Zugriff auf die Befehlszeile des Remote-Servers.
Soll beispielsweise die UDP-Konnektivität zwischen zwei Linux-Hosts für DNS mit nc geprüft werden, kann dies durch den Start eines nc-Servers erfolgen, der den erforderlichen Port überwacht:
$ sudo nc -ul <Port>
Für DNS ist der Port 53 relevant, sodass der Befehl folgendermaßen aussieht:
$ nc -ul 53
Auf der Client-Seite wird ein weiterer nc-Prozess gestartet, der UDP-Pakete an den Server sendet:
$ nc -u <IP/DNS> <Port>
Der resultierende Befehl lautet:
$ nc -u <IP/DNS> 53
Unter der Voraussetzung, dass der UDP-Verkehr für Port 53 zwischen diesen Computern nicht blockiert wird, sollte jede Eingabe auf einem Computer auf dem anderen Host sichtbar sein, ähnlich wie bei einem Zwei-Wege-Chat. Andernfalls blockiert eine Firewall die Konnektivität zwischen den beiden Systemen.
Das Server- und Client-Modell mit nc eignet sich gut für einfache Verbindungsprüfungen zwischen Hosts. Analog zur oben beschriebenen UDP-Prüfung kann nc auch TCP-Pakete auf einem bestimmten Port empfangen:
$ sudo nc -l <Port>
Auf der Client-Seite können TCP-Pakete zur Überprüfung der Konnektivität gesendet werden:
$ nc <IP/DNS> <Port>
Das oben beschriebene Server/Client-nc-Verfahren ist bei TCP-Verbindungen (im Gegensatz zu UDP) nicht erforderlich, da es sich um ein verbindungsorientiertes Protokoll handelt, das mit Bestätigungen arbeitet. Jeder lauschende Prozess, der auf TCP arbeitet, antwortet direkt auf von nc gesendete TCP-Pakete.
Zusammenfassung
Dieser Artikel beschreibt, wie das Dienstprogramm nc als direkter Ersatz für Telnet in modernen Linux-Systemen dienen kann, insbesondere im Hinblick auf die Überprüfung der Portkonnektivität. Es bietet dem Anwender eine erweiterte Palette an Möglichkeiten zur Diagnose und Behebung von Netzwerkproblemen.
Die Hilfe für nc kann über den Befehl `nc -h` eingesehen werden:
$ nc -h Ncat 7.70 ( https://nmap.org/ncat ) Verwendung: ncat [Optionen] [Hostname] [Port] Optionen, die eine Zeitangabe verwenden, sind in Sekunden anzugeben. Hängen Sie 'ms' für Millisekunden, 's' für Sekunden, 'm' für Minuten oder 'h' für Stunden an (z.B. 500ms). -4 Verwende nur IPv4 -6 Verwende nur IPv6 -U, --unixsock Verwende nur Unix-Domain-Sockets -C, --crlf Verwende CRLF für EOL-Sequenz -c, --sh-exec <Befehl> Führe den gegebenen Befehl über /bin/sh aus -e, --exec <Befehl> Führt den gegebenen Befehl aus --lua-exec <Dateiname> Führt das gegebene Lua-Skript aus -g Hop1[,Hop2,...] Lose Source-Routing-Hop-Punkte (max. 8) -G <n> Zeiger für Loose Source Routing Hop (4, 8, 12, ...) -m, --max-conns <n> Maximale <n> gleichzeitige Verbindungen -h, --help Zeige diesen Hilfebildschirm an -d, --delay <Zeit> Wartezeit zwischen Lese-/Schreibvorgängen -o, --output <Dateiname> Schreibe Sitzungsdaten in eine Datei -x, --hex-dump <Dateiname> Schreibe Sitzungsdaten als Hex in eine Datei -i, --idle-timeout <Zeit> Lese-/Schreib-Leerlauf-Timeout -p, --source-port Port Spezifiziere zu verwendenden Quellport -s, --source Adresse Spezifiziere die zu verwendende Quelladresse (hat keine Auswirkung auf -l) -l, --listen Binde und warte auf eingehende Verbindungen -k, --keep-open Akzeptiere mehrere Verbindungen im Listen-Modus -n, --nodns Löse Hostnamen nicht über DNS auf -t, --telnet Antworte auf Telnet-Verhandlungen -u, --udp Verwende UDP anstelle des standardmäßigen TCP --sctp Verwende SCTP anstelle des standardmäßigen TCP -v, --verbose Setze den Detaillierungsgrad (kann mehrfach verwendet werden) -w, --wait <Zeit> Verbindungs-Timeout -z Null-I/O-Modus, melde nur den Verbindungsstatus --append-output Hänge an die angegebenen Ausgabedateien an, anstatt sie zu überschreiben --send-only Sende nur Daten, ignoriere empfangene; beende bei EOF --recv-only Empfange nur Daten, sende nie etwas --allow Erlaube nur die Verbindung bestimmter Hosts mit Ncat --allowfile Eine Datei mit Hosts, die eine Verbindung mit Ncat herstellen dürfen --deny Verweigere die Verbindung bestimmter Hosts mit Ncat --denyfile Eine Datei mit Hosts, denen die Verbindung mit Ncat verweigert wird --broker Aktiviere den Verbindungs-Broker-Modus von Ncat --chat Starte einen einfachen Ncat-Chat-Server --proxy <Adresse[:Port]> Spezifiziere die Adresse des Hosts, über den eine Verbindung per Proxy hergestellt werden soll --proxy-type <Typ> Spezifiziere den Proxy-Typ ("http" oder "socks4" oder "socks5") --proxy-auth <Auth> Authentifiziere dich mit einem HTTP- oder SOCKS-Proxyserver --ssl Verbinde oder lausche mit SSL --ssl-cert Spezifiziere die SSL-Zertifikatsdatei (PEM) zum Lauschen --ssl-key Spezifiziere den privaten SSL-Schlüssel (PEM) zum Lauschen --ssl-verify Verifiziere die Vertrauenswürdigkeit und den Domainnamen von Zertifikaten --ssl-trustfile PEM-Datei, die vertrauenswürdige SSL-Zertifikate enthält --ssl-ciphers Chiffrierliste mit zu verwendenden SSL-Chiffren --ssl-alpn ALPN-Protokollliste zur Verwendung. --version Zeige die Versionsinformationen von Ncat an und beende das Programm Siehe die Manpage ncat(1) für vollständige Optionen, Beschreibungen und Anwendungsbeispiele $
Detailliertere Informationen zum nc-Befehl sind in der zugehörigen Handbuchseite verfügbar.
$ man nc