Протокол NNTP
O В этой главе:
O Краткая история возникновения NNTP
O Организация конференций
O Синхронизация сообщений
O Чтение сообщений
O Указатель на текущее сообщение и его перемещение
O Создание новых сообщений
O Обязательные и необязательные поля заголовка
Другим видом сетевого общения (помимо почты) являются «ньюсы» - конференции, предназначенные для открытой переписки и свободного обмена информацией. В отличие от электронной почты, каждое сообщение доставляется группе лиц, хотя может адресоваться и какому-то одному конкретному человеку.
Врезка «информация»
USENET: /yoos'net/ or /yooz'net/ [from `Users' Network'] n. A distributed {bboard} (bulletin board) system supported mainly by UNIX machines. Originally implemented in 1979-1980 by Steve Bellovin, Jim Ellis, Tom Truscott, and Steve Daniel at Duke University, it has swiftly grown to become international in scope and is now probably the largest decentralized information utility in existence. As of early 1993, it hosts well over 1200 {newsgroup}s and an average of 40 megabytes (the equivalent of several thousand paper pages) of new technical articles, news, discussion, chatter, and {flamage} every day.
USENET [от ‘User’ Network’], сущ. Распределенная система ‘электронных досок объявлений’ (смотри bboard), поддерживая в основном машинами под управлением UNIX. Первые шаги в этом направлении были сделаны в 1979 - 80 годах Стивом Белловин, Джимом Эллисом, Томом Траскоттом и Стривом Даниэлем в Университете Дьюка, но вскоре система выросла до невероятных размеров и стала международной. Возможно на сегодняшний день (1993 год) это самая большая децентрализованная информационная система во всем мире, поддерживающая около 1200 телеконференций (смотри newsgroup), и ежедневный трафик USENET [новые статьи по технике, дискуссии, новости, болтовня и ругань (смотри flamage)] в среднем составляет около 40 мегабайт, что в напечатанном виде составит ~20 000 страниц.
(Выдержка из «Словаря Жаргона» Эрика Раймонда)
Теоретически конференцию можно организовать и на базе POP3 и SMTP протоколов, но при этом возникнет множество технических проблем, решение которых разумнее возложить на отдельный протокол.
Врезка «информация» *
Любопытно, но длительное время адрес был предназначен для рассылки сообщений всем абонентам этой почтовой системы. Дырка впервые была использована «доброжелателями» в Новогоднюю Ночь, поздравивших окружающих с этим «замечательным» праздником. В ответ посыпались оскорбления, и стихийно возникло некое подобие конференции, конец которой был положен администраторами сервера. А жаль…
Врезка «информация» *
На заре развития Internet, когда преобладали операционные системы UNIX, для организации конференций (да, впрочем, и электронной почты) часто использовался протокол UUCP (UNIX to UNIX Copy). Местами он чудом сохранился до сих пор, но большинство узлов перешло на более шустрый и гибкий NNTP протокол.
Таким протоколом стал NNTP (Network News Transport Protocol), представляющий собой нечто промежуточное между IMAP4 и POP3 протоколами. Независимо от организации групп новостей, все они связаны в единую иерархическую структуру. Образно можно уподобить конференции дереву папок, а сообщения - хранящихся в них файлам. Фактически можно рассматривать каждую группу новостей, как папку IMAP4, со своими собственными атрибутами.
Однако протокол NNTP содержит много нововведений, не встречавшихся ранее в почтовых системах. Одна из решаемых им проблем - обеспечение синхронизации сообщений. Тысячи NNTP-серверов, порой даже не подозревающих о существовании друг друга, должны иметь идентичное содержимое. На какой бы из них не поступило новое сообщение, оно должно быть разослано всем остальным серверам.
Здесь не будет приводиться подробное описание используемых алгоритмов синхронизации. Не то, чтобы они были слишком сложны для понимания, но механизмы взаимодействия NNTP-серверов скрыты от пользователя и существуют далеко не в единственном варианте - от тривиальной рассылки, до самоорганизующейся распределенной базы данных.
Врезка «для начинающих»
Бесплатных news-серверов много, но хороших среди них очень мало. Чаще всего конференции открыты только на чтение. Посылка сообщений (если даже она и разрешена) обычно никуда не уходит дальше этого сервера. Поэтому ничего не остается, кроме как воспользоваться услугами, предоставляемыми собственным Internet-провайдером.
К счастью, существует масса специальных программ для поиска общедоступных NNTP-серверов. Неплохо себя зарекомендовал “New Hunter” () механизм работы которой будет рассмотрен в «дополнении».
Для подключения к NNTP-серверу необходимо установить с ним TCP-соединение по сто девятнадцатому порту.
Рисунок 012 Подключение к NNTP-серверу
Если соединение установлено успешно, через секунду на экране telnet-клиента должно появится приглашение приблизительного вида:
· 201 news.rnd.runnet.ru InterNetNews NNRP server INN 2.2 21-Jan-1999 ready (no posting).
Код ответа 201 (в тексте он выделен жирным шрифтом) обозначает, что сервер не позволяет клиенту создавать новые сообщения (иными словами постинг запрещен). В том случае, когда постинг разрешен, сервер возвращает код 200 и строку наподобие «posting ok».
Врезка «замечание»
Полное описание кодов возврата содержится в RFC-977, и поэтому не приводится в данной книге.
Список доступных конференций можно получить с помощью команды “LIST”. При медленном соединении эта операция может занять продолжительное время, поскольку количество конференций обычно очень велико. Поэтому ниже приводится лишь фрагмент ответа сервера:
· LIST
· 215 Newsgroups in form "group high low flags".
· control 0004971978 0004971979 n
· junk 0000000001 0000000002 n
· test 0000010149 0000010150 y
· a.bsu.programming 0000000718 0000000715 y
· a.bsu.religion 0000009622 0000009613 y
· a.bsu.talk 0000000190 0000000184 y
· aaa.inu-chan 0000000000 0000000001 m
· ab.arnet 0000000045 0000000046 m
· ab.general 0000001678 0000001677 y
· akr.internet 0000000379 0000000375 y
·…
Пара чисел, следующих за именем группы, указывает номера первого и последнего из доступных сообщений.
Врезка «для начинающих» *
Ограниченные дисковые ресурсы сервера не позволяют ему сохранять все сообщения. По истечении некоторого промежутка времени (варьирующегося зависимости от настройки от недели до месяца) старая корреспонденция удаляется. Предполагается, что подписчики регулярно посещают сервер, и все необходимое сохраняют на своем локальном компьютере.
Конечно, это чрезвычайно неудобное решение доставляет много хлопот пользователям и засоряет их жесткие диски. Поэтому, в сети возникли специализированные сервера, занимающиеся архивированием всех (или избранных) конференций. Некоторые из них имеют развитую систему поиска, без которой было бы немыслимо ориентироваться в миллионах сообщений.
Большой популярностью пользуется служба «Deja News» (), позволяющая не только читать, но отправлять сообщения в конференции.
Флаг, расположенный в конце каждой строки, может принимать один из трех следующих значений: “y”, “n” и “m”. Значение “y” говорит о том, что создание новых сообщений в этой конференции разрешено; “n” запрещает такую операцию и “m” обозначает модерируемою конференцию.
Врезка «для начинающих»
В модерируемые конференции напрямую писать нельзя. Во избежание засорения трафика малоинформативными сообщениями необходимо переслать свое сообщение ведущему (модератору) группы, который по своему усмотрению может поместить его в конференции, а может и не поместить.
На самом же деле, как будет показано в следующей главе «Атака на NNTP-сервер», в большинстве случаев это ограничение можно с легкостью обойти.
Для чтения сообщений из группы ее необходимо предварительно выбрать командой “GROUP”, например, так:
· GROUP akr.internet
· 211 5 375 379 akr.internet
Код 211 сигнализирует об успешном завершении операции (в случае отсутствия запрошенной группы возвращается код 411), за ним следует число хранящихся на сервере сообщений, с номерами первого и последнего из них.
Одним из способов чтения сообщений заключается в использовании команды “ARTICLE”, принимающей в качестве аргумента либо уникальный идентификатор “Message-Id”, либо порядковый номер сообщения.
Врезка «замечание»
Наряду с «ARTICLE» существуют команды «BODY» и «HEAD». Последняя из них возвращает заголовок сообщения; “BODY” - тело, а “ARTICLE”, эквивалентно HEAD+BODY.
Пример, приведенный ниже, демонстрирует получение сообщения, путем использование команды ARTICLE:
· ARTICLE 375
· 220 375 «[email protected]» article
· From: "Chris Robins" «[email protected]»
· Newsgroups: akr.internet,alt.best.of.internet,alt.community.local-money,alt.comp
· References: «01bf95ce$af112040$LocalHost@lislen»
· Subject: Easy Money!
· X-Priority: 3
· X-MSMail-Priority: Normal
· X-Newsreader: Microsoft Outlook Express 5.00.2919.6600
· Message-ID: «[email protected]»
· Date: Sun, 26 Mar 2000 09:21:28 -0500
· NNTP-Posting-Host: 209.47.93.156
· X-Trace: nnrp1.uunet.ca 954080409 209.47.93.156 (Sun, 26 Mar 2000 09:20:09 EST)
· NNTP-Posting-Date: Sun, 26 Mar 2000 09:20:09 EST
· Xref: news.rnd.runnet.ru akr.internet:375
·
· Interested in learning about how you could ear money just for being online,
· then go to my website at:
· http://www.makemoney.f2s.com/makemoney.htm
·
· If you don't believe me then view my checks at:
· http://www.makemoney.f2s.com/checks.htm
·.
Если вызвать команду “ARTICLE” без аргументов, она вернет текущее сообщение. Две команды, “NEXT” и “LAST” служат для перемещения маркера текущего сообщения на одну позицию вперед и назад соответственно. Поэтому, можно не задумываться о номерах сообщений и читать их последовательно одно за другим, пока не надоест.
Например, так:
· NEXT
· 223 376 «[email protected]» Article retrieved; request text separately.
Команда NEXT на единицу увеличила номер текущего сообщения. Но как быть, если хочется прыгнуть сразу в середину списка? Не вызывать же ради этого “NEXT” бесчисленное множество раз?! Конечно же, нет! Достаточно воспользоваться командой “STAT”, перемещающий указатель на любую произвольную позицию.
Следующий эксперимент демонстрирует создание нового сообщения. Для этого потребуется сервер, разрешающий постинг хотя бы в одну конференцию. Лучше всего воспользоваться специально созданной для подобных целей группой, наподобие “test”.
Простейший способ создания сообщения заключается в использовании команды «POST», вызываемой без аргументов. Например:
· Post
· 340 Ok
Сервер ожидает текста сообщения, завершаемого (как и в протоколе POP3), последовательностью «CRLF».«CRLF» . Первыми идут поля заголовка , которые делятся на обязательные и на необязательные.
К обязательным полям относятся:
· newsgroups: одна (или больше) имен групп, куда должно быть отправлено сообщение
· from:адрес отправителя сообщения
· subject:тема сообщения
Если хотя бы одно обязательное поле отсутствует, сервер возвращает ошибку и блокирует отправление.
Например:
· post
· 340 Ok
· from:«kpnc»
· Subject:hello
·
· hello
·.
· 441 Required "Newsgroups" header is missing
После добавления недостающего поля повторная операция отправки сообщения должна завершиться успешно.
· post
· 340 Ok
· newsgroups:test.test
· from:«[email protected]»
· subject:helo
·
· Helo!
·.
· 240 Article posted
Сервер подтвердил успешность выполнения операции, но чтобы действительно убедиться в отправке сообщения, необходимо попробовать прочитать сообщение с сервера, например, следующим образом:
· GROUP test.test
· 211 1 121 121 test.test
· ARTICLE
· 220 121 «[email protected]» article
· Path: demos2!demos!dnews-server
· From: «[email protected]»
· Newsgroups: test.test
· Subject: helo
· Date: 28 Mar 2000 16:51:06 GMT
· Lines: 1
· Message-ID: «[email protected]»
· NNTP-Posting-Host: ppp-02.krintel.ru
· X-Trace: jumbo.demos.su 954262266 24659 195.161.41.226 (28 Mar 2000 16:51:06 GMT
·)
· NNTP-Posting-Date: 28 Mar 2000 16:51:06 GMT
· Xref: demos2 test.test:121
·
· Helo!
·.
Выделенная жирным шрифтом строка содержит адрес отправителя сообщения, доступный для всеобщего обозрения. Любой из подписчиков конференции (количество которых порой доходит до десятков тысяч) может применить на обладателе этого адреса одну из многочисленных атакующих программ… О том как отправить сообщение и при этом суметь остаться анонимном рассказывается в главе «Атака на NNTP-сервер».
Врезка «замечание»
Подробное изложение протокола NNTP и связанных с ним вопросов находится в технической документации RFC-1036, RFC-850 и RFC-977.
Врезка «для начинающих»
Большинство реализаций NNTP протокола поддерживают команду “HELP”, выводящую список доступных команд и иногда подробности использования каждой из них.
Команда “quit” завершает сеанс работы с сервером и разрывает соединение. Например, так:
· Quit
· 205.
Дополнение. Поиск общедоступных NNTP-серверов
O В этой главе:
O Сканирование портов
O Поиск серверов, путем изучения заголовков сообщений
O Описание программы News Hunter
Среди сотен тысяч узлов сети существует огромное количество общедоступных серверов, явно или неявно предоставляющих пользователям те или иные ресурсы. Мелкие корпорации, научные и исследовательские учреждения обычно не склонны обременять свои NNTP-сервера защитой и порой их ресурсами могут безболезненно пользоваться все остальные узлы сети…
Врезка «для начинающих»
Случайно натолкнутся на общедоступный NNTP-сервер маловероятно, а найти его с помощью служб, наподобие «Апорта» или «Altavista» очень трудно. Запрос “NNTP + free” выдаст длинный список бывших когда-то бесплатными серверов, большинство из которых уже успели прекратить свое существование или сменить политику и ограничить доступ.
Поэтому необходимо уметь самостоятельно искать необходимые ресурсы в сети. Но не проще ли обратится к специализированным сайтам, публикующим информацию подобного рода? Нет, и вот почему. Дело в том, что общедоступность большинства ресурсов связана с попустительствами администраторов. Но как только на сервер обрушивается толпа невесть откуда взявшихся пользователей, порядком напрягающих канал, политика безопасности быстро меняется и доступ закрывается. Напротив, единичные подключения, даже если и станут замечены администратором, вряд ли будут им пресекаться до тех пор, пока не станут ощутимо мешать.
Простейший способ поиска NNTP-серверов заключается в сканирование портов. Суть его заключается в следующем: выбирают некий (возможно взятый наугад) IP-адрес, например «195.161.42.149» и пытаются установить с ним TCP-соединение по сто девятнадцатому порту. Успешность операции указывает на наличие NNTP-сервера на данном узле. Если же сервер не отсутствует или не функционален, соединение установить не удастся. В случае успешно установленного соединения пытаются убедиться в бесплатности службы, иначе (сервер не установлен или не бесплатен) выбирают другой IP-адрес, и так до тех пор, пока не кончится терпение или не отыщется требуемый ресурс. Как правило, при сканировании IP адреса перебираются один за другим с убыванием или возрастанием на единицу за каждый шаг.
В зависимости от качества связи и загруженности тестируемого сервера, ответа на запрос о соединении можно ожидать от нескольких секунд до целой минуты! Поэтому, в лучшем случае скорость сканирования составит порядка шестидесяти - ста IP-адресов в минуту, а в худшем за это же время удастся проверить всего один из них.
Легко посчитать, сколько займет исследование даже небольшой подсети. В главе «Как устроен сканер портов» рассказывается о некоторых способах, позволяющих ускорить процесс сканирования, но какие бы оптимизирующие алгоритмы не применялись, (например, попытки асинхронного соединения с несколькими узлами одновременно), эффективность такого подхода не может быть значительно увеличена в силу огромного числа существующих IP-адресов.
Сканирование пригодно для исследования локальных сети различных компаний, но найти с его помощью хороший NNTP-сервер в Internet очень трудно, поскольку таких серверов относительно немного, и все они достаточно равномерно распределены по пространству IP-адресов.
Врезка «информация»
Диапазон перебираемых адресов можно существенно сузить, если обратить внимание на тот замечательный факт, что все IP-адреса, принадлежащие одному провайдеру, обычно очень близки друг другу.
В следующем примере в качестве объекта сканирования выступает крупного поставщика сетевых услуг (в том числе и телеконференций) Демос, публичный web-сайт которого так называется , (IP-адрес равен 194.87.0.48 )
Используя любой сканер, (например, «SuperScan», расположенный на страничке ) можно исследовать узкий диапазон адресов 194.87.0.1 - 194.87.0.254 всего лишь за десяток - другой минут.
В результате этой операции обнаруживается, что Демос имеет множество промежуточных SMTP и NNTP серверов, открытых для прямого доступа! Например, таких как:
Фрагмент протокола сканирования находится на диске под имением /LOG/demos/txt. Он типичен для крупного провайдера, имеющего в своем распоряжении десятки серверов.
Другой способ поиска бесплатных NNTP-серверов заключается в изучении заголовков сообщений, полученных с любого NNTP-сервера. В процессе путешествия по сети, сообщения проходят через один или несколько транзитных серверов, каждый из которых включает в заголовок свой адрес.
В определенном роде NNTP-сервер это гигантский почтовый ящик, заполненный корреспонденцией со всех сторон света. Среди транзитных серверов и серверов отправителя сообщения часто попадаются и такие, которые предоставляют бесплатный доступ всем пользователям.
Полный путь, проделанный сообщением, содержится в поле “Path”, а сервер отправителя в поле “NNTP-Posting Host”. В примере, приведенном ниже, показаны заголовки двух сообщений: (поля “Path” и “NNTP-Posting Host” выделены жирным шрифтом):
· Path: news.medlux.ru!Melt.RU!carrier.kiev.ua!news.kharkiv.net!useua!not-for-mail
· Newsgroups: medlux.trade.optika
· Subject: I am looking for a permanent wholesale buyer of women's hair 30-60 cm long of all colours. Phone in Kharkov (0572)329639, 364556, fax 329763.
· Date: Thu, 6 Apr 2000 05:01:15 +0300
· Lines: 16
· Distribution: world
· NNTP-Posting-Host: ums.online.kharkov.com
· NNTP-Posting-Date: 6 Apr 2000 02:02:11 GMT
· Xref: news.medlux.ru medlux.trade.optika:904
· Subject: ammivit
· Newsgroups:ural.commerce
· Date: Mon, 27 Mar 2000 04:48:14 +0400
· Lines: 25
· Path: news.medlux.ru!mailserver.corvis.ru
· NNTP-Posting-Host: t1-55.sitek.net 212.34.32.118
· Xref: news.medlux.ru relcom.medicine.blood-service:2982
Поразительно, но эти два сообщения открывают семь восемь NNTP-серверов (и это еще не самый лучший результат)! Все они, перечислены ниже:
· (бесплатный)
· (хост не найден)
· (бесплатный)
· (приватный)
· (хост не найден)
· (бесплатный)
· (хост не найден)
И хотя часть узлов по непонятой причине не отвечает , результатами «улова» трудно оставаться недовольным. Анализом заголовков всего двух сообщений найдено три бесплатных сервера, разрешающих постинг.
А если проанализировать все сообщения, находящиеся на каждом из этих серверов, и все сообщения на каждом из вновь найденных серверов, подобным рекурсивным спуском можно найти едва ли не все NNTP-сервера, существующие в сети!
Узкое место такой операции - пропускная способность канала, соединяющего ищущего с Internet. Получать гигабайты сообщений через модемную линию нереально. Поэтому, эту задачу лучше переложить на плечи автономного скрипта, работающего на узле с быстрым каналом, или различными способами оптимизировать алгоритм (так, например, ни к чему получать от одного и того же адресата более одного сообщения, а количество уникальных отправителей в сети велико, но конечно) .
Впрочем, глубокое сканирование сети бессмысленно. Достаточно найти один (максимум два-три) быстрых и надежных NNTP-сервера, которые ввиду своей распространенности попадаются очень быстро.
На этом секреты поиска бесплатных NNTP-серверов заканчиваются. Конечно, описанные выше операции вручную выполнять было бы затруднительно, но они легко поддаются автоматизации и уже реализованы в десятках различных программ. Большой популярностью пользуется упомянутый выше «News Hunter 4.0» (). Помимо всего прочего он умеет стоить удобные отчеты и измерять скорость соединения с каждым узлом, - это помогает выбрать из них самый лучший.
К сожалению, даже последняя на момент написания книги, четвертая версия, не снабжена сканером IP-адресов и, по крайней мере, хотя бы один NTTP-сервер пользователь должен найти самостоятельно.
Для этого пригодиться методика, описанная в начале главы. Достаточно найти любой сервер, предоставляющий доступ хотя бы на чтение к одной-двум конференциям. Анализируя заголовки сообщений, «News Hunter» найдет все остальные.
Рисунок 14 Результат работы News Hunter
Однако, используя найденный таким образом сервер, приходится всегда быть готовым к тому, что в любой момент политика администрирования может измениться, вследствие чего свободный доступ на некоторое время (или навсегда) закроют. Единственный способ этого избежать - пользоваться платными, надежными ресурсами.
Врезка «Информация» *
Весьма удобным сервисом является , позволяющий отправлять письма в конференции… прямо со своего почтового ящика. Помимо быстроты и надежности поддерживается протокол IMAP4, однако, предоставим слово владельцам сервера:
You can use this service to create a free e-mail account that will be accessible from any web browser, anywhere in the world. You will also have access to newsgroups and the ability to check your mail from any touch tone phone, plus a variety of wireless devices. MailandNews.com also works with other Internet e-mail clients, allowing you to access your new mailbox using Outlook Express, Netscape Messenger, Eudora, Pegasus Mail, or Infinite Technologies .