Сервер новостей InterNetNews (INN)

Copyright (C) by Yuri V. Savin, 1998. E-Mail: msav@kari.ru
  1. Введение
  2. Общая схема настройки сервера новостей
  3. Инсталляция пакета INN
  4. Краткое описание работы системы INN
  5. Настройка системы INN
  6. Logging системы INN

Введение

Пакет INN, автором которого является Рич Солц (Rich Salz), представляет полнофункциональный пакет программ для построения сервера новостей. Для взаимодействия с другими машинами используется стандартный протокол NNTP. Как и любой сервер новостей, система INN предполагает наличие по крайней мере одного поставщика новостей, а также наличие хостов, которым новости отсылаются (NNTP соседей называют newsfeeders). Кроме того, у сервера имеются клиенты, которые через "читалку новостей" обращаются к серверу для чтения и/или публикации новостей.

Статьи (articles) в Usenet классифицируются по телеконференциям, которые подобно каталогам файловой системы имеют иерархическую структуру. Новости хранятся на сервере в дереве каталогов, имена которых формируются путем замены точек слэшами ("/"). Например, статьи из группы relcom.fido.ru.unix хранятся в каталоге /var/news/spool/articles/relcom/fido/ru/unix.


Общая схема настройки сервера новостей


Инсталляция пакета INN

Процесс инсталляции пакета INN идентичен для Unix-основанных систем, но каждая платформа имеет свои особенности инсталляции. Описанная ниже последовательность действий ориентирована на FreeBSD (пакет inn-1.7.2 ставился на FreeBSD-2.2.5).

Во-первых, Вам необходимо заполучить свеженький дистрибутив INN. Обратитесь на сервер ftp.isc.org и перейдите в каталог isc/inn. Выберите необходимый архив (например, inn-1.7.2.tar.gz), перекачайте, декомпрессируйте и разархивируйте его, поместив результат в выбранный Вами каталог (в дальнейшем он упоминается как $inn).

Сменив текущий каталог на $inn, Вы обнаружите два файла формата nroff, использующие макрос -ms: Install.ms.1 и Install.ms.2. Это две части оффициального руководства по инсталляции InterNetNews.
Дайте команду make Install.ms При этом два файла объединяются в один - Install.ms с правами доступа 444. Приведите этот файл в более читабельный вид (в частности, для просмотра с помощью more) командой: nroff -ms Install.ms > Install При возникновении проблем в инсталляции пакета необходимо обращаться за помощью к этому файлу.

Следующий этап процедуры инсталляции - редактирование главного файла конфигурации сonfig.data.
В каталоге $inn/sample-configs содержатся шаблоны файла config.data для различных платформ. Вам необходимо выбрать наиболее подходящий для Вас файл и скопировать его в $inn/config/config.data, например, для FreeBSD выполните следующие команды: cd $inn cp sample-configs/config.data-FreeBSD-2.0 config/config.data

Теперь настала пора отредактировать сам файл config.data. INN получает из этого файла информацию о своей среде (т.е. где лежат компоненты, используемые INN).; Для пользователей FreeBSD надо подкорректировать опции для LIBS: LIBS -lutil -lcrypt Пакет поставляется с некоторыми perl-сценариями, требующими пакет языка perl версии не ниже, чем 5.001, так что Вам, возможно, придется установить новый пакет языка perl и прописать корректный путь к команде perl: _PATH_PERL /usr/local/bin/perl
Подробное описание содержимого файла config.data смотрите в файле Install.

Скомпилируйте все исходники: cd $inn make all Перед инсталляцией компонентов пакета необходимо создать каталоги, куда они будут помещены: mkdir /usr/news /var/news /var/news/spool Теперь можно инсталлировать компоненты пакета INN. Если Вы ставите пакет в первый раз на эту систему, то просто дайте команду: make install Если же Вы заменяете уже существующую систему INN, то рекомендуется инсталлировать отдельно программы и отдельно конфигурационные файлы и сценарии. Это позволит не затирать конфигурационные файлы текущей INN системы. Итак, сначала запустите сценарий: makedirs.sh Он создаст все остальные каталоги (ниже созданных командой mkdir на предыдущем этапе). Заметим, что команда make install вызывает этот сценарий сама. Теперь инсталлируйте программы и руководства (man'ы): make update При этом сценарии и конфигурационные файлы будут скопированы из каталога $inn/samples в каталог $inn/site. Если Вы хотите сохранить настройки предыдущей версии INN, затрите файлы из каталога $inn/site такими же файлами из старого программного обеспечения, после чего: cd $inn/site make install

Запуск сценария: $inn/BUILD позволит создать файлы active и history. После запуска сценария, он спросит, использовать ли с-версию subst (если она существует): -- do you want to use it [y or n]? y Далее он спросит построили ли Вы бинарники: Have you already built the executables [y or n]? y Затем он спросит существуют ли каталоги spool, etc и т.д.: Do the spool, etc., directories exist [y or n]? y Следующим вопросом будет: желаете ли Вы продолжить инсталляцию: Do you want to continue with the installation [y or n]? y И, наконец, последний ворос: запускать ли subshell для редактирования конфигурационных файлов: Start a subshell to edit the config files [y or n]? n После завершения работы сценария проверьте, что владельцем файла active является пользователь news, группа news, права доступа на него 644, а если это не так (а практика показывает что в сценарии действительно что-то не так :-)), то исправьте это, дав команды chmod 644 active chown news:news active

Сделайте почтовый псевдоним для пользователя news в файле /etc/mail/aliases: usenet: news Дайте знать об этом sendmail, перестроив после редактирования файла базу псевдонимов: /usr/bin/newaliases

INN оповещает о своей работе, используя систему syslog. Проверьте конфигурационный файл демона syslogd /etc/syslog.conf. Раскомментируйте в этом файле строки, содержащие news.crit, news.err, news.notice. После этого не забудьте создать соответствующие файлы в каталоге /var/log/news (владелец - news, группа -news, права доступа - 664).

Заметим, что, если Ваш файл newsfeeds не содержит строк с указанием "питающихся" у Вас сторон, кроме строки ME, то демон innd при запуске выдаст ошибку: "SERVER bad_newsfeeds no feeding sites". Для того, чтобы успокоить сервер, на начальной стадии Вы можете прописать холостой поток: dummy-feed:!*:: Добавьте в .profileпользователя root пути поиска в новых каталогах: PATH=$PATH:/usr/news/bin:/var/news Для чтения руководств с помощью команды man, добавьте строку в файле /etc/manpath.config: MANDATORY_MANPATH /usr/news/man Поместите запуск демона innd в сценарий rc.local: /usr/news/bin/rc.news > /dev/console Проверьте наличие строки DOINNWATCH=true в файле rc.news. Это позволит использовать утилиту innwatch.ctl, которая "гасит" сервер новостей, когда Ваш диск переполнился и предотвращает крушение системы.

Перезагрузите машину и проверьте, работает ли демон innd. Во-первых, должен быть соответствующий процесс, запущенный пользователем news: ps -U news | grep inn Во-вторых, дав команду telnet localhost nntp Вы должны увидеть примерно следующее: Trying 127.0.0.1 Connected to localhost.your.domain. Escape character is '^]'. 200 news.your.domain InterNetNews server INN 1.7.2 ready Чтобы увидеть, какие команды понимает этот news-сервер, дайте команду help. Для возврата из сеанса telnet обратно в shell, дайте команду quit.


Краткое описание работы системы INN

Во время загрузки системы в качестве пользователя root запускается сценарий rc.news (хорошее место для запуска - файл /etc/rc.local). В результате чего выполняется демон innd (посмотрите процесс командой ps -U news | grep inn). Эта программа прослушивает порт NNTP (TCP-port 119) на наличие входящих соединений. Если соединяются локальные клиенты для чтения новостей, то innd передает дальнейшее управление демону nnrpd, вызывая его. Этот демон просматривает файл nnrp.access для определения прав доступа к локальной базе статей. Если соединяются поставщики новостей (они должны быть прописаны в файле hosts.nntp), то innd принимает статьи (просматривая файлы hosts.nntp и active) и размещает их на Вашем диске (по умолчанию в каталоге /var/news/spool/articles).

В функции innd не входит отсылка новостей с локальной машины, для этого предназначены другие программы. Как только статья получена от поставщиков, она распространяется на все NNTP-машины, которые подписаны на конкретную телеконференцию у данной машины. Конкретно, куда и каким образом статьи будут отправляться с локального сервера определяется в файле newsfeeds. Программа, отвечающая за отправку статей (например, nntpsend, nntplink, send-nntp - программы транспортировки по NNTP, или sendbatch - программа транспортировки по UUCP) читает файл newsfeeds и передает статьи в заданном направлении.

Если Вы используете nntpsend, то Вы должны отредактировать файл nntpsend.ctl (хотя все можно прописать в файле newsfeeds). Список статей на отправку записывается в файл, который обычно хранится в каталоге /var/news/spool/out.going. Имя этого файла, как правило, совпадает с именем NNTP-соседа, указанного в файле newsfeeds. Для того, чтобы в один "прекрасный" момент диск не переполнился, старые статьи надо удалять. Это делается с помощью сценария news.daily. Он вызывает программу expire, которая просматривает файл expire.ctl (в нем указывается срок хранения статей) для обнаружения и удаления статей с устекшим сроком хранения. Этот же сценарий предназначен для каждодневного отчета о работе INN.


Настройка системы INN

Итак, мы инсталлировали систему INN и запустили демон innd. Более того, мы не получили сообщений об ошибках и процесс innd выполняется на системе. Настала пора возложить на innd реальные функции. Для этого нужно внести в конфигурационные файлы изменения, отражающие наши потребности. Для начала погасим демон innd с помощью команды: ctlinnd shutdown configure Теперь мы смело можем править конфигурационные файлы пакета INN (главное, не пугаться их количества :-)). По умолчанию они находятся в каталоге /var/news/etc. Естественно, прежде чем редактировать файлы надо иметь представление о том, как функционирует пакет INN (Вы ведь прочитали главу 4).

Попробуем выяснить, что нам может предложить провайдер (или любые хосты, которые согласны снабжать нас новостями). Для этого получим список новостей, на которые он подписан. Один из способов получения списка следующий. Воспользуемся командой пакета INN: getlist -h newsserver.our.pro > active.provider Созданный вышестоящей командой файл active.provider содержит список групп новостей, на которые подписан наш провайдер. Выберем из этого списка те группы, на которые мы действительно хотим подписаться и пропишем их в нашем файле active. Например, если Вы хотите подписаться на конференцию relcom.humor, добавьте в этот файл примерно следующее: relcom.humor 0000000000 0000000001 y Если Вы хотите принимать все (или почти все) группы новостей, на которые подписан Ваш провайдер, то файл active можно получить из active.provider, "прогнав" того через следующий сценарий (он обнуляет два средних поля каждой строки): #!/bin/sh sed < active.provider > active \ -e 's/^\([^ ]*\) [0-9]* [0-9]* \([^ ]*\)$/\1 0000000000 0000000000 \2/' Наш файл active готов (он содержит строки для всех групп, которые поддерживает наш сервер), но надо сообщить и провайдеру о нашем выборе (чтобы он знал какие группы новостей ему нужно пересылать на наш хост).

Даже если провайдер пропишет нас в своей конфигурации сервера новостей, он не сможет скидывать нам новости по NNTP. Мы должны дать ему разрешение на это. Для этого добавим строчку в файл hosts.nntp: newsserver.our.provider: Здесь надо заметить, что мы полагаемся на провайдера: мы знаем, что он будет снабжать нас только теми конференциями, о которых мы его попросили. Если же Вы не доверяете своим NNTP-соседям, то можно указать конкретно шаблон конференций, которые Вы принимаете на локальный диск от конкретного NNTP-соседа. Например, мы хотим принимать от newsserver.our.badprovider только relcom'овские группы новостей: newsserver.our.badprovider::relcom.*

Отредактируем файл newsfeeds, указав всех NNTP-соседей, которых мы хотим снабжать статьями. Не забудем указать в этом файле своего провайдера. Ниже приведены два примера этого файла. В первом случае мы планируем снабжать статьями хост newsserver.our.provider по NNTP (используя программу nntpsend, о том как ее вызывать будет сказано позднее): ME:*, !junk, !control*, !local*/!local:: newsserver.our.provider:*, !junk, !control*, !local*:Tf, Wnm:newsserver.our.provider Во втором случае мы хотим снабжать этот же хост по UUCP (имя этой uucp-системы provider), используя программу sendbatch (опять же о том, как ее вызывать, будет сказано позднее): ME:*, !junk, !control*, !local*/!local:: provider/newsserver.our.provider:*, !junk, !control*, !local*:Tf, Wnb:

Теперь назначим различные глобальные параметры сервера новостей (имя сервера, имя домена) и параметры, используемые при формировании заголовков статей, публикуемых у нас. Эта информация хранится в файле inn.conf, а пример этого файла можно посмотреть здесь.

Определимся теперь с клиентами нашего сервера новостей (хосты, которые через программу чтения новостей общаются с нашим сервером). Например, мы хотим ограничить пространство пользования ресурсами нашего сервера новостей нашей Интранет-сетью (192.168.111.0/255.255.255.0) и нашей внешней сетью (домен our.domain), причем пользователям этих сетей мы разрешаем и читать новости, и публиковать их на наш сервер. Ах, да, мы чуть не забыли о наших хороших партнерах из домена partner.domain (правда, им нечего делать в наших локальных конференциях). Ну, а для остальных поместим первым правило, запрещающее все и вся. Для этого добавим строки в файл nnrp.access: *:: -no- : -no- :!* 192.168.111.*:Read Post:::* *.our.domain:Read Post:::* *.partner.domain:Read Post:::*, !local*

Как только мы начнем получать статьи на локальный диск, надо будет следить за сроком их хранения на диске и удалять старые (диск же не резиновый :-)). К счастью, за нас это будет делать программа expire, а от нас требуется только дать ей соответствующие указания в файле expire.ctl (ну, и, конечно, запускать механизм очистки - об этом ниже). Мы должны указать в этом файле, во-первых - срок хранения идентификаторов статей в файле history (это делается для того, чтобы не принимать заново удаленные статьи), во-вторых - срок хранения самих тел статей. Пример ниже говорит о том, что запись об идентификаторе статей хранится в файле history 14 дней после удаления тела этих статей, тела статей из локальных телеконференций хранятся на системе от 5 до 7 дней (по умолчанию 6), а для всех остальных телеконференций тела хранятся от 3 до 5 дней (по умолчанию - 4 дня): /remember/:14 *:A:3:4:5 local*:A:5:6:7 Заметим, что значение по умолчанию (образец '*') должно фигурировать раньше, чем строки для отдельных групп, поскольку применяется последнее соответствие образцу в первом поле.

Важным шагом после редактирования конфигурационных файлов является проверка корректности сделанных нами изменений. Система INN имеет ряд средств, помогающих нам в решении этой задачи. Вот некоторые из них:

Последний шаг настройки - периодически запускать программу отправки статей с нашей машины, программу чистки каталога статей и обобщения log-файлов. Для этого отредактируем таблицу заданий пользователя news для демона cron: crontab -u news -e Ваш любимый редактор (определенный переменной окружения EDITOR) откроет файл /var/cron/tabs/news. Ежедневно в 4 часа утра мы будем запускать сценарий news.daily, в функции которого входит обобщение и ротация файлов регистрации, прогон программы expire и др. Далее, в 1 минуту и 28 минут каждого часа мы будем запускать программу nntpsend для отправки потоков статей по NNTP нашим соседям. 0 4 * * * /usr/news/bin/news.daily > /dev/null 2>&1 & 1, 28 * * * * /usr/news/bin/nntpsend > /dev/null 2>&1 & Наконец, если мы планируем отправлять потоки новостей по UUCP на UUCP-систему provider, то в 37 минут каждого часа из cron'a будем вызывать программу sendbatch: 37 * * * * /usr/news/bin/sendbatch -c provider > /dev/null 2>&1 & Ну что ж, теперь можно запустить демон innd (rc.news поможет нам в этом) и насладиться его работой!


Файл active

Этот файл содержит список групп новостей, которые принимает локальный сервер. Содержимое файла считывается демоном innd при запуске, либо при получении этим демоном соответствующего указания от программы ctlinnd. Все статьи, опубликованные в группы новостей, которые не указаны в файле active отвергаются локальным сервером новостей. Строки в этом файле имеют следующий формат: name himark lomark flags Ниже описывается значение параметров:

Основные операции, которые должен время от времени выполнять администратор включают в себя добавление новых групп, удаление ненужных групп, изменение флагов текущих групп новостей. Все эти операции должны отображать свои действия в файле active. Существует два основных подхода к выполнению указанных выше операций с группами новостей:
  1. Первый подход - использование соответствующих подкоманд команды ctlinnd: "newgroup", "rmgroup" и "changegroup". Например, команда ctlinnd newgroup relcom.humor y добавляет группу новостей "relcom.humor" с флагом "y" (см. выше), помещая соответствующие строки в файлах active и active.times. Файл active.times содержит информацию о времени создания новой группы новостей (и о том, кто ее создал), которая используется некоторыми программами чтения новостей (Trumpet одна из них) для оповещения своих пользователей о наличии новых групп новостей.
  2. Второй подход - непосредственное редактирование файла active, удобен для операций с большим количеством групп новостей (попробуйте удалить несколько десятков групп с помощью первого способа :-)), но имеет один недостаток: он не вносит автоматических изменений в файл active.times. Общая последовательность действий такова:

Файл expire.ctl

Этот файл считывается программой expire при запуске и определяет правила очистки дерева статей на локальном сервере (сроки хранения тел статей и их идентификаторов). В начале этого файла обязательно должна находится строка (причем, только одна), определяющая как долго хранить записи об идентификаторах статей в файле history, после того, как тело статьи удалено. Это позволяет отклонить эту статью, если поставщик новостей вновь предложит ее в определенный промежуток времени. Эта строка имеет следующий формат: /remember/:время где время - срок хранения в днях (можно указывать и дробную часть дня, наприме, /remember/:7.5 - семь с половиной дней), по истечении которого из системы удаляются идентификаторы старых статей. Последующие командные строки определяют когда нужно удалять из системы тела статей. Они имеют следующий формат: pattern:modflag:keep:default:purge Ниже описывается значение параметров:

Помимо строки /remember/ Вы должны указать строку с pattern '*' и modflag 'A'. Эта строка является строкой по умолчанию для срока хранения всех статей на системе. При этом она обязательно должна стоять раньше, чем строки с образцами для конкретных групп, поскольку этот файл проверяется программой expire до конца и последняя соответствующая группе новостей строка будет использована.

Например, мы хотим после удаления тела статьи хранить ее идентификатор в базе данных в течение 5-ти дней. Тела статей будут храниться на системе от 3-ех до 5-ти дней, за исключением локальных конференций, которые мы хотим хранить подольше (в течение 10-ти дней). Тогда наш файл будет выглядеть так: /remember/:5 *:A:3:4:5 local*:A:10:10:10


Файл inn.conf

Файл inn.conf содержит различные глобальные параметры сервера новостей (имя сервера, имя домена) и параметры, используемые при формировании заголовков статей (начавших свой путешествие по Usenet с этого сервера). Все изменения, сделанные в этом файле считываются демоном innd только после перезагрузки сервера новостей. Строки в этом файле имеют следующий формат: имя: [возможны пробелы] значение Здесь имя - имя параметра, значение - его значение. Некоторые параметры могут быть изменены определением переменных окружения системы. Ниже описываются имена параметров и их значения:

Следующие три параметра используются только демоном nnrpd при приеме публикаций от клиентов:

Ниже приведен пример этого файла на машине news.our.domain: fromhost : news.our.domain organization : Kari Ltd. pathhost : news.our.domain server : news.our.domain domain : our.domain mime-version : 1.0 mime-contenttype : text/plain; charset=KOI8-R mime-encoding : 8bit


Файл hosts.nntp

Файл hosts.nntp содержит информацию о том, какие хосты могут снабжать локальный сервер новостями, используя NNTP протокол. Информация из этого файла считывается в память демоном innd при запуске, либо при получении определенного указания демону innd от программы ctlinnd. Когда удаленная машина соединяется с NNTP портом системы INN, демон innd сверяет ее IP-адрес с адресами машин, перечисленных в файле hosts.nntp. Если демон не находит соответствующей записи для данной машины в этом файле, то он "порождает" процесс nnrpd, который обслуживает данное соединение. Запомните: Вы НЕ сможете передавать потоки новостей по NNTP на удаленный сервер новостей INN, пока тот не пропишет Вас (вашу машину) корректно в своем файле hosts.nntp. Строки этого файла имеют следующий формат: address:password:pattern Ниже описываются значения полей:

После изменений в файле hosts.nntp не забудьте дать команду демону innd перечитать этот файл (вместо причины edit можно указать любой текст, который определяет причину перезагрузки файла): ctlinnd reload hosts.nntp edit

Файл newsfeeds

Файл newsfeeds содержит информацию о том, какие статьи и каким образом необходимо пересылать на соседние NNTP узлы. Информация из этого файла считывается в память демоном innd при запуске, либо при получении определенного указания демону innd от программы ctlinnd. Для каждого узла, с которым Вы обмениваетесь новостями должно быть соответствующее описание в этом файле (feed entries). В дальнейшем feed entry для NNTP-узла упоминается как поток новостей для этого узла.

Описание потока новостей имеет следующий формат: sitename:[/exclude, exclude, ...]\ :pattern, pattern...[/distrib, distrib, ...]\ :flag, flag, ...\ :param В квадратных скобках - необязательные параметры, обратный слэш ("\") - склеивание этой строки с последующей. Ниже описывается значение параметров.