Как поставить Спамооборону 1024 Яндекса на FreeBSD с почтовым агентом exim? Сегодня я вплотную задался этим вопросом. Оказалось, что довольно просто, но и не без особенностей.
Спамооборона.Яндекса - это продукт для фильтрации спама от компании Яндекс. Правила фильтрации составляются на основании огромного количества писем, которое попадает на их почтовые сервера. Поэтому фильтры спама Спамообороны очень точно соответствуют реалиям российского почтового трафика. На самом деле
Спамооборона.Яндекса - это лучший продукт для фильтрации спама, с которым мне приходилось работать.
Профессиональная версия Спамообороны стоит недёшево, однако существует бесплатная версия - Спамооборона 1024. Она подходит для серверов с небольшим количеством почтового трафика - 10000-20000 писем в сутки. Спамооборона 1024 проверяет письма, пока не наберётся 1024 не спамовых письма. После этого она начинает пропускать письма, пока сутки не истекут. Так как спама в среднем 90-95%, это позволяет проверить как раз 10000-20000 писем за день.
Установка Спамообороны 1024 на FreeBSD для exim требует некоторых усилий, потому что в документации описан совершенно верный метод подключения СО к exim, но он предполагает самостоятельную сборку exim. Более удобной же является сборка из портов, о которой и пойдёт речь.
Как это будет работать
Спамооборона 1024 подключается к exim через
local scan. Никаких демонов на сервере устанавливать не требуется. При проверке письма Спамооборона 1024 соединяется с Яндексом по своему протоколу, отправляет туда копию письма и на основании ответа сервера Яндекса устанавливает заголовки X-Spam-Flag и X-Spam-Yversion. Баллы спама добавляются в поле «Subject» письма, если письмо сочтено спамом, например: «[SPAM 27.4] оригинальный сабджект». В X-Spam-Flag указывается только YES или NO. Для того, чтобы иметь возможность настраивать изменение темы письма и видеть баллы в технических заголовках, необходимо воспользоваться
профессиональной версией Спамообороны.
Получение Спамообороны 1024 для exim
В отличие от версий для других почтовых агентов, для которых предоставляются пакеты, для exim необходимо сказать исходник local_scan_1024.c. Для этого на
странице загрузки Спамообороны 1024 необходимо выбрать в списке последний пункт "Исходный код для Unix (exim). Перед скачиванием файла необходимо будет заполнить нехитрую форму для учёта статистики загрузок.
Сборка exim из портов FreeBSD с включением Спамообороны 1024
Документация СО сообщает, что необходимо изменить Local/Makefile при сборке exim. Этого легко добиться, если exim собирается из исходников руками, но для сборки из портов придётся соблюсти определённую последовательность действий:
- cd /usr/ports/mail/exim/;
- make configure;
- правка work/exim-4.69/Local/Makefile в соответствии с документацией СО;
- перегенерация makefile: cd work/exim-4.69/ ; make makefile;
- продолжение сборки и установка: cd /usr/ports/mail/exim/ ; make install;
- создание папки для работы Спамообороны: mkdir -p /var/spool/spamooborona; chown mailnull /var/spool/spamooborona (если exim будет работать от пользователя mailnull).
Но это не всё. Текущая версия порта exim (4.69) заменяет в Local/Makefile опцию LDFLAGS на свою хитровыдуманную DUMMY_LDFLAGS и в дальнейшем использует только её. Так как мы добавляем LDFLAGS в Local/Makefile уже после make configure, наш LDFLAGS не обнаруживается при дальнейшей сборке, и exim с СО не собирается из-за отсутствия подключённых библиотек.
Решения два:
- вместо LDFLAGS прописывать в Local/Makefile опцию DUMMY_LDFLAGS (не лучшее решение);
- добавлять LDFLAGS в качестве аргумента make таким образом: make LDFLAGS+=-lz install (решение, достойное существования).
После этого Спамооборона 1024 успешно включается в exim и может проверять почту.
Проверка успешности сборки
Для того, чтобы проверить, действительно ли СО включена в exim, необходимо выполнить команду:
strings /usr/local/sbin/exim | grep sp-eximЕсли что-то есть, значит, СО включена в бинарник.
Автоматизация сборки
Для автоматической сборки exim со Спамообороной 1024 я написал скриптик:
#!/bin/sh
EXIM_VER=4.69
SO_LOCAL_SCAN=/root/tools/inst-tools/exim/SO/local_scan_1024.c
INSTALL_PREFIX=/usr/local/experimental/exim-so1024/
EXIM_USER=mailnull
OPTS="
PREFIX=$INSTALL_PREFIX
-D WITH_CONTENT_SCAN -D WITHOUT_IPV6
-D WITHOUT_OLD_DEMIME
-D WITHOUT_NIS
"
[ "$1" = "opts" ] && echo $OPTS && exit
cd `dirname $0`
WRKDIR=$PWD
cd /usr/ports/mail/exim
make clean
make $OPTS configure
cat >> work/exim-$EXIM_VER/Local/Makefile
EOF
cp $SO_LOCAL_SCAN work/exim-$EXIM_VER/Local/
cd work/exim-$EXIM_VER
make makefile
cd ../../
make LDFLAGS+=-lz $OPTS -D NO_PKG_REGISTER install
mkdir -p /var/spool/spamooborona
chown $EXIM_USER /var/spool/spamooborona
В скрипте необходимо указать версию exim, префикс для установки, путь до local_scan_1024.c и пользователя exim (для установки прав на /var/spool/spamooborona). Также можно в OPTS перечислить опции порта exim для сборки.
В make install используется -D NO_PKG_REGISTER, чтобы можно было многократно переустанавливать exim без make deinstall && make reinstall и ставить различные его версии в различные префиксы. Правда, тогда exim не будет виден в pkg_info.
Успешной фильтрации спама (со Спамообороной это достигается очень легко :)!