267 lines
13 KiB
XML
267 lines
13 KiB
XML
<?xml version="1.0" encoding="koi8-r"?>
|
||
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN"
|
||
"../../../share/xml/freebsd45.dtd">
|
||
|
||
<!--
|
||
The FreeBSD Russian Documentation Project
|
||
|
||
$FreeBSD$
|
||
$FreeBSDru: frdp/doc/ru_RU.KOI8-R/articles/relaydelay/article.xml,v 1.2 2007/05/15 19:31:54 gad Exp $
|
||
|
||
Original revision: r32632
|
||
-->
|
||
|
||
<article lang="ru">
|
||
<articleinfo>
|
||
<title>Использование технологии серых списков во &os;</title>
|
||
|
||
<author>
|
||
<firstname>Том</firstname>
|
||
|
||
<surname>Родес</surname>
|
||
|
||
<affiliation>
|
||
<address><email>trhodes@FreeBSD.org</email></address>
|
||
</affiliation>
|
||
</author>
|
||
|
||
<copyright>
|
||
<year>2004</year>
|
||
|
||
<holder>The &os; Documentation Project</holder>
|
||
</copyright>
|
||
|
||
<pubdate>$FreeBSD$</pubdate>
|
||
|
||
<releaseinfo>$FreeBSD$</releaseinfo>
|
||
|
||
<abstract>
|
||
<para>Эта статья создана исключительно для описания технологии задержки
|
||
передачи сообщений на почтовом сервере &os;. Сервер с технологией
|
||
задержки передачи (relaydelay) или попаданием в серый список
|
||
(greylisting) снижает уровень спама просто за счёт выдачи
|
||
диагностического сообщения <errorname>TEMPFAIL</errorname> на каждое
|
||
входящее почтовое сообщение. Смысл этой технологии заключается в том,
|
||
что большинство спамеров для выполнения своей работы используют
|
||
собственные персональные компьютеры и специализированное программное
|
||
обеспечение. Настоящий почтовый сервер должен помещать сообщения в
|
||
очередь и пытаться доставить его позже. Таким образом, скорее всего,
|
||
спамер перейдёт к следующему хосту вместо того, чтобы попытаться снова
|
||
послать электронное послание. Это прекрасная идея; по крайней мере,
|
||
до тех пор, пока спамеры не начнут использовать программное
|
||
обеспечение, которое будет обеспечивать повтор передачи. Но как именно
|
||
это работает? Итак, в процессе приёма сообщения электронной почты
|
||
<acronym>ID</acronym> сообщения сохраняется в базе данных, а в качестве
|
||
результата возвращается <errorname>TEMPFAIL</errorname> вместе с
|
||
электронной почтой. Если сообщение электронной почты посылается
|
||
повторно, то <acronym>ID</acronym> сообщения будет сверяться с
|
||
<acronym>ID</acronym> сообщений, сохранёнными в базе данных. Если в
|
||
базе данных оно существует, то посланию электронной почты разрешается
|
||
доставка по назначению. В противном случае <acronym>ID</acronym>
|
||
сохраняется, а в качестве результата возвратится
|
||
<errorname>TEMPFAIL</errorname>. Этот цикл будет повторяться для
|
||
каждого сообщения, поступающего на сервер. По моему личному опыту,
|
||
это действительно отсекает 90% спама.</para>
|
||
</abstract>
|
||
</articleinfo>
|
||
|
||
<sect1>
|
||
<title>Базовая настройка</title>
|
||
|
||
<para>Нам потребуется <command>perl</command> с поддержкой многопоточного
|
||
выполнения. Установите <filename role="package">lang/perl5.8</filename>
|
||
с установленной переменной <makevar>USE_THREADS=yes</makevar>. Сначала
|
||
может потребоваться удалить текущую версию <command>perl</command>; на
|
||
необходимость сделать это укажут ошибки в процессе установки.</para>
|
||
|
||
<note>
|
||
<para>При этом потребуется, чтобы все порты, которым нужен
|
||
<command>perl</command>, были перестроены и переустановлены;
|
||
<filename role="package">ports-mgmt/portupgrade</filename> хорошо для
|
||
этого подходит. По крайней мере, он укажет, какие порты были удалены и
|
||
какие необходимо переустановить.</para>
|
||
</note>
|
||
|
||
<para>Теперь что касается сервера базы данных;
|
||
<application>MySQL</application> прекрасно подходит для такого типа
|
||
работы. Установите <filename
|
||
role="package">databases/mysql40-server</filename> вместе с <filename
|
||
role="package">databases/p5-DBD-mysql40</filename>. Предыдущий порт
|
||
должен подразумевать установку <filename
|
||
role="package">databases/p5-DBI-137</filename>, так что один шаг будет
|
||
пропущен.</para>
|
||
|
||
<para>Установите переносимый подключаемый серверный модуль на базе
|
||
<command>perl</command>, порт <filename
|
||
role="package">net/p5-Net-Daemon</filename>. Большинство установок этих
|
||
портов должны проходить без проблем. Следующий шаг будет более
|
||
трудоёмким.</para>
|
||
|
||
<para>Теперь установите порт <filename
|
||
role="package">mail/p5-Sendmail-Milter</filename>. На момент написания
|
||
этого документа в файле <filename>Makefile</filename> имелась строка,
|
||
начинающаяся с <makevar>BROKEN</makevar>, просто уберите или
|
||
закомментируйте её. Она помечена так лишь потому, что в &os; по
|
||
умолчанию не включался и не устанавливался пакет <command>perl</command>
|
||
с поддержкой многопоточного выполнения. После удаления этой строки он
|
||
должен строиться и устанавливаться без ошибок.</para>
|
||
|
||
<para>Создайте каталог для размещения временных конфигурационных
|
||
файлов:</para>
|
||
|
||
<screen>&prompt.root; <userinput>mkdir /tmp/relaydelay</userinput>
|
||
&prompt.root; <userinput>cd /tmp/relaydelay</userinput></screen>
|
||
|
||
<para>Теперь, когда у нас имеется временный каталог для работы, команде
|
||
<command>fetch</command> нужно передать следующие
|
||
<acronym>URL</acronym>-адреса:</para>
|
||
|
||
<screen>&prompt.root; <userinput>fetch http://projects.puremagic.com/greylisting/releases/relaydelay-0.04.tgz</userinput>
|
||
&prompt.root; <userinput>fetch http://lists.puremagic.com/pipermail/greylist-users/attachments/20030904/b8dafed9/relaydelay-0.04.bin</userinput></screen>
|
||
|
||
<!-- ЗАМЕЧАНИЕ ДЛЯ ТОМА РОДЕСА: РАЗМЕЩАТЬ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ЗДЕСЬ
|
||
ЯВЛЯЕТСЯ ПЛОХОЙ ИДЕЕЙ НА ТОТ СЛУЧАЙ, ЕСЛИ КАКОЙ-НИБУДЬ МУДАК ЗАМЕНИТ
|
||
ЕГО. НАВЕРНОЕ, Я ДОЛЖЕН ЗААРХИВИРОВАТЬ СКРИПТЫ И ОСТАЛЬНУЮ ШНЯГУ. -->
|
||
|
||
<para>Теперь необходимо распаковать исходный код:</para>
|
||
|
||
<screen>&prompt.root; <userinput>gunzip -c relaydelay-0.04.tgz | tar xvf -</userinput></screen>
|
||
|
||
<para>На этот момент во временном каталоге должно оказаться несколько
|
||
файлов. Теперь необходимая информация может передаваться серверу базы
|
||
данных импортированием её из файла <filename>mysql.sql</filename>:</para>
|
||
|
||
<screen>&prompt.root; <userinput>mysql < relaydelay-0.04/mysql.sql</userinput></screen>
|
||
|
||
<para>Установите патч <filename>relaydelay.bin</filename> для остальных
|
||
файлов, запустив такую команду:</para>
|
||
|
||
<screen>&prompt.root; <userinput>patch -d /tmp/relaydelay/relaydelay-0.04 < relaydelay.bin</userinput></screen>
|
||
|
||
<para>Отредактируйте файлы <filename>relaydelay.conf</filename> и
|
||
<filename>db_maintenance.pl</filename>, добавив в них корректное имя
|
||
пользователя и пароль для СУБД <application>MySQL</application>. Если
|
||
СУБД была построена и установлена так, как описано выше, то в ней
|
||
отсутствуют пользователи и пароли. Эта ситуация должна быть исправлена
|
||
до перевода системы в промышленную эксплуатацию, что описано в
|
||
документации к СУБД и выходит за рамки данной статьи.</para>
|
||
|
||
<para>Смените рабочий каталог на <filename
|
||
class="directory">relaydelay-0.04</filename>:</para>
|
||
|
||
<screen>&prompt.root; <userinput>cd relaydelay-0.04</userinput></screen>
|
||
|
||
<para>Скопируйте или переместите конфигурационные файлы в соответствующие
|
||
каталоги:</para>
|
||
|
||
<screen>&prompt.root; <userinput>mv db_maintenance.pl relaydelay.pl /usr/local/sbin</userinput>
|
||
&prompt.root; <userinput>mv relaydelay.conf /etc/mail</userinput>
|
||
&prompt.root; <userinput>mv relaydelay.sh /usr/local/etc/rc.d/</userinput></screen>
|
||
|
||
<para>Протестируйте получившуюся конфигурацию, выполнив такую
|
||
команду:</para>
|
||
|
||
<screen>&prompt.root; <userinput>sh /usr/local/etc/rc.d/relaydelay.sh start</userinput></screen>
|
||
|
||
<note>
|
||
<para>Этот файл не будет существовать, если предыдущие команды &man.mv.1;
|
||
не были выполнены.</para>
|
||
</note>
|
||
|
||
<para>Если всё отработало корректно, то в каталоге <filename
|
||
class="directory">/var/log</filename> должен появиться новый файл,
|
||
<filename>relaydelay.log</filename>. В нём должен находиться текст,
|
||
подобный следующему:</para>
|
||
|
||
<programlisting>Loaded Config File: /etc/mail/relaydelay.conf
|
||
Using connection 'local:/var/run/relaydelay.sock' for filter relaydelay
|
||
DBI Connecting to DBI:mysql:database=relaydelay:host=localhost:port=3306
|
||
Spawned relaydelay daemon process 38277.
|
||
Starting Sendmail::Milter 0.18 engine.</programlisting>
|
||
|
||
<para>Если файл не появился, то что-то сработало неправильно, пересмотрите
|
||
экранную диагностику или просмотрите журнальный файл
|
||
<filename>messages</filename> на предмет появления новой
|
||
информации.</para>
|
||
|
||
<para>Объедините всё вместе, добавив следующую строку в файл
|
||
<filename>/etc/mail/sendmail.mc</filename> или специфичный для вашей
|
||
системы <filename>mc</filename>-файл:</para>
|
||
|
||
<programlisting>INPUT_MAIL_FILTER(`relaydelay', `S=local:/var/run/relaydelay.sock, T=S:1m;R:2m;E:3m')dnl</programlisting>
|
||
|
||
<para>Перестройте и переустановите файлы в каталоге
|
||
<filename>/etc/mail</filename> и перезапустите
|
||
<command>sendmail</command>. Короткая команда <command>make</command>
|
||
<maketarget>restart</maketarget> должна сделать всё необходимое.</para>
|
||
|
||
<para>Сгрузите скрипт на языке <command>perl</command>, размещённый по
|
||
адресу <ulink url="http://lists.puremagic.com/pipermail/greylist-users/2003-November/000327.html">http://lists.puremagic.com/pipermail/greylist-users/2003-November/000327.html</ulink>
|
||
и сохраните его в каталог <filename
|
||
class="directory">relaydelay-0.04</filename>. В следующем примере этот
|
||
скрипт обозначается как <filename>addlist.pl</filename>.</para>
|
||
|
||
<para>Отредактируйте файл <filename>whitelist_ip.txt</filename>,
|
||
модифицировав его так, чтобы в него были включены
|
||
<acronym>IP</acronym>-адреса серверов, которые должны иметь возможность
|
||
игнорировать фильтры <application>relaydelay</application>. То есть это
|
||
домены, при получении электронной почты от которых диагностическое
|
||
сообщение <errorname>TEMPFAIL</errorname> выдаваться не будет.</para>
|
||
|
||
<para>Как пример можно привести:</para>
|
||
|
||
<programlisting>192.168. # My internal network.
|
||
66.218.66 # Yahoo groups has unique senders.</programlisting>
|
||
|
||
<para>Файл <filename>blacklist_ip.txt</filename> должен иметь похожее
|
||
назначение, но с обратными правилами. Укажите в этом файле
|
||
<acronym>IP</acronym>-адреса, которые должны отвергаться без выдачи
|
||
диагностического сообщения <errorname>TEMPFAIL</errorname>. Этот
|
||
перечень доменов никогда не получит даже возможность сообщить о том, что
|
||
они являются реально существующими почтовыми серверами.</para>
|
||
|
||
<para>Эти файлы теперь должны быть импортированы в базу данных посредством
|
||
скрипта <filename>addlist.pl</filename>, который был получен несколькими
|
||
строками выше:</para>
|
||
|
||
<screen>&prompt.root; <userinput>perl addlist.pl -whitelist 9999-12-31 23:59:59 < whitelist_ip.txt</userinput>
|
||
&prompt.root; <userinput>perl addlist.pl -blacklist 9999-12-31 23:59:59 < blacklist_ip.txt</userinput></screen>
|
||
|
||
<para>Для включения технологии <application>relaydelay</application> при
|
||
каждой загрузке системы, добавьте строчку
|
||
<option>relaydelay_enable="YES"</option> в файл
|
||
<filename>/etc/rc.conf</filename>.</para>
|
||
|
||
<para>Журнальный файл <filename>/var/log/relaydelay.log</filename> должен
|
||
постепенно пополняться удачными прохождениями. В зависимости от загрузки
|
||
вашего почтового сервера, вскоре должны появиться строчки, подобные
|
||
следующим.</para>
|
||
|
||
<programlisting>=== 2004-05-24 21:03:22 ===
|
||
Stored Sender: <someasshole@flawed-example.com>
|
||
Passed Recipient: <local_user@pittgoth.com>
|
||
Relay: example.net [XXX.XX.XXX.XX] - If_Addr: MY_IP_ADDRESS
|
||
RelayIP: XX.XX.XX.XX - RelayName: example.net - RelayIdent: - PossiblyForged: 0
|
||
From: someasshole@flawed-example.com - To: local_user
|
||
InMailer: esmtp - OutMailer: local - QueueID: i4P13Lo6000701111
|
||
Email is known but block has not expired. Issuing a tempfail. rowid: 51
|
||
IN ABORT CALLBACK - PrivData: 0<someasshole@flawed-example.com></programlisting>
|
||
|
||
<para>В файл <filename>/etc/newsyslog.conf</filename> теперь можно добавить
|
||
следующую строку, которая обеспечивает ротацию журналов
|
||
<filename>relaydelay.log</filename> при достижении размера в 100
|
||
<acronym>Кбайт</acronym>:</para>
|
||
|
||
<screen>/var/log/relaydelay.log 644 3 100 * Z</screen>
|
||
|
||
<!-- XXX К какому тексту относится это замечание? -->
|
||
<note>
|
||
<para>В какой-то момент появлялась ошибка о неполном определении
|
||
переменных <command>perl</command> в файле
|
||
<filename>/etc/mail/relaydelay.conf</filename>. Если те две переменные
|
||
раскомментированы, то конфигурационный файл может быть обработан
|
||
нормально. Просто не забудьте убрать их из комментариев до того, как
|
||
начать работу с технологией <command>relaydelay</command>.</para>
|
||
</note>
|
||
</sect1>
|
||
</article>
|