протокол и сервер telnet
Модераторы: Olej, bellic, vikos
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Это, пожалуй, старейший протокол удалённого доступа не только в UNIX, но вообще в IT, возникший ещё в этоху связи по сериальным линиям скорости 9600 бит/сек (IBM-360, PDP-11, Элекироника-60 ).
Со временем telnet, как не шифрованный протокол, заменил SSH. Кто-то может удивиться: «Почему telnet?», или даже: «Фу, telnet!».
Но:
- telnet вполне применим и уместен при административных операциях внутри локальной сети;
- telnet замечательный тестер для проверки открытых портов в сети и коннекта к ним (например, все TCP порты WEB-серверов);
- telnet, и это самое главное, предельно прост и проверка активации через суперсервер на нём ничем не замутнена и максимально понятна;
Со временем telnet, как не шифрованный протокол, заменил SSH. Кто-то может удивиться: «Почему telnet?», или даже: «Фу, telnet!».
Но:
- telnet вполне применим и уместен при административных операциях внутри локальной сети;
- telnet замечательный тестер для проверки открытых портов в сети и коннекта к ним (например, все TCP порты WEB-серверов);
- telnet, и это самое главное, предельно прост и проверка активации через суперсервер на нём ничем не замутнена и максимально понятна;
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Установим интересующие нас пакеты, клиент и сервер протокола telnet (хотя клиент, скорее всего, уже установлен в системе совсем для других нужд):
Очень характерно, что в этой инсталляции устанавливаются, по зависимостям, и суперсервер openbsd-inetd и TCP-wraper tcpd (это значит, что в этой системе мы ещё не пользовали сервисов активируемых через суперсервер). Кроме того, автоматически создался пользователь telnetd.
Код: Выделить всё
$ sudo apt install telnet telnetd
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Чтение информации о состоянии… Готово
Будут установлены следующие дополнительные пакеты:
openbsd-inetd tcpd
Следующие НОВЫЕ пакеты будут установлены:
openbsd-inetd tcpd telnet telnetd
Обновлено 0 пакетов, установлено 4 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 177 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 497 kB.
Хотите продолжить? [Д/н] y
Пол:1 http://deb.debian.org/debian bullseye/main amd64 tcpd amd64 7.6.q-31 [23,8 kB]
Пол:2 http://deb.debian.org/debian bullseye/main amd64 openbsd-inetd amd64 0.20160825-5 [36,8 kB]
Пол:3 http://deb.debian.org/debian bullseye/main amd64 telnet amd64 0.17-42 [71,1 kB]
Пол:4 http://deb.debian.org/debian bullseye/main amd64 telnetd amd64 0.17-42 [45,4 kB]
Получено 177 kB за 0с (747 kB/s)
Выбор ранее не выбранного пакета tcpd.
(Чтение базы данных … на данный момент установлено 351726 файлов и каталогов.)
Подготовка к распаковке …/tcpd_7.6.q-31_amd64.deb …
Распаковывается tcpd (7.6.q-31) …
Выбор ранее не выбранного пакета openbsd-inetd.
Подготовка к распаковке …/openbsd-inetd_0.20160825-5_amd64.deb …
Распаковывается openbsd-inetd (0.20160825-5) …
Выбор ранее не выбранного пакета telnet.
Подготовка к распаковке …/telnet_0.17-42_amd64.deb …
Распаковывается telnet (0.17-42) …
Выбор ранее не выбранного пакета telnetd.
Подготовка к распаковке …/telnetd_0.17-42_amd64.deb …
Распаковывается telnetd (0.17-42) …
Настраивается пакет telnet (0.17-42) …
update-alternatives: используется /usr/bin/telnet.netkit для предоставления /usr/bin/telnet (telnet) в автоматическом режиме
Настраивается пакет tcpd (7.6.q-31) …
Настраивается пакет openbsd-inetd (0.20160825-5) …
invoke-rc.d: policy-rc.d denied execution of start.
Created symlink /etc/systemd/system/multi-user.target.wants/inetd.service → /lib/systemd/system/inetd.service.
/usr/sbin/policy-rc.d returned 101, not running 'start inetd.service'
Настраивается пакет telnetd (0.17-42) …
Добавление пользователя telnetd в группу utmp
invoke-rc.d: policy-rc.d denied execution of start.
Обрабатываются триггеры для man-db (2.9.4-2) …
Код: Выделить всё
$ cat /etc/passwd | grep telnet
telnetd:x:120:130::/nonexistent:/usr/sbin/nologin
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Сразу же создадим нужные нам записи в конфигурационный файл суперсервера inetd:
Старт суперсервера:
Код: Выделить всё
$ grep -v ^# /etc/inetd.conf | grep -v ^$
telnet stream tcp4 nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
telnet stream tcp6 nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
Код: Выделить всё
# systemctl start inetd
Код: Выделить всё
# systemctl status inetd
● inetd.service - Internet superserver
Loaded: loaded (/lib/systemd/system/inetd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-04-27 19:40:57 EEST; 5s ago
Docs: man:inetd(8)
Main PID: 6382 (inetd)
Tasks: 1 (limit: 14232)
Memory: 704.0K
CPU: 3ms
CGroup: /system.slice/inetd.service
└─6382 /usr/sbin/inetd
апр 27 19:40:57 esprimop420 systemd[1]: Starting Internet superserver...
апр 27 19:40:57 esprimop420 systemd[1]: Started Internet superserver.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Наш сетевой интерфейс, контролируемый со стороны суперсервера inetd:
Вот взгляд со стороны серверного хоста на прослушиваемые (ожидающие) порты telnet:
Характерно: здесь как IPv4 так и IPv6.
Код: Выделить всё
$ ip a s dev enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 90:1b:0e:2b:fe:3a brd ff:ff:ff:ff:ff:ff
inet 192.168.1.138/24 brd 192.168.1.255 scope global dynamic noprefixroute enp3s0
valid_lft 96177sec preferred_lft 96177sec
inet6 fe80::921b:eff:fe2b:fe3a/64 scope link
valid_lft forever preferred_lft forever
Код: Выделить всё
# netstat -lptu | grep telnet
tcp 0 0 0.0.0.0:telnet 0.0.0.0:* LISTEN 6382/inetd
tcp6 0 0 [::]:telnet [::]:* LISTEN 6382/inetd
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Теперь взглянем на это интерфейс (сканернём открытые порты) со стороны любого другого хоста этой локальной сети:
Или вот так:
Код: Выделить всё
$ nmap 192.168.1.138
Starting Nmap 7.80 ( https://nmap.org ) at 2023-04-27 18:45 EEST
Nmap scan report for 192.168.1.138
Host is up (0.011s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
53/tcp open domain
Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
Код: Выделить всё
$ nmap -6 fe80::921b:eff:fe2b:fe3a%eno1
Starting Nmap 7.80 ( https://nmap.org ) at 2023-04-27 18:49 EEST
Nmap scan report for fe80::921b:eff:fe2b:fe3a
Host is up (0.0064s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
53/tcp open domain
Nmap done: 1 IP address (1 host up) scanned in 1.51 seconds
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
И, наконец, с этого же хоста LAN — удалённая терминальная сессия по telnet, из-за которой мы всё это и городили. И проведём мы её умышленно в протоколе IPv6 (назло недоброжелателям, утверждающим что inetd не работает с протоколами IPv6):
P.S. Я умышленно выполнил на удалённом хосте команду who: здесь 1-я строка — это графическая сессия, окружение рабочего стола Cinnamon с которым загрузился компьютер, следующие 2 строки — это 2 SSH терминальные сессии, в которых я правлю конфиги, запускаю программы и копирую их результаты, а вот 4-я строка — это и есть telnet сессия в протоколе IPv6.
Код: Выделить всё
$ telnet -6 fe80::921b:eff:fe2b:fe3a%eno1
Trying fe80::921b:eff:fe2b:fe3a%eno1...
Connected to fe80::921b:eff:fe2b:fe3a%eno1.
Escape character is '^]'.
Debian GNU/Linux 11
esprimop420 login: olej
Password:
Linux esprimop420 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Apr 27 11:27:20 EEST 2023 from fe80::13f5:9fe2:6393:bf4a%enp3s0 on pts/2
olej@esprimop420:~$ who
olej tty7 2023-04-26 22:25 (:0)
olej pts/0 2023-04-27 08:33 (192.168.1.13)
olej pts/1 2023-04-27 10:31 (192.168.1.13)
olej pts/3 2023-04-27 20:01 (fe80::13f5:9fe2:6393:bf4a%enp3s0)
olej@esprimop420:~$ exit
выход
Connection closed by foreign host.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
В отношении telnet (протокола вообще, а не какой-то конкретно реализации!) вылезла ещё одна особенность при отработке программ эхо-серверов - Python: сетевые приложения:
- при передаче через telnet потоков символов ASCII (английский текст) в режиме построчном (mode line) эти эффекты не наблюдаются, и выявляются только при передаче русского текста UTF-8 ... собственно, любого многобайтного языка UTF-8: китайский, иврит и все...
- отдельные байты многобайтных последовательностей могут интерпретироваться в потоке как командные последовательности:
См. 4.5.3 Удаленный доступ (Telnet)
- при передаче через telnet потоков символов ASCII (английский текст) в режиме построчном (mode line) эти эффекты не наблюдаются, и выявляются только при передаче русского текста UTF-8 ... собственно, любого многобайтного языка UTF-8: китайский, иврит и все...
- отдельные байты многобайтных последовательностей могут интерпретироваться в потоке как командные последовательности:
Код: Выделить всё
olej@R420:~$ telnet
telnet> display
will flush output when sending interrupt characters.
won't send interrupt characters in urgent mode.
won't read the telnetrc files.
won't map carriage return on output.
will recognize certain control characters.
won't turn on socket level debugging.
won't print hexadecimal representation of network traffic.
won't print user readable output for "netdata".
won't show option processing.
won't print hexadecimal representation of terminal traffic.
echo [^E]
escape [^]]
rlogin [off]
tracefile "(standard output)"
flushoutput [^O]
interrupt [^C]
quit [^\]
eof [^D]
erase [^?]
kill [^U]
lnext [^V]
susp [^Z]
reprint [^R]
worderase [^W]
start [^Q]
stop [^S]
forw1 [off]
forw2 [off]
ayt [^T]
telnet> quit
Семенов Ю.А. (ГНЦ ИТЭФ)
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Пока я вижу 3 буквы русского алфавита, которые вызывают искажения:
Код: Выделить всё
olej@R420:~$ nc -l -p 50002 -e '/bin/cat'
...
Код: Выделить всё
olej@R420:~$ telnet 127.0.0.1 50002
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
х
�
у
я
^]
telnet> quit
Connection closed.
olej@R420:~$
olej@R420:~$ echo хуя | hexdump
0000000 85d1 83d1 8fd1 000a
0000007
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
Разборки с TCP-клиентом привели вот к чему:
• Клиент telnet может работать в двух режимах, переключаемых командой mode из его набора команд— построчном (mode line) и посимвольном (mode char). Для наших целей представляет интерес построчный режим, и он устанавливается по умолчанию при старте программы.
• Сам протокол telnet (RFC-854 и целый ряд последующих) использует передачу некоторых последовательностей управляющих символов (в построчном режиме) непосредственно в потоке TCP-соединения.
• Стандарт telnet — это один из самых старых сетевых стандартов, разрабатывался начиная с 1973 года, когда о мультиязычности и UNICODE ещё никто не помышлял, кодирование UTF-8 будет разработано Кеном Томпсоном и Робои Пайком только к 1992 году, а текстовой информацией считалось только то, что укладывалось в кодировку ASCII, а ещё точнее, в её первую половину, то есть в символы латинского алфавита.
• И поэтому может стать большой неожиданностью, что при передаче от telnet символов многобайтных символов UTF-8 любого языка, символы в потоке передачи (именно передачи) будут искажаться.
Так что используя telnet в качестве тестера сетевых обменов, нужно соблюдать определённую осторожность, и всегда иметь всё это в уме. Иначе можно убить очень много своего времени на разгребание непоняток в поведении
• Клиент telnet может работать в двух режимах, переключаемых командой mode из его набора команд— построчном (mode line) и посимвольном (mode char). Для наших целей представляет интерес построчный режим, и он устанавливается по умолчанию при старте программы.
• Сам протокол telnet (RFC-854 и целый ряд последующих) использует передачу некоторых последовательностей управляющих символов (в построчном режиме) непосредственно в потоке TCP-соединения.
• Стандарт telnet — это один из самых старых сетевых стандартов, разрабатывался начиная с 1973 года, когда о мультиязычности и UNICODE ещё никто не помышлял, кодирование UTF-8 будет разработано Кеном Томпсоном и Робои Пайком только к 1992 году, а текстовой информацией считалось только то, что укладывалось в кодировку ASCII, а ещё точнее, в её первую половину, то есть в символы латинского алфавита.
• И поэтому может стать большой неожиданностью, что при передаче от telnet символов многобайтных символов UTF-8 любого языка, символы в потоке передачи (именно передачи) будут искажаться.
Так что используя telnet в качестве тестера сетевых обменов, нужно соблюдать определённую осторожность, и всегда иметь всё это в уме. Иначе можно убить очень много своего времени на разгребание непоняток в поведении
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
протокол и сервер telnet
В принципе, ещё с мно8гих лет назад, со времён написания (где-то в журналы) статей о суперсервере, помнится, что telnetd можно запускать и вручную в отладочном режиме:
Код: Выделить всё
olej@nvidia:~$ man telnetd
NAME
telnetd — DARPA telnet protocol server
...
Telnetd is normally in‐voked by the internet server (see inetd(8)) for requests to connect to the telnet port as indicated by the /etc/services file (see services(5)). The -debug option may be used to start up telnetd manually, instead of through inetd(8). If started up this way, port may be specified to run telnetd on an alternate TCP port number.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя