Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> NNTP сервер

NNTP (inn+fidogate+binkd+exim)

Автор: f0s.


Итак. Задача состоит в том, чтобы поднять новостной сервер, чтобы читать и писать в фидошные группы с помощью обычного клиента новостей (к примеру Outlook-ом или Mozilla).

Перед началом настройки обновляем дерево портов (если у кого-то оно не обновляется автоматически).

Устанавливаем fidogate, с патчем DS.

[f0s@mail] /home/f0s/> cd /usr/ports/news/fidogate-ds/
[f0s@mail] /usr/ports/news/fidogate-ds/> make && make install && make clean

он за собой должен потянуть inn (если он у вас еще не установлен).

В /etc/syslog.conf раскоментируйте строчки с news.*, подправьте пути:
news.crit                        /var/log/news/news.crit
news.err                         /var/log/news/news.err
news.notice                      /var/log/news/news.notice

и сделайте:
[f0s@mail] //> touch /var/log/news/news.crit 
[f0s@mail] //> touch /var/log/news/news.err
[f0s@mail] //> touch /var/log/news/news.notice
[f0s@mail] //> chown news:news /var/log/news/*
[f0s@mail] //> killall -1 syslogd

Переходим в /usr/local/news/etc.

Вот мой конфиг inn.conf (там в принципе все стандартно за исключением некоторых моментов):
[f0s@mail] /usr/local/news/etc/> cat inn.conf
mta:                    "/usr/sbin/sendmail -oi -oem %s"
organization:           "f2.n550.z2.fidonet.net"
ovmethod:               buffindexed
#метод хранения overview информации.
hismethod:              hisv6
pathhost:               mail.artpaint
pathnews:               /usr/local/news
domain:                 artpaint
# innflags: -c0 -u
mailcmd:                /usr/local/news/bin/innmail
server:                 mail.artpaint

# Feed Configuration

artcutoff:              10
#bindaddress:
#bindaddress6:
dontrejectfiltered:     false
hiscachesize:           0
ignorenewsgroups:       false
immediatecancel:        false
linecountfuzz:          0
maxartsize:             1000000
maxconnections:         50
#pathalias:
pgpverify:              false
port:                   119
refusecybercancels:     false
remembertrash:          false
#sourceaddress:
#sourceaddress6:
verifycancels:          false
wanttrash:              true
wipcheck:               5
wipexpire:              10

# Article Storage

cnfscheckfudgesize:     0
enableoverview:         true
groupbaseexpiry:        true
mergetogroups:          false
overcachesize:          15
#ovgrouppat:
storeonxref:            true
useoverchan:            false
wireformat:             false
xrefslave:              false
nfswriter:              false

# Reading

allownewnews:           true
articlemmap:            false
clienttimeout:          600
initialtimeout:         10
msgidcachesize:         10000
nnrpdcheckart:          true
noreader:               false
readerswhenstopped:     false
readertrack:            false
nfsreader:              false
nfsreaderdelay:         60
tradindexedmmap:        true
nnrpdloadlimit:         16

# Reading -- Keyword Support


keywords:               false
keyartlimit:            100000
keylimit:               512
keymaxwords:            250

# Posting

addnntppostingdate:     true
addnntppostinghost:     true
checkincludedtext:      false
#complaints:
fromhost:               mail.artpaint
localmaxartsize:        1000000
moderatormailer:        mail.artpaint
nnrpdauthsender:        false
nnrpdposthost:          mail.artpaint
nnrpdpostport:          119
spoolfirst:             false
strippostcc:            false

# Posting -- Exponential Backoff

backoffauth:            false
#backoffdb:
backoffk:               1
backoffpostfast:        0
backoffpostslow:        1
backofftrigger:         10000

# Monitoring

doinnwatch:             true
innwatchbatchspace:     800
innwatchlibspace:       25000
innwatchloload:         1000
innwatchhiload:         2000
innwatchpauseload:      1500
innwatchsleeptime:      600
innwatchspoolnodes:     200
innwatchspoolspace:     8000

# Logging

docnfsstat:             true
logartsize:             true
logcancelcomm:          false
logcycles:              3
logipaddr:              true
logsitename:            true
nnrpdoverstats:         false
nntpactsync:            200
nntplinklog:            false
status:                 600
timer:                  600

# System Tuning

badiocount:             5
blockbackoff:           120
chaninacttime:          600
chanretrytime:          300
datamovethreshold:      8192
icdsynccount:           10
keepmmappedthreshold:   1024
#maxcmdreadsize:
maxforks:               10
nicekids:               4
nicenewnews:            0
nicennrpd:              0
pauseretrytime:         300
peertimeout:            3600
rlimitnofile:           -1

# Paths

patharchive:            /usr/local/news/spool/archive
patharticles:           /usr/local/news/spool/articles
pathbin:                /usr/local/news/bin
pathcontrol:            /usr/local/news/bin/control
pathdb:                 /usr/local/news/db
pathetc:                /usr/local/news/etc
pathfilter:             /usr/local/news/bin/filter
pathhttp:               /var/log/news
pathincoming:           /usr/local/news/spool/incoming
pathlog:                /var/log/news
pathoutgoing:           /usr/local/news/spool/outgoing
pathoverview:           /usr/local/news/spool/overview
pathrun:                /usr/local/news/run
pathspool:              /usr/local/news/spool
pathtmp:                /usr/local/news/tmp

Редактируем expire.ctl. Все коментарим, оставляем только:
/remember/:10
*:A:7:10:never

Редактируем readers.conf:
[f0s@mail] /usr/local/news/etc/> cat readers.conf
# Описываем с каких хостов можем подключатья на 119 порт
# и указываем обязательную авторизацию юзеров
auth "all network users" {
    auth: "ckpasswd -f /usr/local/news/db/users.passwd"
    hosts: "192.168.10.0/24, 192.168.20.0/24, 212.176.211.125"
    default: "<LOCAL-USERS>"
}

# Это правило на локалхост
auth "localhost" {
    hosts: "localhost, 127.0.0.1, stdin"
    default: "<localhost>"
}

# Это ACL на всех юзеров, которые подключились, но не прошли
# проверку имени/пароля. Они смогут читать только
# конференции control.*
access "all users" {
    users: "<LOCAL-USERS>"
    read: "control.*"
}

# Это ACL на прошедших проверку пользователей. В данном примере юзер f0s 
# имеет Доступ ко всем конференциям на полный доступ (Read/Post)
access "auth users" {
    users: "f0s"
    newsgroups: "*"
    access: RPA
}

# Это ACL на прошедших проверку пользователей. В данном примере
# юзеры jacko и svhed имеют доступ ко всем конференциям fido7.*
# на полный доступ (Read/Post)
access "auth users" {
    users: "jacko,shved"
    newsgroups: "fido7.*"
    access: RPA
}

# Пользователи подключающиеся с локалхоста имеют доступ ко всем
# конференциям без пароля.
access "localhost" {
    users: "<localhost>"
    newsgroups: "*"
    access: RPA
}

Теперь необходимо создать файл с паролями с помощью утилиты htpasswd (она обычно входит в дистрибутив сервера apache):
[f0s@mail]  htpasswd -c /usr/local/news/db/users.passwd f0s
[f0s@mail]  htpasswd /usr/local/news/db/users.passwd jacko
[f0s@mail]  htpasswd /usr/local/news/db/users.passwd shved

Не забываем сделать файл доступный пользователю news на чтение:
[f0s@mail] /usr/local/news/db/> chown news:news users.passwd
[f0s@mail] /usr/local/news/db/> chmod 640 users.passwd
[f0s@mail] /usr/local/news/db/> ll | grep users.passwd
-rw-r-----  1 news  news        58 25 июл 16:34 users.passwd

Переходим к файлу newsfeeds (все комментарим, оставляем только это):
[f0s@mail] /usr/local/news/etc/> cat newsfeeds
ME:*,!junk,!control*::
dummy-feed:!*::
fidogate\
    :*,!cc,\
    !junk,\
    !control\
    :Tf,Wfb:fidogate

Редактируем файл cycbuff.conf:
[f0s@mail] /usr/local/news/etc/> cat cycbuff.conf
# Это конференции от 2:5080/1003@fidonet. Выделим под них место 200Мб
cycbuff:FILE01:/usr/local/news/spool/articles/gotlib:200000
# Это конференции от 2:292/854@fidonet. Выделим под них место 10Мб
cycbuff:FILE02:/usr/local/news/spool/articles/ward:10000

# задаем два CNFS спула: GOTLIB (200Mb) и WARD (10 Mb).
metacycbuff:GOTLIB:FILE01
metacycbuff:WARD:FILE02

Задаем метод хранения: junk, control.* - в traditional, остальные - в два CNFS спула:
[f0s@mail] /usr/local/news/etc/> cat storage.conf
method tradspool {
    newsgroups: junk,control*
    class: 0
}
method cnfs {
    newsgroups: russian.r55,rustalk.r55
    class: 1
    options: WARD
}

method cnfs {
    newsgroups: *
    class: 2
    options: GOTLIB
}

Редактируем buffindexed.conf:
Размер overview базы определяется эмпирически, но примерно 1/7 от объема news-базы. Т.е. в данном примере, при размере news-базы 210 Мб., размер overview-базы возьмем 30 Мб.

[f0s@mail] /usr/local/news/etc/> cat buffindexed.conf
0:/usr/local/news/spool/overview/OV1:30720

Переходим к созданию. файла history:
[f0s@mail] /usr/local/news/db/> touch history
[f0s@mail] /usr/local/news/db/> ../bin/makedbz -i

Устанавливаем права на файлы в /usr/local/news/db:
[f0s@mail] /usr/local/news/db/> chown news:news *
[f0s@mail] /usr/local/news/db/> chmod 0664 *

Теперь создаем CNFS спулы и overview database:
dd if=/dev/zero of=/usr/local/news/spool/articles/ward bs=1k count=10240
dd if=/dev/zero of=/usr/local/news/spool/articles/gotlib bs=1k count=200000
dd if=/dev/zero of=/usr/local/news/spool/overview/OV1 bs=1k count=30720

Теперь у этих файлов установите владельцем news:news и права 0664.

Далее, для того, чтобы в fido7-конференциях вы отвечали на сообшения не к All, а к автору, необходимо настроить X-Comment-To. Для этого необходимо заменить скрипт filter_nnrpd.pl, котрый находится в /usr/local/news/bin/filter/, на ниже приведенный:

#!/usr/bin/perl -w
#use strict;
#
my %config = (checkincludedtext => 0,
              includedcutoff => 40,
              includedratio => 0.6,
              quotere => '^[>:]',
              antiquotere => '^[<]',
             );

sub filter_post {
    my $rval = "" ;             # assume we'll accept.

    if ($config{checkincludedtext}) {
        my ($lines, $quoted, $antiquoted) = analyze($body);
        if ($lines > $config{includedcutoff}
                && $quoted - $antiquoted > $lines * $config{includedratio}) {
            $rval = "Article contains too much quoted text";
        }
    }

    my $grephistory = '/usr/local/news/bin/grephistory';
    my $sm = '/usr/local/news/bin/sm';
    if( $hdr{"Newsgroups"} =~ /fido7\./ ) {
        if ( $hdr{"Newsgroups"} =~ /,/ ) {
        $rval = "More than one newsgroup requested, only one allowed"; }
        if (    !(($hdr{"Comment-To"} ne "") ||
                ($hdr{"X-Comment-To"} ne "") ||
                ($hdr{"X-FTN-To"} ne "") ||
                ($hdr{"X-Fidonet-Comment-To"} ne "") ||
                ($hdr{"X-Apparently-To"} ne ""))) {
            my $refs = $hdr{"References"};
            if( $refs ne "" ) {
                my @refs = split(/ /, $refs);
                my $msgid = pop @refs;
                $msgid =~ s/[<>|;\s'"]//g;
                my $fn=`$grephistory \'$msgid\' 2>&1`;
                if( (!($fn =~ /\/dev\/null/)) &&
                    (!($fn =~ /Not found/)) ) {
                    my $orig_from = `$sm $fn`;
                    my @orig_from = grep(/^From:/, split(/\n/, $orig_from));
                    $orig_from = shift @orig_from;
                    $orig_from =~ s/^From:\s*//;
# это должно быть в одну строчку:
                    $orig_from =~ s/^\s*(.+[^\s])\s*<[^\s><"\(\)\@]+\@[^\s>
<"\(\)\@]+>\s*$/$1/;
# это должно быть в одну строчку:
                    $orig_from =~ s/^\s*<{0,1}[^\s><"\(\)\@]+\@[^\s><"\(\)\
@]+>{0,1}\s*\((.+)\)\s*$/$1/;
                    $orig_from =~ s/^"//;
                    $orig_from =~ s/"$//;
                    $hdr{"X-Comment-To"} = $orig_from;
                    $modify_headers = 1;
                    }
                }
        }
    }

    return $rval;
}

sub analyze {
    my ($lines, $quoted, $antiquoted) = (0, 0, 0);
    local $_ = shift;

    do {
        if ( /\G$config{quotere}/mgc ) {
            $quoted++;
        } elsif ( /\G$config{antiquotere}/mgc ) {
            $antiquoted++;
        }
    } while ( /\G(.*)\n/gc && ++$lines );

    return ($lines, $quoted, $antiquoted);
}

Для проверки синтаксиса файлов конфигурации, владельцев файлов и каталогов запустим скрипт /usr/local/news/bin/inncheck, после чего исправьте найденные им ошибки.
Далее запускаем vipw и пользователю news ставим шеллом - /bin/sh. Это пригодится при отладке.
Делаем пробный запуск:

su news -c "/usr/local/news/bin/rc.news start"

Если все ок, то в rc.conf пишем:

innd_enable="YES"
innd_user="news"
innd_group="news"

Настройка inn завершена.

Переходим к настройке fidogate.

Пожалуй самый простой конфиг это fidogate.conf. Там все понятно и с комментариями. Оставляем практически дефолтный, меняем только на свое имя и адрес.

Выложу конфиги, которые могут вызвать затруднения:
[f0s@mail] /usr/local/etc/fido/gate/> cat aliases
# username      FTN address             Full name
# --------      -----------             ---------
f0s             2:550/999.0               "dmitry a. frolov"
f0s             2:550/999.2               "Mail Delivery Subsystem"
f0s             2:550/999.0               "SysOp"
f0s             2:550/999.0               "*"

Здесь указываем правила по которым создаются эхи

[f0s@mail] /usr/local/etc/fido/gate/> cat areas
""                      fido7.                  -8 -H -z 2 -a 2:550/999

Здесь описываем линков, с которых берем фидо-почту и себя:

[f0s@mail] /usr/local/etc/fido/gate/> cat hosts
2:5080/1003     f1003.n5080.z2.fidonet.org.     -p
2:292/854       f854.n292.z2.fidonet.org.       -p
2:550/2         f2.n550.z2.fidonet.org.         -p

Описывем линков с паролями (Очень важно указать "$" в св-вах аплинка, это позволит автосоздавать новые конференции):
[f0s@mail] /usr/local/etc/fido/gate/> cat passwd
af              2:5080/1003     passwd        5       ABC$&%  "areafix"
ff              2:5080/1003     passwd        5       ABC$&%  "filefix"
ff              2:292/854       passwd        5       ABC$&%  "filefix"
af              2:292/854       passwd        5       ABC$&%  "areafix"

С фидогейтом все. Приступаем к установке программы binkd, которая предназначена для передачи фидо-трафика по IP потоколу binkP (24554). Это программа будет получать обычную фидошную почту, после чего fidogate будет ее превращать в news-ы.
[f0s@mail] //> cd /usr/ports/net/binkd/
[f0s@mail] /usr/ports/net/binkd/> make install clean

не забываем добавить в rc.conf:
binkd_enable="YES"

ну и в самом /usr/local/etc/rc.d/binkd я исправил пользователя на news. То есть binkd наш должен работать от пользователя news. Также проверям путь на который ссылается pid, и создаем каталог с парвами для пользователя news.

Теперь можно присутпать к настройке конфига для binkd. Он находится тут: /usr/local/etc/binkd.cfg:
domain fidonet /var/spool/fido/bt/out 2
domain fidonet.org alias-for fidonet
domain fidonet.net alias-for fidonet
domain fidonet.rus alias-for fidonet
domain fido alias-for fidonet
domain fidorus     alias-for fidonet
domain fido7       alias-for fidonet
address 2:550/999
sysname "f2.n550.z2.fidonet.net"
location "St.Petersburg, Russia"
sysop "dmitry a. frolov"
nodeinfo 115200,TCP,BINKP
try 10
hold 600
send-if-pwd
log /var/log/fido/gate/binkd.log
loglevel 4
conlog 4
percents
printq
backresolv
pid-file /var/run/binkd/binkd.pid
inbound /var/spool/fido/bt/pin
inbound-nonsecure /var/spool/fido/bt/in
minfree 2048
minfree-nonsecure 2048
kill-dup-partial-files
kill-old-partial-files 86400
prescan
aso
node 2:292/854 many-glacier.mine.nu password c
node 2:5080/1003 news.cca.usart.ru password c
defnode -nr *

Настройка binkd завершена.
Теперь почти вся настройка гейтования завершена. Почему "почти"? Нам еще нужно сдедать чтобы смогли гейтоваться личные сообщения из фидо (нетмейл). Для этого я приведу примера правки конфига EXIM:
begin routers
# добавляем в секцию routers:
fidonet:
    driver = manualroute
    domains = ! +local_domains
    route_list = *.fidonet.org f2.n550.z2.fidonet.net
    transport = fidogate

# нашу настройку оставляем неизменной
send_to_smart_host:
    driver = manualroute
    route_list = !+local_domains relay.westcall.net
    transport = remote_smtp
    ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8

begin transports
# в транспорты - тоже
fidogate:
    driver = pipe
    command = "/usr/local/libexec/fidogate/rfc2ftn -i ${pipe_addresses}"
    user = news
    group = news

# Доставка на удалённые хосты - по SMTP
remote_smtp:
    driver = smtp

dbmail_delivery:
  driver = pipe
  command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
  message_prefix =
  message_suffix =
  delivery_date_add
  envelope_to_add
  return_path_add
  log_output
  user = mailnull
  group = mail

Проверяем правильность конфиг файла. Для этого делаем:
[f0s@mail] //> exim -bV

Теперь нам надо чтобы все это совместно работало. Добавим в crontab:
# Каждый день выполняем expire (писать все в одну строчку, не поместилось)
30      21      *       *       *       news    /usr/local/news/bin/news.daily \
expireover lowmark delayrm
#
# Каждый день чистим cache inn (писать все в одну строчку, не поместилось)
40      21      *       *       *       news    /usr/local/news/bin/ctlinnd -t 300 \
-s reload incoming.conf "flush cache"
#
# Каждый час постим залежалые в incoming inn-a артикли
1       *       *       *       *       news    /usr/local/news/bin/nntpsend
10      *       *       *       *       news    /usr/local/news/bin/rnews -U
#
# Каждые 10 минут тоссим почту и гейтуем сообщения
*/10    *       *       *       *       news    /usr/local/news/bin/pochta.sh
#
# Каждый день отписываемся от эх без даунлинков
00      22      *       *       *       news    /usr/local/bin/ftnafutil expire
#
# Каждую неделю чистим areas.bbs от отписанных эх (со статусом U)
00      23      *       *       1       news    /usr/local/bin/ftnafutil delete

вот скрипт pochta.sh:
[f0s@mail] //> cat /usr/local/news/bin/pochta.sh
#!/bin/sh
/usr/local/libexec/fidogate/send-fidogate
/usr/local/bin/runinc
/usr/local/bin/runinc -o
cd /var/spool/fido/bt/out
touch 2.5080.1003.0.flo

Проверяем всю работу телнетом:
[f0s@router] /home/f0s/> telnet mail.artpaint nntp
Trying 192.168.10.8...
Connected to mail.artpaint.
Escape character is '^]'.
201 mail.artpaint InterNetNews NNRP server INN 2.4.3 ready (no posting).
# Как мы видим, пока мы не авторизованы. нам доступны только control.*
list active
215 Newsgroups in form "group high low flags".
control.cancel 0000000000 0000000001 n
control.checkgroups 0000000000 0000000001 n
control.newgroup 0000000000 0000000001 n
control.rmgroup 0000000000 0000000001 n
.
# теперь представляемся пользователем shved
authinfo user shved
381 PASS required
authinfo pass MYSUPERPASSWORD
281 Ok
# имя и пароль приняты, теперь мы видим,
# что нам доступны конференции fido7.* на чтение и запись.
list active
215 Newsgroups in form "group high low flags".
fido7.spb.cars 0000000083 0000000001 y
fido7.ccalocal 0000000011 0000000001 y
fido7.ru.linux.chainik 0000000112 0000000001 y
fido7.ru.unix.bsd 0000000039 0000000001 y
.
quit
205 .
Connection closed by foreign host.

Проверка и настройка окончательно завершены. Теперь можем запускать наш любимый newsreader, например Seamonkey (если GUI), или tin (если консольно). Указываем в подключениях наш сервер, порт 119 и вперед :)

Литература:
1) howto.id.ru
2) opennet.ru



размещено: 2008-07-29,
последнее обновление: 2008-08-01,
автор: f0s


)), 2009-05-18 в 16:36:31

Сеанс некрофилии



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1965 секунд
Из них PHP: 85%; SQL: 15%; Число SQL-запросов: 77 шт.
Исходный размер: 58384; Сжатая: 12384