Содержание статьи
- Gopher
- HTTPS
- Telnet и rlogin
- TFTP
- Заключение
Даже сетевые протоколы иногда умирают. Если заглянуть в список номеров протоколов IP на сайте IANA, там можно увидеть как исторически важные, но давно не используемые протоколы вроде CHAOS, так и настолько прочно забытые, что для них не указана даже расшифровка аббревиатуры. Что такое 49/BNA, например? Никто не вспомнит.
Тем не менее многие исторические протоколы продолжают жить в программном обеспечении еще долго после своего пика популярности и остаются доступными, если вдруг нужны, а иногда и переживают неожиданный ренессанс. В то же время активно развивающиеся протоколы могут утрачивать совместимость и создавать больше неудобств старым клиентам, чем старые протоколы — новым. В этой статье мы рассмотрим несколько примеров того, как связать старые системы с новыми сетями.
GOPHER
Gopher — прямой предшественник HTTP и World Wide Web. Его взлет и падение пришлись на конец 1980-х годов. Как ни странно, ни протокол Gopher, ни его эталонная реализация не были открытыми стандартами и свободным ПО. Именно это его и сгубило: с ростом популярности протокола его разработчик — университет Миннесоты — решил требовать с операторов серверов лицензионные отчисления. Очевидно, отчисления никто платить не стал, вместо этого все перешли в зарождающийся World Wide Web, поскольку HTTP был открытым стандартом. Университет Миннесоты одумался и поменял лицензию на свободную, но было уже поздно.
Казалось бы, о Gopher после этого спокойно можно было забыть, но забыли не все. Как ни парадоксально, в конце 2010-х число серверов Gopher снова начало расти. Окончательная победа Web и постоянный рост сложности браузеров привели к тому, что создать новый браузер с нуля почти невозможно, а сервисы интернета все больше оказываются в руках крупных компаний‑монополистов. Кто‑то считает, что спасение кроется либо в разработке новых намеренно легковесных протоколов вроде Gemini, либо в возврате к Gopher.
В отличие от новых альтернативных протоколов, Gopher может похвастаться какой‑никакой экосистемой. Энтузиасты поддерживают поисковые системы, реализации серверов и даже бесплатный хостинг.
Ирония в том, что смотреть современные сайты Gopher со старых систем — проще простого, достаточно открыть ссылку в любом браузере.
Обратное неверно: все ныне живые браузеры давно удалили встроенную поддержку (как сейчас удаляют поддержку FTP), а потом и все API для расширений, которые позволяли эту поддержку реализовать. Поддержка осталась в lynx и w3m. Firefox позволяет расширениям работать с сетью и добавлять новые протоколы только посредством внешних хелперов, Google Chrome не предоставляет такой возможности вовсе. Заставляет задуматься: может, в словах нынешних любителей Gopher о монополии браузеров и есть рациональное зерно...
HTTPS
Ситуация с World Wide Web ровно обратная. Сайты на серверах даже с самым устаревшим ПО все так же доступны с помощью любого современного браузера, а вот старые браузеры часто оказываются неспособны выполнять запросы к современным серверам.
Ни Gopher, ни обычный HTTP не поддерживали шифрование, поскольку разрабатывались во времена, когда защищать было особо нечего, а распространение ПО для шифрования нередко регулировалось теми же правилами, что и экспорт вооружений. Сейчас ситуация совершенно иная, поэтому обязательное перенаправление с HTTP на HTTPS давно стало стандартом, а из новых версий браузеров регулярно удаляют поддержку устаревших алгоритмов шифрования и цифровой подписи во избежание downgrade attacks и угроз долговременной криптостойкости. Для безопасности это большое преимущество, но для любителей ретрокомпьютинга или вынужденных пользователей систем, на которых уже нельзя просто обновить браузер, наоборот, большая проблема.
К счастью, для таких случаев наш соотечественник Александр Тауенис создал проект под названием WebOne. Это специализированный прокси, который в простейшем случае принимает от клиента запрос к http://example.com, выполняет запрос к https://example.com и возвращает ответ, как будто никакого HTPS там и не было. Поскольку взаимодействие между клиентом и прокси идет по обычному HTTP, поддержка актуальных версий TLS на стороне клиента перестает быть проблемой — можно использовать хоть Netscape, хоть Mosaic.
Но этим его возможности не ограничиваются. Он также поддерживает трансляцию URL, замену регулярных выражений в тексте страницы и даже транскодирование изображений и видео с помощью внешних скриптов.
Для примера можно рассмотреть настройку подмены адреса библиотеки jQuery из стандартного конфига.
[Edit:jquery.min.js]
; Redirect all requests to jQuery of versions other than 1.9.1 to Google's CDN with
; the last version supported by Firefox 3.6. This will not touch WebDAV traffic.
; Title: RegExp mask of URLs that should be touched by this Set of edits.
; IgnoreUrl: RegExp mask(s) of URLs which should NOT be touched by this Set of edits.
; OnUrl: additional URL RegExp masks not listed in section's title.
; AddRedirect: the destination URL of this redirection rule
IgnoreUrl=1.9.1
IgnoreUrl=webdav
OnUrl=jquery2.js
OnUrl=jquery-[0-9]*\.[0-9]*\.[0-9]*\.min\.js
IgnoreUrl=webdav
AddRedirect=http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
Проект написан на C#, но вполне нормально работает и на Linux через .NET core. По умолчанию после запуска исполняемого файла WebOne он будет слушать на адресе 0.0.0.0:8080. Для своих виртуалок в VirtualBox я прописываю в конфиге /etc/WebOne/webone.conf опцию DefaultHostName=192.168.56.1, чтобы он слушал только на внутреннем интерфейсе (host-only adapter).
TELNET И RLOGIN
Знакомый всем протокол SSH появился в 1995 году и быстро вытеснил всех предшественников, уже просто потому, что в отличие от них был безопасным. Если быть точным, вытеснил из практического использования — реализации этих протоколов все еще поддерживают в рабочем состоянии и даже включают в репозитории пакетов.
В пакете inetutils рядом с вполне актуальными ping и whois присутствуют также telnetd и rlogind/rshd. Разумеется, пользоваться ими на практике даже в локальной сети — отвратительная идея, а выставить их в публичную сеть совершенно немыслимо.
Однако, если ты хочешь залогиниться на современную систему или скопировать с нее файлы на какую‑то древнюю юникс‑подобную ОС, они вполне могут пригодиться. Поскольку rlogin/RSH/RCP появились аж в 1981 году, а Telnet и того раньше, этот способ может сработать даже с самыми старыми системами, если их удалось подключить к современной сети.
В Fedora компоненты inetutils находятся в отдельных пакетах. Нужно заметить, что, как многие другие древние демоны, это программы — не «нормальные» демоны, а сервисы inetd. К счастью, разработчики пакетов сделали к ним файлы сервисов systemd, так что их запуск не представляет никаких сложностей — возиться с xinetd вручную не нужно.
Посмотрим на моей Fedora 33. Начнем с Telnet.
[dmbaturin@careless ~]$ sudo dnf install telnet-server telnet
[dmbaturin@careless ~]$ sudo systemctl start telnet.socket
[dmbaturin@careless ~]$ telnet localhost
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Kernel 5.11.14-200.fc33.x86_64 on an x86_64 (9)
careless login:
Запустить rlogind ничуть не сложнее.
[dmbaturin@careless ~]$ sudo dnf install rsh-server rsh
[dmbaturin@careless ~]$ sudo systemctl start rlogin.socket
[dmbaturin@careless ~]$ rlogin localhost
Password:
В отличие от реализаций SSH, telnetd и rlogind поддерживают только интерактивные сессии. Утилиты RSH и RCP взаимодействуют не с rlogind, а с родственным демоном — rshd. Причем если rlogin хотя бы умеет спрашивать пароль (пусть и передает его открытым текстом), то rshd поддерживает только совсем уж абсурдный по нынешним временам способ «аутентификации» — файл ~/.rhosts.
$ echo "localhost dmbaturin" > ~/.rhosts
Да, чтобы успешно использовать rcp или rsh, достаточно знать имя пользователя и указать верное имя хоста, ничего другого знать не надо.
$ rsh localhost uname
Linux
$ rcp localhost:/tmp/test .
INFO
Погружаться в историю и экспериментировать с RSH/RCP лучше всего на машине с отключенным SELinux. Можно, конечно, выставить контекст файлу командой restorecon -R ~/.rhosts и дать rshd разрешение на sys_resource, но проще временно прописать selinux=0 в опции загрузки ядра.
TFTP
TFTP (Trivial File Transfer Protocol) — протокол‑долгожитель, который впервые появился в 1981 году (RFC 783) и до сих пор актуален. Стандартным способом загрузки по сети остается PXE, который использует именно этот протокол для передачи образа ОС. Технически современные системы с UEFI вполне могли бы себе позволить встроенный клиент HTTPS, но PXE также требует соответствующей опции DHCP для передачи адреса и пути к файлу, так что поменять этот стандарт не так просто. К тому же все и так неплохо работает.
Ну, обычно неплохо работает. К сожалению, некоторые прошивки материнских плат и встраиваемых устройств реализуют TFTP некорректным или просто странным образом и отправляют кривые пути к файлам, которые сервер не понимает. Чаще всего оказывается, что обновлений этой прошивки нет и не планировалось.
В таких случаях полезно помнить, что некоторые реализации сервера TFTP умеют транслировать запросы. В частности, tftpd-hpa за авторством известного разработчика ядра Linux Ганса Петера Анвина поддерживает опцию --mapfile <file>.
Синтаксис замен напоминает синтаксис sed. Например, можно заменить (r) все (g) обратные слеши прямыми.
rg \\ /
ЗАКЛЮЧЕНИЕ
Протоколы меняются, теряют совместимость и уходят в прошлое, но если задаться целью, то взаимодействовать с новыми серверами со старых железок или софта в виртуалках вполне возможно. Надеюсь, все эти инструменты помогут тебе в развлечениях с ретрокомпьютингом или в миграции со старых систем.