Netcat (nc): Telnets sikre erstatning for nettverksfeilsøking

Telnet er en nettverksprotokoll som benyttes for fjernstyring av en datamaskin og tillater toveis tekstbasert kommunikasjon. For å etablere en slik forbindelse, behøves en telnet-server og en klient som kan kommunisere med hverandre.

Telnet er et velkjent verktøy for Linux og Windows som har vært i bruk lenge.

En betydelig ulempe med telnet i moderne systemer er dens manglende sikkerhet. All kommunikasjon via telnet skjer i ren tekst, uten kryptering. Dette gjør at all nettverkstrafikk er sårbar for avlytting av uvedkommende med tilgang og de rette verktøyene. Derfor leveres de fleste moderne Linux-distribusjoner uten telnet forhåndsinstallert, og det anbefales generelt å unngå bruken av det.

Med innføringen av SSH (Secure Shell), som er en kryptert erstatning for telnet, har telnets primære bruksområde blitt ansett som utdatert. Likevel benytter mange systemadministratorer og teknologientusiaster telnet til å sjekke tilkoblingen til eksterne TCP-porter.

Ved hjelp av telnet kan man enkelt sjekke om en ekstern TCP-port lytter og svarer korrekt. Eksempelet nedenfor demonstrerer hvordan man kan sjekke om google.com er tilgjengelig ved å verifisere HTTP/HTTPS-tilkobling.

$ 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 ikke er åpen eller tilgjengelig vil reagere som vist under ved bruk av telnet:

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

Dette gjør det enkelt å feilsøke enkle nettverkstilkoblingsproblemer sammen med kommandoer som ping, traceroute/tracepath og netstat.

Dersom du bruker RHEL 8 (eller eldre versjoner av RHEL/CentOS), har du mulighet til å benytte nc (eller Ncat eller Network Connector), som tilbyr en rekke alternativer for nettverksdiagnostikk. Vi skal nå se på hvordan man installerer og bruker dette verktøyet på RHEL8 og lignende systemer.

Hva er nc?

nc (eller Ncat) er et allsidig kommandolinjeverktøy som brukes til å lese, skrive, omdirigere og kryptere data over et nettverk. Det ble opprinnelig utviklet for nmap-prosjektet, og det finnes nå flere implementeringer av Netcat tilgjengelig. Verktøyet fungerer med både TCP og UDP over IPv4 og IPv6, og har et bredt spekter av potensielle bruksområder.

Her er noen av de viktigste funksjonene til nc-verktøyet:

  • Evne til å koble sammen flere prosesser
  • Omdirigering av TCP-, UDP- og SCTP-porter til andre nettsteder
  • Kryptert kommunikasjon med SSL-støtte
  • Proxy-støtte via SOCKS4/5 eller HTTP-proxyer (inkludert autentisering)
  • Støtte for flere plattformer, inkludert Windows, Linux og macOS

Installere nc

nc er inkludert i standardpakkelagrene for RHEL-systemer. For å installere det på et RHEL 7-system, bruk kommandoen nedenfor i terminalen:

$ sudo yum install -y nc

For RHEL 8-systemer, bruk dnf slik:

$ sudo dnf install -y nc

Sjekke TCP-tilkobling

Selv om nc tilbyr mange funksjoner for ulike applikasjoner, er en vanlig bruk å sjekke nettverkstilkoblinger, som et alternativ til telnet.

nc kan verifisere om en TCP-port er tilgjengelig. Her er syntaksen:

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

For eksempel, dersom du ønsker å kontrollere om tipsbilk.net er tilgjengelig via http eller https, kan du bruke nc som vist nedenfor (port 80 for http, port 443 for https):

$ nc -vz tipsbilk.net.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 tipsbilk.net.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.
$

På samme måte vil en utilgjengelig eller blokkert port vise følgende utdata (flere adresser er sjekket da tipsbilk.net peker til flere IP-adresser):

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

Sjekke UDP-tilkobling

Telnet kan kun sjekke kommunikasjon med en ekstern TCP-port, mens nc gir mulighet til å verifisere både TCP- og UDP-tilkoblinger.

nc kan enkelt sende UDP-pakker i stedet for standard TCP-pakker ved å bruke:

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

UDP er en sesjonsløs protokoll, i motsetning til TCP. Dette betyr at en ende-til-ende UDP-tilkobling ikke kan bekreftes i alle tilfeller ved å kun sende UDP-pakker fra en side. Med mindre lyttingsprosessen på den eksterne enden sender et svar, kan nc ikke vurdere om pakken har nådd sin destinasjon. nc tilbyr imidlertid et alternativ for å bekrefte ende-til-ende UDP-tilkobling ved å starte en UDP-lytter, forutsatt at du har tilgang til kommandolinjen på den eksterne serveren.

Dersom du skal verifisere UDP-tilkobling mellom to Linux-verter for DNS med nc, kan man starte nc-serverlytting på den nødvendige porten:

$ sudo nc -ul <Port>

For DNS må port 53 sjekkes. Kommandoen blir dermed:

$ nc -ul 53

På klientsiden må du starte en ny nc-prosess som sender UDP-pakker til serveren:

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

Dette gir følgende kommando:

$ nc -u <IP/DNS> 53

Forutsatt at UDP-trafikk på port 53 ikke er blokkert mellom de to maskinene, vil det du skriver inn på den ene maskinen, være synlig på den andre som en toveis chat. Hvis ikke, blokkerer en brannmur tilkoblingen.

Server- og klientmodellen ved bruk av nc fungerer godt for denne type enkle tilkoblingskontroller mellom verter. I likhet med UDP-kontrollen ovenfor, kan nc også lytte etter TCP-pakker på en gitt port:

$ sudo nc -l <Port>

På klientsiden kan man sende TCP-pakker for å sjekke tilkoblingen:

$ nc <IP/DNS> <Port>

Server/klient nc-metoden er ikke nødvendig for TCP-tilkoblinger (i motsetning til UDP), da TCP er en tilkoblingsorientert protokoll som bruker bekreftelser. Alle lyttingsprosesser som jobber med TCP, vil svare direkte på nc TCP-pakker.

Oppsummering

Denne artikkelen viser hvordan nc-verktøyet fungerer som en direkte erstatning for telnet i moderne Linux-systemer for å sjekke porttilkoblinger, og gir brukeren større fleksibilitet for diagnostisering og løsning av nettverksproblemer.

nc-hjelp kan åpnes med kommandoen 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
$

For mer detaljert informasjon om nc-kommandoen, se manualsiden.

$ man nc