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 решают ту же задачу.
Связанные термины
- SSH — шифрованная замена, стандарт для удалённого доступа
- Сетевые порты — то, что чаще всего проверяют телнетом
- TCP и UDP — Telnet открывает обычное TCP-соединение
- Сетевая диагностика — где ему нашлось место
- Межсетевые экраны / WAF — причина таймаута вместо отказа
- CLI — интерфейс, к которому Telnet давал доступ
Готовы запустить GPU-задачу?
Запустить GPU-сервер