протокол и сервер telnet

Настройка, программирование, распределённые вычисления

Модераторы: Olej, bellic, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 28 апр 2023, 23:14

Это, пожалуй, старейший протокол удалённого доступа не только в UNIX, но вообще в IT, возникший ещё в этоху связи по сериальным линиям скорости 9600 бит/сек (IBM-360, PDP-11, Элекироника-60 :?: ).
Со временем telnet, как не шифрованный протокол, заменил SSH. Кто-то может удивиться: «Почему telnet?», или даже: «Фу, telnet!».

Но:
- telnet вполне применим и уместен при административных операциях внутри локальной сети;
- telnet замечательный тестер для проверки открытых портов в сети и коннекта к ним (например, все TCP порты WEB-серверов);
- telnet, и это самое главное, предельно прост и проверка активации через суперсервер на нём ничем не замутнена и максимально понятна;

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 28 апр 2023, 23:21

Установим интересующие нас пакеты, клиент и сервер протокола telnet (хотя клиент, скорее всего, уже установлен в системе совсем для других нужд):

Код: Выделить всё

$ 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) …
Очень характерно, что в этой инсталляции устанавливаются, по зависимостям, и суперсервер openbsd-inetd и TCP-wraper tcpd (это значит, что в этой системе мы ещё не пользовали сервисов активируемых через суперсервер). Кроме того, автоматически создался пользователь telnetd.

Код: Выделить всё

$ cat /etc/passwd | grep telnet
telnetd:x:120:130::/nonexistent:/usr/sbin/nologin

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 28 апр 2023, 23:26

Сразу же создадим нужные нам записи в конфигурационный файл суперсервера 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

Непрочитанное сообщение Olej » 28 апр 2023, 23:28

Наш сетевой интерфейс, контролируемый со стороны суперсервера inetd:

Код: Выделить всё

$ 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
Вот взгляд со стороны серверного хоста на прослушиваемые (ожидающие) порты telnet:

Код: Выделить всё

# 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          
Характерно: здесь как IPv4 так и IPv6.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 28 апр 2023, 23:43

Теперь взглянем на это интерфейс (сканернём открытые порты) со стороны любого другого хоста этой локальной сети:

Код: Выделить всё

$ 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

Непрочитанное сообщение Olej » 28 апр 2023, 23:44

И, наконец, с этого же хоста LAN — удалённая терминальная сессия по telnet, из-за которой мы всё это и городили. И проведём мы её умышленно в протоколе IPv6 (назло недоброжелателям, утверждающим что inetd не работает с протоколами 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.
P.S. Я умышленно выполнил на удалённом хосте команду who: здесь 1-я строка — это графическая сессия, окружение рабочего стола Cinnamon с которым загрузился компьютер, следующие 2 строки — это 2 SSH терминальные сессии, в которых я правлю конфиги, запускаю программы и копирую их результаты, а вот 4-я строка — это и есть telnet сессия в протоколе IPv6.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 19 дек 2023, 12:49

В отношении telnet (протокола вообще, а не какой-то конкретно реализации!) вылезла ещё одна особенность при отработке программ эхо-серверов - Python: сетевые приложения:
- при передаче через 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
См. 4.5.3 Удаленный доступ (Telnet)
Семенов Ю.А. (ГНЦ ИТЭФ)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 19 дек 2023, 12:58

Olej писал(а):
19 дек 2023, 12:49
отдельные байты многобайтных последовательностей могут интерпретироваться в потоке как командные последовательности:
Пока я вижу 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

Непрочитанное сообщение Olej » 21 дек 2023, 12:58

Разборки с TCP-клиентом привели вот к чему:
• Клиент telnet может работать в двух режимах, переключаемых командой mode из его набора команд— построчном (mode line) и посимвольном (mode char). Для наших целей представляет интерес построчный режим, и он устанавливается по умолчанию при старте программы.
• Сам протокол telnet (RFC-854 и целый ряд последующих) использует передачу некоторых последовательностей управляющих символов (в построчном режиме) непосредственно в потоке TCP-соединения.
• Стандарт telnet — это один из самых старых сетевых стандартов, разрабатывался начиная с 1973 года, когда о мультиязычности и UNICODE ещё никто не помышлял, кодирование UTF-8 будет разработано Кеном Томпсоном и Робои Пайком только к 1992 году, а текстовой информацией считалось только то, что укладывалось в кодировку ASCII, а ещё точнее, в её первую половину, то есть в символы латинского алфавита.
• И поэтому может стать большой неожиданностью, что при передаче от telnet символов многобайтных символов UTF-8 любого языка, символы в потоке передачи (именно передачи) будут искажаться.

Так что используя telnet в качестве тестера сетевых обменов, нужно соблюдать определённую осторожность, и всегда иметь всё это в уме. Иначе можно убить очень много своего времени на разгребание непоняток в поведении :!: :cry:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

протокол и сервер telnet

Непрочитанное сообщение Olej » 01 янв 2024, 17:38

Olej писал(а):
28 апр 2023, 23:21
в этой инсталляции устанавливаются, по зависимостям, и суперсервер openbsd-inetd и TCP-wraper tcpd (это значит, что в этой системе мы ещё не пользовали сервисов активируемых через суперсервер)
В принципе, ещё с мно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.
При обязательном указании порта, который он будет прослушиать :!:

Ответить

Вернуться в «Сети»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей