su13@pochta.ru

| Первый | Второй | Третий | Четвёртый | Пятый | Шестой | Седьмой |


//

Глава 22. NNTP и nntpd Daemon

Локальное оглавление
Протокол NNTP
Установка сервера NNTP
Ограничение доступа к NNTP
Авторизация NNTP
Взаимодействие nntpd и C-News

Протокол передачи сетевых новостей (Network News Transfer Protocol, NNTP) предусматривает разные подходы к обмену новостей. Здесь поддерживается все: от пакетной технологии (аналог UUCP), до интерактивного обмена по сети. NNTP не просто пакет программ, это стандарт Internet, описанный в RFC-977. Он основан на поточных соединениях, обычно по TCP, между клиентами в сети и сервером новостей. Поточная схема позволяет клиентам и серверу гибко управлять передачей статей.

Различные команды позволяют клиентам принимать, посылать и отправлять по почте статьи. Различие между посылкой и отправкой в том, что последняя может включать статьи с незавершенной информацией заголовка. Поиск статьи может использоваться клиентом передачи новостей также, как программами чтения (newsreaders). Это делает NNTP превосходным средством для обеспечения доступа к новостям клиентам в локальной сети без применения NFS.

NNTP также обеспечивает активый и пассивный способы передачи новостей, которые называются "pushing" и "pulling". Выталкивание (pushing), в основном, представляет собой то же самое, что и C-News протокол ihave/sendme, который рассмотрен в главе 21). Клиент предлагает статью серверу через IHAVE msgid, а сервер возвращает код ответа, который указывает, имеет ли он уже эту статью, или она требуется. В последнем случае, клиент посылает статью, завершенную одиночной точкой в отдельной строке.

Выталкивание новостей имеет один недостаток: оно вызывает значительную загрузку сервера, так как он должен искать в базе данных хронологий каждую конкретную статью.

Противоположная методика: перемещать (pulling) новости. Клиент запрашивает список всех доступных статей группы, которые прибыли после заданной даты. Этот запрос выполняется командой NEWNEWS. Из возвращенного списка сообщений, клиент выбирает те статьи, которые он еще не имеет, используя команду ARTICLE для каждой из них.

Проблема с перемещением новостей состоит в том, что требуется хорошее управление сервером, которое позволяет клиенту запрашивать группы и распределения. Например, оно должно гарантировать, что никакой конфиденциальный материал из локальных групп не будет послан несанкционированной клиентуре.

Имеется также ряд команд для newsreaders, которые разрешают им отыскивать заголовок и тело статьи отдельно или даже находтьь коекретные строки заголовка из набора статей. Это дает возможность хранить все новости на центральной машине, используя nntp-основанные клиентские программы для чтения и регистрации. Это альтернатива экспорту каталогов новостей через NFS, который описан в главе 21.

Полная проблема NNTP состоит в том, что он позволяет хорошо осведомленному специалисту вставлять статьи в поток новостей с ложной спецификацией отправителя. Это называется news faking или spoofing. Расширение NNTP позволяет требовать установления подлинности пользователя для некоторых команд.

Имеется ряд доступных пакетов NNTP. Один из наиболее широко известных: NNTP daemon. Первоначально, он был написан Stan Barber и Phil Lapsley, чтобы проиллюстрировать подробности RFC-977. Вы можете найти его в большинстве дистрибутивов Linux, а также получить исходники и откомпилировать их.

Пакет nntpd состоит из сервера и двух клиентов для перемещения и выталкивания новостей, соответственно, и свою версию программы inews. Они живут в среде B-news, но с небольшими дополнениями, они будут работать с C-news. Однако, если Вы планируете использовать NNTP больше, чем для доступа newsreaders к серверу новостей, эта реализация недостаточна. Мы обсудим только NNTP daemon, содержащийся в пакете nntpd и не будем останавливаться на клиентских программах.

Если Вы желаете использовать большой сайт новостей, Вы должны рассмотреть пакет InterNet News (INN), который был написан Rich Salz. Этот пакет обеспечивает NNTP и UUCP-доставку новостей, что определенно лучше, чем nntpd. INN подробно рассматривается в главе 23.

Протокол NNTP

Мы упомянули две команды NNTP, которые являются ключевыми при передаче статей между серверами. Теперь мы рассмотрим их в контексте фактического NNTP-сеанса, чтобы показать Вам насколько прост этот протокол. Используем простой клиент telnet, чтобы соединиться с INN-сервером новостей Virtual Brewery с именем news.vbrew.com. Чтобы сделать примеры короткими, сервер запущен в минимальной конфигурации. Мы рассмотрим как завершить конфигурацию этого сервера в главе 23. В нашем тестировании мы будем очень осторожны: все статьи будут генерироваться только в группе новостей junk, чтобы никому не мешать.

Соединение с сервером новостей

Для связи с сервером нужно просто открыть TCP-соединение с портом для NNTP. После этого будет показано приветственное приглашение сервера. Одна из первых команд, которые Вы могли бы попробовать: help. Ответ, который Вы получите, зависит от того, чем считает Вас сервер: удаленным NNTP-сервером или программой чтения новостей (newsreader), так как имеются различные наборы команд. Вы можете изменять режим доступа, используя команду mode:

$ telnet news.vbrew.com nntp
Trying 172.16.1.1...
Connected to localhost.
Escape character is '^]'.
200 news.vbrew.com InterNetNews server INN 1.7.2 08-Dec-1997 ready
help
100 Legal commands
          authinfo
                help
                ihave
                check
                takethis
                list
                mode
                xmode
                quit
                head
                stat
                xbatch
                xpath
                xreplic
For more information, contact "usenet" at this machine.
.

Ответы NNTP всегда клнчаются точкой (.) в начале строки. Числа в выводе задают коды ответа (response codes) и означают результат запроса (норма или произошла какая-то ошибка). Они описаны в RFC-977; мы будем говорить о наиболее важных.

Выталкивание (Pushing) статьи на сервер

Я упомянул команду IHAVE когда говорил о выталкивании статей на сервер новостей. Давайте посмотрим, как она работает:

ihave <123456@gw.vk2ktj.ampr.org>
335
From: terry@gw.vk2ktj.ampr.org
Subject: test message sent with ihave
Newsgroups: junk
Distribution: world
Path: gw.vk2ktj.ampr.org
Date: 26 April 1999
Message-ID: <123456@gw.vk2ktj.ampr.org>
Body:

This is a test message sent using the NNTP IHAVE command.
.

235

Все команды NNTP нечувствительны к регистру, так что Вы можете вводить их в любом. Команда IHAVE берет один обязательный параметр, это Message ID статьи, которая помещается на сервер. Каждая статья имеет уникальный message ID. Команда IHAVE будет выдана для каждой статьи, которую сервер желает передать. Если код ответа команды находится в диапазоне "3xx", NNTP-сервер передаст полную статью с заголовком и точкой в отдельной строке в качестве маркера конца статьи. Если код ответа был в диапазоне "4xx", принимающий сервер данную статью принять не может из-за ее наличия или какой-то технической проблемы.

Когда статья передана, принимающий сервер генерирует код сообщающий, успешно ли он принял статью.

Изменение режимиа работы с NNTP

Программы работы с новостями (Newsreaders) используют собственный набор команд при работе с сервером новостей. Чтобы активизировать эти команды, сервер должен перейти в режим читателя (reader). Большинство серверов так и делают, если IP-адрес соединяющейся машины не перечислен в списке серверов новостей (news-forwarding). В любом случае NNTP обеспечивает команду для явного переключения в режим reader:

mode reader
200 news.vbrew.com InterNetNews NNRP server INN 1.7.2 08-Dec-1997 ready/
    (posting ok).
help
100 Legal commands
  authinfo user Name|pass Password|generic <prog> <args>
  article [MessageID|Number]
  body [MessageID|Number]
  date
  group newsgroup
  head [MessageID|Number]
  help
  ihave
  last
  list [active|active.times|newsgroups|distributions|distrib.pats|/
      overview.fmt|subscriptions]
  listgroup newsgroup
  mode reader
  newgroups yymmdd hhmmss ["GMT"] [<distributions>]
  newnews newsgroups yymmddhhmmss ["GMT"] [<distributions>]
  next
  post
  slave
  stat [MessageID|Number]
  xgtitle [group_pattern]
  xhdr header [range|MessageID]
  xover [range]
  xpat header range|MessageID pat [morepat...]
  xpath MessageID
Report problems to <usenet@vlager.vbrew.com>
.

Режим NNTP reader имеет много команд. Многие из их разработаны, чтобы облегчить работу с новостями. Я упомянул ранее, что там есть команды, которые предписывают серверу высылать заголовок и тело статьи по отдельности. Имеются также команды, которые вносят в список доступные группы и статьи, и другие, которые позволяют регистрировать альтернативные средства посылки новостей.

Получение списка групп

Команда list выводит список групп с их краткими описаниями:

list newsgroups
215 Descriptions in form "group description".
control          News server internal group
junk             News server internal group
local.general    General local stuff
local.test       Local test group
.

Перечень активных групп

Команда list active показывает каждую группу и данные о ней. Два числа в каждой строке вывода задают старший и младший номера статей в каждой группе. Программы работы с новостями на основании этих чисел узнают, сколько статей сейчас в группе. Последнее поле в выводе отображает флажки контроля: разрешено ли посылать статьи в груупу, является ли она модерируемой, и хранятся ли статьи на сервере на самом деле, или только данные о них. Подробно эти флажки описаны в главе 23. Рассмотрим пример:

list active
215 Newsgroups in form "group high low flags".
control  0000000000 0000000001 y
junk     0000000003 0000000001 y
alt.test 0000000000 0000000001 y
.

Посылка статьи

Раньше уже упоминалось различие между передачей статьи и ее посылкой. Когда Вы передаете статью, имеется неявное предположение, что статья уже существует, что она имеет идентификатор сообщения, который уникален и назначен сервером, первоначально обработавшем статью. Такая статья имеет полный заголовок. При регистрации (посылке) статья имеет лишь заголовок из заданных Вами полей (тема, группа, в которую направлена и т.п.). Сервер новостей добавит все остальные поля заголовка и создаст message ID для передачи статьи дальше.

Все это означает, что посылка статьи проще, чем передача:

post
340 Ok
From: terry@richard.geek.org.au
Subject: test message number 1
Newsgroups: junk
Body:

This is a test message, please feel free to ignore it.
.

240 Article posted

Сгенерируйте еще парочку сообщений самостоятельно, они нам понадобятся.

Перечень новых статей

После установления связи с сервером программа чтения новостей обычно запрашивает перечень новых статей, которые поступили после последнего соединения с этим сервером. Это делается командой newnews. Три обязательных параметра должны быть заданы: имя группы или групп, чтобы сделать запрос, дата и время, относительно которых вносить в список. Дата и время определены как числа с шестью цифрами в формате; yymmdd и hhmmss:

newnews junk 990101 000000
230 New news follows
<7g2o5r$aa$6@news.vbrew.com>
<7g5bhm$8f$2@news.vbrew.com>
<7g5bk5$8f$3@news.vbrew.com>
.

Выбор группы для дальнейшей работы

Когда пользователь выбирает группу для просмотра, newsreader может сообщить серверу, что некая группа была выбрана. Это упрощает взаимодействие между ними: исчезает потребность постоянно в каждой команде указывать имя группы новостей. Команда group просто берет имя выбранной группы как параметр. Многие команды используют группу, выбранную по умолчанию сервером:

group junk
211 3 1 3 junk

Команда group возвращает сообщение с числом активных сообщений, старшим и младшим номерами и именем группы. Обратите внимание, что хотя в нашем примере число активных сообщений и старший номер статьи совпадают, такое бывает нечасто: некоторые статьи, возможно, устарели и были удалены, понижая число активных сообщений, но оставляя старший номер прежним! Здесь надо проявлять внимание.

Перечень статей в группе

Чтобы адресовать статьи newsreader должен знать, какие числа представляют активные статьи. Команда listgroup предлагает список активных чисел статей в текущей или явно заданной группе, если имя группы указано дополнительным параметром:

listgroup junk
211 Article list follows
1
2
3
.

Получение только заголовка статьи

Пользователь должен иметь некоторую информацию относительно статьи прежде, чем он сможет решить желает ли он читать ее. Я упомянул ранее, что некоторые команды позволяют передавать заголовок и тело статьи отдельно. Команда head используется, чтобы запросить этот режим. Сервер передает только заголовок определенной статьи. Если пользователь не хочет читать эту статью, он не потратит впустую время и трафик.

Статьи могут быть определены, используя любой их номер (из вывода команды listgroup) или их message id:

head 2
221 2 <7g5bhm$8f$2@news.vbrew.com> head
Path: news.vbrew.com!not-for-mail
From: terry@richard.geek.org.au
Newsgroups: junk
Subject: test message number 2
Date: 27 Apr 1999 21:51:50 GMT
Organization: The Virtual brewery
Lines: 2
Message-ID: <7g5bhm$8f$2@news.vbrew.com>
NNTP-Posting-Host: localhost
X-Server-Date: 27 Apr 1999 21:51:50 GMT
Body:
Xref: news.vbrew.com junk:2
.

Получение только тела статьи

Если, с другой стороны, пользователь решает, что он хочет читать статью, newsreader нуждается в способе попросить выслать ему тело статьи. Команда body используется для этой цели. Это работает аналогично команде head, за исключением того, что будет возвращено только тело статьи:

body 2
222 2 <7g5bhm$8f$2@news.vbrew.com> body
This is another test message, please feel free to ignore it too.
.

Чтение статьи из группы

Иногда требуется передавать статьи целиком (заголовок и тело). Часто этим пользуются разные программы кэширования NNTP, например, leafnode.

Естественно, NNTP обеспечивает средства для выполнения этого, которые работают почти аналогично команде head. Команда article принимает номер статьи или message ID как параметр, но возвращает статью целиком с заголовком:

article 1
220 1 <7g2o5r$aa$6@news.vbrew.com> article
Path: news.vbrew.com!not-for-mail
From: terry@richard.geek.org.au
Newsgroups: junk
Subject: test message number 1
Date: 26 Apr 1999 22:08:59 GMT
Organization: The Virtual brewery
Lines: 2
Message-ID: <7g2o5r$aa$6@news.vbrew.com>
NNTP-Posting-Host: localhost
X-Server-Date: 26 Apr 1999 22:08:59 GMT
Body:
Xref: news.vbrew.com junk:1

This is a test message, please feel free to ignore it.
.

Если Вы пытаетесь получить неизвестную статью, сервер вернет сообщение об ошибке с соответствующим кодом ответа, а иногда и текстовым комментарием:

article 4
423 Bad article number

Здесь я рассмотрел, как используются наиболее важные команды NNTP. Если Вы заинтересовались разработкой программного обеспечения, которое осуществляет работу по протоколу NNTP, обратитесь к соответствующим документам RFC: они предоставят много технических подробностей

GNU OCXE GNU LINUX
Hosted by uCoz