Letar du efter telnet på RHEL 8? Försök med nc

By rik

Telnet är ett nätverksprotokoll som möjliggör fjärråtkomst till en dator och etablerar en textbaserad tvåvägskommunikation. För att detta ska fungera krävs både en telnet-server och en telnet-klient som kan kommunicera med varandra.

Telnet har länge varit ett vanligt förekommande verktyg i både Linux- och Windows-miljöer, men dess popularitet har minskat.

Ett av de största problemen med telnet i moderna system är dess brist på säkerhet. All kommunikation via telnet sker i klartext, vilket innebär att all nätverkstrafik är okrypterad. Det gör det möjligt för obehöriga med rätt verktyg att övervaka nätverkstrafiken och läsa den känsliga informationen. Därför är telnet inte förinstallerat i de flesta moderna Linux-distributioner, och användningen av det avråds starkt.

Med introduktionen av SSH (Secure Shell), som erbjuder en krypterad ersättning för telnet, har användningen av telnet i dess ursprungliga syfte i stort sett blivit obsolet. Det finns dock en alternativ användning av telnet som fortfarande används flitigt av systemadministratörer och teknikintresserade, nämligen för att kontrollera anslutningen till fjärranslutna TCP-portar.

Genom att använda telnet-kommandot kan man enkelt kontrollera om en fjärr-TCP-port lyssnar och svarar korrekt. Nedanstående exempel visar hur man kan verifiera att google.com är tillgängligt genom att kontrollera HTTP/HTTPS-anslutningen.

$ 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.
$

En TCP-port som inte är öppen eller tillgänglig kommer att ge ett resultat som liknar det nedan när den kontrolleras med telnet:

$ telnet google.com 22
Trying 142.250.193.174...
^C
$

Detta gör det enkelt att diagnostisera enklare problem med nätverksanslutning tillsammans med kommandon som ping, traceroute eller tracepath, netstat med mera.

I RHEL 8 (och även äldre RHEL/CentOS-versioner) finns verktyget nc (eller Ncat eller Network Connector), som erbjuder en mängd alternativ för nätverksdiagnostik. Vi kommer härnäst att gå igenom hur du installerar och använder detta verktyg på RHEL8 och liknande system.

Vad är nc?

nc (eller Ncat) är ett flexibelt kommandoradsverktyg som används för att läsa, skriva, omdirigera och kryptera data över nätverk. Det skapades ursprungligen för nmap-projektet och det finns nu ett flertal implementationer av Netcat tillgängliga. Det fungerar med både TCP och UDP över IPv4 och IPv6, vilket ger en mängd potentiella användningsområden.

Här är några av de viktigaste funktionerna som nc-verktyget erbjuder:

  • Möjlighet att koppla samman anslutningar
  • Omdirigering av TCP-, UDP- och SCTP-portar till andra adresser
  • Kryptering av kommunikation med SSL-stöd
  • Proxystöd via SOCK4/5 eller HTTP-proxyservrar (inklusive autentisering)
  • Stöd för flera plattformar, inklusive Windows, Linux och macOS

Installation av nc

nc ingår som en del av standardpaketen i RHEL-system. För att installera det på ett RHEL 7-system, kör följande kommando i terminalen:

$ sudo yum install -y nc

På RHEL 8-system kan dnf användas på följande sätt:

$ sudo dnf install -y nc

Kontrollera TCP-anslutning

Även om nc erbjuder en mängd funktioner för olika användningsområden, är en av de vanligaste under felsökning av nätverk, som ett alternativ till telnet.

nc kan visa om en TCP-port är nåbar. Här är syntaxen:

$ nc -vz <IP/DNS> <Port>

Om vi vill kontrollera om adminvista.com är nåbart via http eller https kan vi göra det med nc, som visas nedan (port 80 används för http och 443 för https):

$ nc -vz adminvista.com.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 adminvista.com.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.
$

Om en port inte är nåbar eller är blockerad kommer resultatet att se ut som nedan (adminvista.com DNS pekar mot flera IP-adresser, som alla testas):

$ nc -vz adminvista.com.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 adminvista.com.com +short
104.26.10.88
172.67.70.213
104.26.11.88
$

Kontrollera UDP-anslutning

telnet kan endast kontrollera kommunikationen med fjärr-TCP-portar, medan nc ger dig möjlighet att kontrollera både TCP- och UDP-anslutningar.

nc kan skicka UDP-paket istället för standard TCP-paket genom att använda följande kommando:

$ nc -vzu <IP/DNS> <Port>

Men eftersom UDP är ett sessionslöst protokoll, till skillnad från TCP, kan du inte i alla scenarion bekräfta en fullständig UDP-anslutning bara genom att skicka UDP-paket från ena änden. Om lyssningsprocessen i andra änden inte skickar något svar kan nc inte avgöra om paketen nådde sin destination eller inte. nc erbjuder dock ett alternativ för att testa fullständig UDP-anslutning genom att starta en UDP-lyssnare, förutsatt att du har behörighet att använda CLI på fjärrservern.

Om vi antar att du behöver verifiera UDP-anslutningen mellan två Linux-värdar för DNS med hjälp av nc kan du enklast göra detta genom att starta en nc-server som lyssnar på den port som behövs:

$ sudo nc -ul <Port>

För DNS måste vi kontrollera port 53, vilket skulle ge oss följande kommando:

$ nc -ul 53

På klientsidan behöver du starta en annan nc-process som skickar UDP-paket till servern:

$ nc -u <IP/DNS> <Port>

Detta skulle ge oss följande kommando:

$ nc -u <IP/DNS> 53

Om inget blockerar UDP-trafiken för port 53 mellan de två maskinerna, kommer allt du skriver in på ena datorn att synas på den andra som en tvåvägs chatt. Om det inte fungerar blockeras anslutningen av någon brandvägg mellan systemen.

Server- och klientmodellen som använder nc fungerar bra för enkla anslutningstester mellan värdar. På liknande sätt som UDP-kontrollen ovan kan nc även lyssna efter TCP-paket på en given port:

$ sudo nc -l <Port>

På klientsidan kan du skicka TCP-paket för att kontrollera anslutningen:

$ nc <IP/DNS> <Port>

Server-/klientmetoden med nc behövs inte för TCP-anslutningar (till skillnad från UDP), eftersom TCP är ett anslutningsorienterat protokoll och fungerar med bekräftelser. Alla lyssningsprocesser som hanterar TCP kommer att svara direkt på nc TCP-paket.

Sammanfattning

Den här artikeln har sammanfattat hur nc-verktyget fungerar som en fullgod ersättning för telnet i moderna Linux-system när det gäller att testa portanslutning. nc ger också användaren betydligt mer kraft när det kommer till att diagnostisera och lösa problem i nätverk.

Hjälp för nc nås med kommandot 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
$

Mer detaljerad information om nc-kommandot hittar du i dess manualsida.

$ man nc