Шукаєте telnet на RHEL 8? Спробуйте nc

Telnet – це протокол мережі, призначений для віддаленого доступу до комп’ютерів, що дозволяє здійснювати двосторонній текстовий обмін даними. Для його функціонування необхідні сервер та клієнт Telnet.

Telnet є одним з популярних інструментів в системах Linux та Windows, який вже тривалий час виконує свою роль.

Головною проблемою Telnet в сучасних системах є його низький рівень безпеки. Всі дані, що передаються через Telnet, є нешифрованими, тобто передаються у вигляді відкритого тексту. Це означає, що будь-хто з відповідними інструментами може перехопити та прочитати ці дані. Через це багато сучасних операційних систем Linux не мають Telnet встановленим за замовчуванням, а інші рекомендують його не використовувати.

З появою SSH (Secure Shell) – зашифрованої альтернативи Telnet, останній втратив свою основну функцію. Проте, Telnet досі використовується багатьма системними адміністраторами та технічними спеціалістами для перевірки доступності віддалених TCP-портів.

За допомогою команди Telnet можна легко визначити, чи віддалений TCP-порт прослуховує та відповідає належним чином. Нижче наведено приклад перевірки працездатності google.com через з’єднання 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.
$

TCP-порт, який не відкритий або недоступний, при перевірці через Telnet буде відображати наступне:

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

Ця можливість спрощує діагностику проблем мережевого підключення в поєднанні з командами ping, traceroute, tracepath, netstat тощо.

У системах RHEL 8 (та навіть у попередніх версіях RHEL/CentOS) є можливість використовувати nc (або Ncat, Network Connector), який надає широкий спектр можливостей для діагностики мережі. Далі розглянемо процес встановлення та використання цього інструменту на RHEL8 та подібних системах.

Що таке nc?

nc (або Ncat) – це універсальний інструмент командного рядка, який використовується для читання, запису, перенаправлення та шифрування даних в мережі. Спочатку розроблений для проекту nmap, на сьогодні існує кілька реалізацій Netcat. Він підтримує роботу з протоколами TCP та UDP через IPv4 і IPv6, пропонуючи широкий спектр можливостей використання.

Основні можливості утиліти nc включають:

  • Об’єднання каналів зв’язку
  • Перенаправлення портів TCP, UDP та SCTP на інші адреси
  • Шифрування з’єднань за допомогою SSL
  • Підтримка проксі-серверів через SOCKS4/5 або HTTP (включаючи аутентифікацію)
  • Сумісність з різними платформами, такими як Windows, Linux та macOS

Встановлення nc

nc є доступним у стандартних репозиторіях систем RHEL. Для встановлення в системах RHEL 7, достатньо виконати наступну команду в терміналі:

$ sudo yum install -y nc

Для систем RHEL 8 використовуйте dnf:

$ sudo dnf install -y nc

Перевірка з’єднання TCP

Хоча nc пропонує багато різноманітних функцій для різних сценаріїв використання, однією з найбільш поширених є застосування під час діагностики мережевих проблем, як альтернатива telnet.

nc дозволяє визначити, чи доступний TCP-порт. Синтаксис команди:

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

Наприклад, для перевірки доступності techukraine.net.com через http або https, можна використати наступні команди (порт 80 для http, 443 – для https):

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

Недоступний або заблокований порт покаже наступні результати (перевірено декілька IP-адрес, оскільки DNS techukraine.net.com вказує на декілька IP):

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

Перевірка з’єднання UDP

Telnet дозволяє перевіряти лише TCP-з’єднання, в той час як nc може перевіряти як TCP, так і UDP.

nc може відправляти UDP-пакети замість TCP, використовуючи:

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

Проте, UDP є протоколом без встановлення сесії, на відміну від TCP. Тому неможливо гарантувати успішне UDP-з’єднання лише відправляючи пакети, якщо приймаюча сторона не відправляє відповідь. nc не зможе визначити, чи дійшов пакет до адресата. Альтернативою для перевірки UDP є запуск прослуховувача UDP, за умови доступу до CLI на віддаленому сервері.

Для перевірки UDP-з’єднання між двома хостами Linux для DNS за допомогою nc, можна запустити сервер nc, який прослуховує необхідний порт:

$ sudo nc -ul <Port>

Для DNS потрібен порт 53, отже, команда буде виглядати так:

$ nc -ul 53

На стороні клієнта потрібно запустити інший процес nc, що відправляє UDP-пакети на сервер:

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

В нашому випадку:

$ nc -u <IP/DNS> 53

Якщо трафік UDP для порта 53 не блокується між машинами, то все, що вводиться на одній машині, буде видно на іншій, створюючи двосторонній чат. Якщо це не так, то брандмауер блокує з’єднання між системами.

Модель клієнт-сервер з використанням nc чудово підходить для простих перевірок підключення. Так само, як і з UDP, nc може прослуховувати TCP пакети на вказаному порту:

$ sudo nc -l <Port>

На стороні клієнта можна відправляти TCP пакети для перевірки підключення:

$ nc <IP/DNS> <Port>

Метод nc сервер/клієнт для TCP-з’єднання (на відміну від UDP) є необов’язковим, оскільки це протокол, орієнтований на з’єднання і працює з підтвердженнями. Будь-який процес, що прослуховує TCP, буде безпосередньо відповідати на TCP-пакети nc.

Підсумок

У статті описано, як утиліта nc є прямою заміною telnet у сучасних Linux системах для перевірки з’єднання з портами, надаючи користувачеві більше можливостей для діагностики та вирішення проблем з мережею.

Для отримання довідки nc використовуйте команду 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
$

Для детальної інформації про nc зверніться до його довідкової сторінки.

$ man nc