Telnet : Un protocole désuet mais encore utile
Telnet est un protocole réseau permettant l’accès distant à un ordinateur via une communication textuelle bidirectionnelle. Pour établir une telle communication, un serveur et un client Telnet sont indispensables.
Longtemps utilisé, Telnet a été un outil populaire sous Linux et Windows.
Cependant, la principale faille de Telnet, en particulier dans les systèmes modernes, réside dans son manque de sécurité. Toutes les données transmises via Telnet le sont en clair, sans chiffrement. Ainsi, toute personne ayant un accès au réseau et les outils nécessaires peut intercepter et lire ces informations. C’est pourquoi la plupart des distributions Linux actuelles n’incluent plus Telnet par défaut et déconseillent son utilisation.
L’arrivée du protocole SSH (Secure Shell), une alternative chiffrée à Telnet, a rendu l’utilisation de ce dernier obsolète. Toutefois, Telnet conserve un intérêt pour certains administrateurs et passionnés de technologie, notamment pour vérifier la connectivité des ports TCP distants.
En effet, avec la commande Telnet, il est simple de vérifier si un port TCP distant est à l’écoute et répond correctement. L’exemple ci-dessous montre comment vérifier si google.com est accessible en testant les connexions HTTP/HTTPS.
$ telnet google.com 80 Trying 142.250.183.206... Connected to google.com. Escape character is '^]'. ^] telnet> quit Connection closed. $ $ telnet google.com 443 Trying 142.250.183.206... Connected to google.com. Escape character is '^]'. ^] telnet> quit Connection closed. $
Un port TCP inaccessible ou fermé se comportera comme suit lors d’une tentative de connexion avec Telnet :
$ telnet google.com 22 Trying 142.250.193.174... ^C $
Cette fonctionnalité facilite le diagnostic des problèmes de connectivité réseau, en complément des commandes ping, traceroute, tracepath, ou encore netstat.
Pour les utilisateurs de RHEL 8 (ou de versions plus anciennes de RHEL/CentOS), il existe une alternative plus performante : l’outil nc (ou Ncat ou Network Connector), qui offre de nombreuses options de diagnostic réseau. Nous allons détailler son installation et son utilisation sur RHEL8 et systèmes similaires.
nc : Qu’est-ce que c’est ?
nc (ou Ncat) est un utilitaire en ligne de commande polyvalent permettant de lire, écrire, rediriger et chiffrer des données sur un réseau. Développé initialement pour le projet nmap, de nombreuses implémentations de Netcat sont désormais disponibles. Il supporte les protocoles TCP et UDP sur IPv4 et IPv6 et offre des possibilités d’utilisation très vastes.
Voici quelques-unes des fonctionnalités clés de l’utilitaire nc :
- Possibilité d’enchaîner les ncats
- Redirection des ports TCP, UDP et SCTP vers d’autres destinations
- Chiffrement des communications via SSL
- Support des proxys via SOCKS4/5 ou HTTP (avec authentification)
- Compatibilité multiplateforme, incluant Windows, Linux et macOS
Installation de nc
nc est inclus dans les dépôts par défaut des systèmes RHEL. Pour l’installer sur RHEL 7, exécutez simplement la commande suivante dans le terminal :
$ sudo yum install -y nc
Pour les systèmes RHEL 8, vous pouvez utiliser dnf :
$ sudo dnf install -y nc
Vérification de la connectivité TCP
Bien que nc offre de nombreuses fonctionnalités, son usage le plus courant est le dépannage réseau, en remplacement de Telnet.
nc permet de vérifier si un port TCP est accessible. Voici la syntaxe de la commande :
$ nc -vz <IP/DNS> <Port>
Par exemple, pour vérifier l’accessibilité de toptips.fr via HTTP ou HTTPS, on peut utiliser nc comme suit (le port 80 correspond à HTTP et le port 443 à HTTPS) :
$ nc -vz toptips.fr.com 80 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 104.26.11.88:80. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds. $ $ nc -vz toptips.fr.com 443 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 104.26.10.88:443. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. $
De la même manière, un port inaccessible ou bloqué affichera un résultat similaire (plusieurs adresses IP sont testées car le nom DNS toptips.fr renvoie à plusieurs adresses) :
$ nc -vz toptips.fr.com 22 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connection to 172.67.70.213 failed: Connection timed out. Ncat: Trying next address... Ncat: Connection to 104.26.11.88 failed: Connection timed out. Ncat: Trying next address... Ncat: Connection to 104.26.10.88 failed: Connection timed out. Ncat: Trying next address... Ncat: Connection to 2606:4700:20::681a:a58 failed: Network is unreachable. Ncat: Trying next address... Ncat: Connection to 2606:4700:20::681a:b58 failed: Network is unreachable. Ncat: Trying next address... Ncat: Network is unreachable. $ $ dig toptips.fr.com +short 104.26.10.88 172.67.70.213 104.26.11.88 $
Vérification de la connectivité UDP
Alors que Telnet ne peut tester que les ports TCP, nc permet de vérifier la connectivité TCP et UDP.
nc peut envoyer des paquets UDP au lieu des paquets TCP par défaut en utilisant la commande :
$ nc -vzu <IP/DNS> <Port>
UDP étant un protocole sans session (contrairement à TCP), il n’est pas toujours possible de confirmer une connectivité UDP de bout en bout en se basant uniquement sur l’envoi de paquets UDP. En effet, sans réponse du processus d’écoute distant, nc ne peut pas déterminer si le paquet est arrivé à destination. Cependant, nc offre une alternative en lançant un écouteur UDP sur le serveur distant, sous réserve d’avoir un accès CLI.
Par exemple, pour vérifier la connectivité UDP entre deux hôtes Linux pour le DNS, on peut lancer un écouteur nc sur le port voulu du serveur:
$ sudo nc -ul <Port>
Pour le DNS, nous utilisons le port 53, ce qui donne la commande :
$ nc -ul 53
Côté client, lancez un autre processus nc qui envoie des paquets UDP au serveur :
$ nc -u <IP/DNS> <Port>
Dans notre exemple, la commande devient :
$ nc -u <IP/DNS> 53
Si aucun pare-feu ne bloque le trafic UDP sur le port 53, tout texte tapé et validé sur une machine devrait être visible sur l’autre, créant ainsi une sorte de chat bidirectionnel. Si ce n’est pas le cas, un pare-feu est probablement à l’origine du problème.
Ce modèle serveur-client de nc est idéal pour ces types de vérifications de connectivité simples. nc peut également écouter des paquets TCP sur un port donné :
$ sudo nc -l <Port>
Côté client, vous pouvez envoyer des paquets TCP pour vérifier la connexion :
$ nc <IP/DNS> <Port>
La méthode serveur/client nc n’est pas indispensable pour les connexions TCP (contrairement à UDP), car c’est un protocole orienté connexion qui fonctionne avec des accusés de réception. Un processus en écoute sur TCP répondra directement aux paquets TCP envoyés par nc.
Résumé
Cet article montre comment l’utilitaire nc remplace Telnet dans les systèmes Linux modernes pour vérifier la connectivité des ports, tout en offrant plus de possibilités pour diagnostiquer les problèmes réseau.
L’aide de nc est accessible via la commande nc -h :
$ nc -h Ncat 7.70 ( https://nmap.org/ncat ) Usage: ncat [options] [hostname] [port] Options taking a time assume seconds. Append 'ms' for milliseconds, 's' for seconds, 'm' for minutes, or 'h' for hours (e.g. 500ms). -4 Use IPv4 only -6 Use IPv6 only -U, --unixsock Use Unix domain sockets only -C, --crlf Use CRLF for EOL sequence -c, --sh-exec <command> Executes the given command via /bin/sh -e, --exec <command> Executes the given command --lua-exec <filename> Executes the given Lua script -g hop1[,hop2,...] Loose source routing hop points (8 max) -G <n> Loose source routing hop pointer (4, 8, 12, ...) -m, --max-conns <n> Maximum <n> simultaneous connections -h, --help Display this help screen -d, --delay <time> Wait between read/writes -o, --output <filename> Dump session data to a file -x, --hex-dump <filename> Dump session data as hex to a file -i, --idle-timeout <time> Idle read/write timeout -p, --source-port port Specify source port to use -s, --source addr Specify source address to use (doesn't affect -l) -l, --listen Bind and listen for incoming connections -k, --keep-open Accept multiple connections in listen mode -n, --nodns Do not resolve hostnames via DNS -t, --telnet Answer Telnet negotiations -u, --udp Use UDP instead of default TCP --sctp Use SCTP instead of default TCP -v, --verbose Set verbosity level (can be used several times) -w, --wait <time> Connect timeout -z Zero-I/O mode, report connection status only --append-output Append rather than clobber specified output files --send-only Only send data, ignoring received; quit on EOF --recv-only Only receive data, never send anything --allow Allow only given hosts to connect to Ncat --allowfile A file of hosts allowed to connect to Ncat --deny Deny given hosts from connecting to Ncat --denyfile A file of hosts denied from connecting to Ncat --broker Enable Ncat's connection brokering mode --chat Start a simple Ncat chat server --proxy <addr[:port]> Specify address of host to proxy through --proxy-type <type> Specify proxy type ("http" or "socks4" or "socks5") --proxy-auth <auth> Authenticate with HTTP or SOCKS proxy server --ssl Connect or listen with SSL --ssl-cert Specify SSL certificate file (PEM) for listening --ssl-key Specify SSL private key (PEM) for listening --ssl-verify Verify trust and domain name of certificates --ssl-trustfile PEM file containing trusted SSL certificates --ssl-ciphers Cipherlist containing SSL ciphers to use --ssl-alpn ALPN protocol list to use. --version Display Ncat's version information and exit See the ncat(1) manpage for full options, descriptions and usage examples $
Pour des informations plus complètes sur la commande nc, référez-vous à sa page de manuel.
$ man nc