|
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:
ну и в самом /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
| Проверяем правильность конфиг файла. Для этого делаем:
Теперь нам надо чтобы все это совместно работало. Добавим в 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
|
|
Комментарии пользователей [1 шт.]