Szukasz telnetu na RHEL 8? Wypróbuj nc

Telnet to protokół sieciowy, który umożliwia zdalny dostęp do komputera i realizację dwukierunkowej komunikacji tekstowej. Do jego działania niezbędne są dwa elementy: serwer telnet, który udostępnia usługę, oraz klient telnet, który łączy się z serwerem.

Telnet to popularne narzędzie spotykane w systemach Linux i Windows, które przez długi czas spełniało swoją rolę w dziedzinie zdalnej administracji.

Współcześnie główną wadą telnetu jest brak bezpieczeństwa. Komunikacja w ramach telnetu odbywa się w otwartym tekście, bez żadnego szyfrowania. To oznacza, że każdy, kto ma odpowiednie narzędzia i dostęp do sieci, może przechwycić i odczytać przesyłane dane. Z tego powodu wiele współczesnych dystrybucji Linuksa nie instaluje domyślnie telnetu, a jego użycie jest powszechnie odradzane.

Wraz z pojawieniem się protokołu SSH, czyli Secure Shell, który oferuje szyfrowane połączenie i szereg dodatkowych funkcji, telnet w swojej pierwotnej roli stał się przestarzały. Niemniej jednak telnet nadal znajduje zastosowanie w alternatywnym scenariuszu – sprawdzaniu dostępności zdalnych portów TCP, co jest wykorzystywane przez administratorów systemów i entuzjastów technologii.

Za pomocą polecenia telnet można łatwo zweryfikować, czy dany zdalny port TCP nasłuchuje i poprawnie odpowiada na próby połączenia. Poniższy przykład pokazuje, jak przy użyciu telnetu można sprawdzić dostępność usług HTTP/HTTPS na stronie google.com:

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

Port TCP, który jest niedostępny lub zamknięty, zachowa się w następujący sposób podczas testu za pomocą telnetu:

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

W połączeniu z innymi narzędziami diagnostycznymi, takimi jak ping, traceroute, tracepath czy netstat, telnet ułatwia rozwiązywanie prostych problemów z łącznością sieciową.

W systemach RHEL 8 (i starszych wersjach RHEL/CentOS) dostępny jest program nc (znany również jako Ncat lub Network Connector), który oferuje szerokie możliwości diagnostyki sieci. W dalszej części artykułu omówimy instalację i wykorzystanie tego narzędzia w systemach RHEL8 i pokrewnych.

Czym jest nc?

nc (lub Ncat) to uniwersalne narzędzie wiersza poleceń, które służy do odczytywania, zapisywania, przekierowywania i szyfrowania danych w sieci. Zostało pierwotnie stworzone jako część projektu nmap, a obecnie dostępnych jest wiele implementacji Netcat. Program obsługuje protokoły TCP i UDP w IPv4 oraz IPv6, oferując bardzo szeroki zakres zastosowań.

Do najważniejszych cech narzędzia nc należą:

  • Możliwość łączenia instancji nc ze sobą
  • Przekierowywanie portów TCP, UDP i SCTP do innych lokalizacji
  • Szyfrowanie komunikacji za pomocą SSL
  • Obsługa proxy poprzez protokoły SOCK4/5 lub HTTP (wraz z uwierzytelnianiem)
  • Dostępność na wielu platformach, w tym Windows, Linux i macOS

Instalacja nc

nc jest standardowo dostępny w repozytoriach systemów RHEL. Aby zainstalować go w systemie RHEL 7, wystarczy w terminalu wydać następujące polecenie:

$ sudo yum install -y nc

W przypadku systemu RHEL 8 można skorzystać z menedżera dnf w następujący sposób:

$ sudo dnf install -y nc

Weryfikacja łączności TCP

Mimo że nc oferuje wiele funkcji, które znajdują zastosowanie w różnych scenariuszach, jedną z najczęstszych jego ról jest zastępowanie telnetu w diagnostyce sieci.

nc potrafi sprawdzić, czy możliwe jest nawiązanie połączenia z danym portem TCP. Składnia polecenia jest następująca:

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

Na przykład, aby zweryfikować dostępność usług http i https na stronie newsblog.pl, można użyć nc w następujący sposób (port 80 to http, a 443 to https):

$ nc -vz newsblog.pl.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 newsblog.pl.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.
$

W przypadku niedostępnego lub zablokowanego portu, wynik będzie podobny do poniższego (wiele adresów jest sprawdzanych, ponieważ domena newsblog.pl może wskazywać na kilka adresów IP):

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

Weryfikacja łączności UDP

telnet umożliwia jedynie sprawdzanie komunikacji ze zdalnymi portami TCP, podczas gdy nc daje możliwość weryfikacji połączeń zarówno TCP, jak i UDP.

Aby wysłać pakiety UDP zamiast domyślnych pakietów TCP, należy użyć polecenia:

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

Ze względu na to, że UDP jest protokołem bezsesyjnym, w przeciwieństwie do TCP, nie można w prosty sposób potwierdzić kompletnej łączności UDP poprzez wysłanie pakietów UDP na jednym końcu. Odbiornik UDP na zdalnym hoście nie wysyła odpowiedzi, dlatego nc nie może określić, czy pakiet dotarł do celu. nc oferuje jednak alternatywę – weryfikację połączenia UDP typu end-to-end poprzez uruchomienie nasłuchiwania UDP, przy założeniu, że mamy dostęp do wiersza poleceń na zdalnym serwerze.

Aby na przykład sprawdzić łączność UDP między dwoma hostami Linux w kontekście DNS, można uruchomić serwer nc nasłuchujący na danym porcie w następujący sposób:

$ sudo nc -ul <Port>

W przypadku DNS, który używa portu 53, polecenie będzie wyglądało tak:

$ nc -ul 53

Na kliencie natomiast należy uruchomić drugi proces nc, który będzie wysyłał pakiety UDP do serwera:

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

Zatem nasze polecenie będzie wyglądać następująco:

$ nc -u <IP/DNS> 53

Jeśli nic nie blokuje ruchu UDP na porcie 53 pomiędzy tymi dwoma komputerami, wszystko, co wpiszemy na jednym komputerze, powinno pojawić się na drugim, tworząc dwukierunkowy czat. Brak takiej komunikacji oznacza, że zapora sieciowa blokuje połączenie między systemami.

Model serwer-klient wykorzystujący nc sprawdza się w prostych testach łączności między hostami. Analogicznie do testu UDP, nc potrafi również nasłuchiwać pakietów TCP na danym porcie:

$ sudo nc -l <Port>

Na kliencie można wysyłać pakiety TCP, aby zweryfikować połączenie:

$ nc <IP/DNS> <Port>

Opisana metoda serwer/klient w przypadku TCP nie jest wymagana (w przeciwieństwie do UDP), ponieważ TCP jest protokołem zorientowanym na połączenie i działa z potwierdzeniami. Każdy proces nasłuchujący na porcie TCP będzie bezpośrednio odpowiadał na pakiety TCP wysłane przez nc.

Podsumowanie

Ten artykuł przedstawia nc jako bezpośredniego zamiennika telnetu w nowoczesnych systemach Linux, jeśli chodzi o weryfikację dostępności portów. nc oferuje znacznie większe możliwości diagnostyczne w zakresie rozwiązywania problemów z siecią.

Aby uzyskać dostęp do pomocy programu nc, należy wydać polecenie 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
$

Więcej informacji na temat polecenia nc można znaleźć na jego stronie podręcznika:

$ man nc