Szukasz telnetu na RHEL 8? Wypróbuj nc

Telnet to protokół sieciowy używany do zdalnego dostępu do komputera i zapewniający dwukierunkową komunikację tekstową. Potrzebujesz więc serwera telnet i klienta do komunikowania się ze sobą.

Telnet to jedno z popularnych narzędzi Linux/Windows, które od dawna spełnia swoje zadanie.

Głównym problemem związanym z telnetem w nowoczesnych systemach jest to, że nie jest on bezpieczny. Cała komunikacja w telnecie odbywa się w postaci zwykłego tekstu, a cały ruch sieciowy jest nieszyfrowany. Zasadniczo każdy, kto ma odpowiedni dostęp i narzędzia, może podsłuchiwać ruch sieciowy, aby go odczytać. W związku z tym większość nowoczesnych systemów operacyjnych Linux nie jest fabrycznie wyposażona w telnet, a inni odradzają jego używanie.

Wraz z pojawieniem się protokołu SSH lub Secure Shell, który jest czymś więcej niż tylko zaszyfrowanym zamiennikiem telnetu, korzystanie z telnetu zgodnie z jego przeznaczeniem już dawno stało się nieaktualne. Istnieje jednak alternatywne zastosowanie telnetu, z którego nadal korzysta wielu administratorów systemów i entuzjastów technologii, polegające na sprawdzaniu łączności zdalnych portów TCP.

Można po prostu sprawdzić, czy zdalny port TCP nasłuchuje i odpowiada poprawnie za pomocą polecenia telnet. Poniższy fragment pokazuje, jak możemy sprawdzić, czy google.com działa i działa, sprawdzając łączność 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.
$

Port TCP, który nie jest otwarty lub niedostępny, będzie zachowywał się jak poniżej po sprawdzeniu przez telnet:

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

Ułatwia to rozwiązywanie prostych problemów z łącznością sieciową w połączeniu z poleceniami ping, traceroute lub tracepath, netstat itp.

Jeśli używasz RHEL 8 (lub nawet starszych wersji RHEL/CentOS), możesz użyć nc (lub Ncat lub Network Connector), który obsługuje wiele opcji związanych z diagnostyką sieci. Będziemy dyskutować, jak zainstalować i używać tego narzędzia na RHEL8 i podobnych systemach.

Co to jest nc?

nc (lub Ncat) to popularne narzędzie wiersza poleceń ogólnego przeznaczenia do odczytywania, zapisywania, przekierowywania i szyfrowania danych w sieci. Pierwotnie napisany dla projektu nmap, obecnie dostępnych jest wiele implementacji Netcat. Działa zarówno z protokołem TCP, jak i UDP w IPv4 i IPv6 i zapewnia nieograniczone potencjalne przypadki użycia.

Poniżej znajdują się niektóre z głównych cech narzędzia nc:

  • Możliwość łączenia ncats razem
  • Przekierowanie portów TCP, UDP i SCTP do innych witryn
  • Szyfruj komunikację z obsługą SSL
  • Obsługa proxy przez proxy SOCK4/5 lub HTTP (w tym uwierzytelnianie)
  • Obsługuje wiele platform, w tym Windows, Linux i macOS

Instalowanie nc

nc jest dostępny jako część domyślnych repozytoriów w systemach RHEL. Aby zainstalować go w systemie RHEL 7, po prostu wydaj poniższe polecenie na terminalu:

$ sudo yum install -y nc

Dla systemu RHEL 8 możesz użyć dnf jako:

$ sudo dnf install -y nc

Sprawdź łączność TCP

Chociaż nc oferuje wiele funkcji, które obsługują wiele przypadków użycia w różnych aplikacjach, jedną z najczęstszych jest rozwiązywanie problemów z siecią zamiast telnet.

nc może pokazać, czy możesz połączyć się z portem TCP. Oto składnia:

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

Na przykład, jeśli chcę sprawdzić, czy mogę się połączyć z newsblog.pl przez http lub https. Mogę to sprawdzić używając nc jak pokazano poniżej (port 80 jest dla http, a 443 dla 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.
$

Podobnie, nieosiągalny lub zablokowany port wyświetli dane wyjściowe takie jak (wiele adresów jest sprawdzanych, gdy DNS newsblog.pl wskazuje na wiele 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
$

Sprawdź łączność UDP

telnet może sprawdzać tylko komunikację ze zdalnym portem TCP, podczas gdy nc pozwala sprawdzić łączność zarówno TCP, jak i UDP.

nc może po prostu wysyłać pakiety UDP zamiast domyślnych pakietów TCP, używając:

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

Ale UDP jest protokołem bez sesji, w przeciwieństwie do TCP, więc jako taki nie można potwierdzić kompleksowej łączności UDP we wszystkich możliwych scenariuszach, po prostu wysyłając pakiety UDP na jednym końcu, ponieważ proces nasłuchiwania na zdalnym końcu nie wysyła jakaś odpowiedź, nc nie będzie w stanie ocenić, czy wysłany pakiet dotarł do celu, czy nie. Ale nc oferuje alternatywę określenia połączenia UDP typu end-to-end przez uruchomienie nasłuchiwania UDP, zakładając, że masz właściwy dostęp do CLI na zdalnym serwerze.

Zakładając więc, że musisz sprawdzić łączność UDP między dwoma hostami Linuksa pod kątem DNS za pomocą nc, prostym sposobem na to byłoby uruchomienie serwera nc nasłuchującego na wymaganym porcie:

$ sudo nc -ul <Port>

W przypadku DNS musimy sprawdzić port 53, co spowoduje wykonanie powyższego polecenia jako:

$ nc -ul 53

Po stronie klienta musiałbyś uruchomić inny proces nc, który wysyła pakiety UDP do serwera:

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

Co sprawiłoby, że nasze polecenie:

$ nc -u <IP/DNS> 53

Biorąc pod uwagę, że nic nie blokuje ruchu UDP dla portu 53 między tymi dwoma komputerami, cokolwiek wpiszesz i wprowadzisz na jednym komputerze, powinno być widoczne na innych hostach, jak czat dwukierunkowy. Jeśli nie, niektóre zapory blokują łączność między tymi dwoma systemami.

Model serwera i klienta wykorzystujący nc działa bezbłędnie przy tego rodzaju prostych kontrolach łączności między hostami. Podobnie jak powyższa kontrola UDP, nc może również nasłuchiwać pakietów TCP na danym porcie:

$ sudo nc -l <Port>

Po stronie klienta można normalnie wysyłać pakiety TCP w celu sprawdzenia łączności:

$ nc <IP/DNS> <Port>

Powyższa metoda serwer/klient nc nie jest wymagana w przypadku połączeń TCP (w przeciwieństwie do UDP), ponieważ jest to protokół zorientowany na połączenie i działa z potwierdzeniami. Każdy proces nasłuchiwania działający na TCP będzie bezpośrednio odpowiadał na nc pakiety TCP.

Streszczenie

Ten artykuł podsumowuje, w jaki sposób narzędzie nc jest bezpośrednim zamiennikiem telnetu w nowoczesnych systemach Linux, jeśli chodzi o sprawdzanie łączności portów i zapewnia znacznie więcej możliwości użytkownikowi końcowemu w diagnozowaniu i rozwiązywaniu problemów z siecią.

Dostęp do pomocy nc można uzyskać za pomocą polecenia 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 szczegółowych informacji na temat polecenia nc można znaleźć na jego stronie podręcznika.

$ man nc