Networking

Telnet

Старый протокол удалённого доступа к консоли по порту 23 без шифрования, вытесненный SSH, но живой как инструмент диагностики портов.

Что такое Telnet

Telnet — протокол удалённого доступа к командной строке устройства, появившийся в 1969 году. Клиент подключается по TCP на порт 23, вводит логин и пароль, получает консоль. Одноимённая утилита telnet — клиент этого протокола.

Проблема ровно одна, но фатальная: Telnet не шифрует ничего. Логин, пароль и весь сеанс идут открытым текстом. Любой узел на пути — коммутатор, роутер провайдера, машина злоумышленника в той же сети — читает их простым tcpdump. Поэтому для удалённого управления Telnet мёртв, и его заменил SSH.

Telnet SSH
Порт 23 22
Шифрование нет да
Аутентификация пароль открытым текстом пароль или ключ
Проверка подлинности сервера нет по отпечатку ключа
Передача файлов нет SFTP, scp
Где применять диагностика портов всё остальное

Правило простое: если в 2020-х вы видите на сервере открытый порт 23 — это находка для аудита, а не конфигурация.

Зачем он всё ещё нужен

Telnet выжил не как способ управления, а как отладочный инструмент: он открывает голое TCP-соединение и показывает, что отвечает сервер. Этого хватает для двух задач.

Проверка, что порт доступен — быстрее любого сканера, когда надо ответить на вопрос «а фильтр точно открыт?»:

$ telnet example.com 443
Trying 93.184.216.34...
Connected to example.com.        ← порт открыт
Escape character is '^]'.

$ telnet example.com 8080
Trying 93.184.216.34...
telnet: Unable to connect to remote host: Connection refused

Читать ответ надо аккуратно: Connected — порт слушается; Connection refused — до хоста добрались, но там никто не слушает; долгое молчание с последующим Connection timed out — пакет режет файрвол. Это принципиально разные диагнозы.

Ручной разговор по текстовому протоколу. SMTP, HTTP, Redis — все текстовые, и с ними можно поговорить руками:

$ telnet example.com 80
Connected to example.com.
GET / HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Content-Type: text/html

После запроса нужна пустая строка — иначе сервер продолжит ждать заголовков. Выход из сессии — Ctrl+], затем quit.

Чем пользоваться вместо

Для проверки портов есть инструменты лучше: они не требуют интерактива и годятся для скриптов.

$ nc -zv example.com 443            # то же самое, но без сессии
Connection to example.com 443 port [tcp/https] succeeded!

$ nc -zv example.com 20-25          # диапазон портов сразу

# без telnet и nc вообще — встроенными средствами bash
$ timeout 2 bash -c "</dev/tcp/example.com/443" && echo открыт || echo закрыт

# для TLS-портов telnet бесполезен, нужен openssl
$ openssl s_client -connect example.com:443 -servername example.com

Последний пункт важен: на 443 порту telnet покажет только факт соединения — рукопожатие TLS он провести не умеет, и дальше вы увидите бинарный мусор. Для отладки HTTPS берите openssl s_client или curl -v.

Где Telnet встречается сегодня

Сетевое оборудование, промышленные контроллеры, ИБП и старые устройства до сих пор умеют только Telnet — просто потому, что прошивке пятнадцать лет и обновлять её некому. Если отказаться нельзя: держите Telnet исключительно в сети управления, отделённой VLAN, и никогда в интернете; ходите через VPN или jump-хост; проверьте, нет ли в прошивке SSH — часто он есть, просто выключен по умолчанию.

В минимальных образах Docker утилиты telnet обычно нет, и ставить её ради диагностики не нужно: nc или конструкция с /dev/tcp решают ту же задачу.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер