[mx1:/usr/local/etc]#cat rc.d/so-proxy.sh #!/bin/sh # PROVIDE: soproxy # REQUIRE: DAEMON # BEFORE: LOGIN # KEYWORD: nojail shutdown # Подключаем доп. функции . /etc/rc.subr # Имя скрипта name="soproxy" # Значение _enable из rc.conf rcvar=`set_rcvar` # Старт -стоп функции start_cmd="${name}_start" restart_cmd="${name}_restart" stop_cmd="${name}_stop" # Ставим NO, если в rc.conf не задан параметр soproxy_enable="YES" eval "${rcvar}=\${${rcvar}:-"NO"}" soproxy_restart() { echo "restarting sp-proxy" # Запуск спамобороны от имени souser /var/yamail/sp-daemon.sh stop /var/yamail/sp-proxy.sh stop /usr/sbin/chown souser:souser /var/yamail/* /bin/chmod 775 /var/run /usr/bin/chgrp souser /var/run /usr/sbin/chown souser /var/spool/spamooborona /usr/sbin/chown souser /var/spool/spamooborona/* /bin/rm /var/run/sp-* /usr/bin/su souser -c "/var/yamail/sp-daemon.sh start" /usr/bin/su souser -c "/var/yamail/sp-proxy.sh start" echo "sp-proxy restarted" } soproxy_start() { echo "Starting sp-proxy" # Запуск спамобороны от имени souser /var/yamail/sp-daemon.sh stop /var/yamail/sp-proxy.sh stop /usr/sbin/chown souser:souser /var/yamail/* /bin/chmod 775 /var/run /usr/bin/chgrp souser /var/run /usr/sbin/chown souser /var/spool/spamooborona /usr/sbin/chown souser /var/spool/spamooborona/* /bin/rm /var/run/sp-* /usr/bin/su souser -c "/var/yamail/sp-daemon.sh start" /usr/bin/su souser -c "/var/yamail/sp-proxy.sh start" echo "sp-proxy started" } soproxy_stop() { echo "Starting sp-proxy" # Запуск спамобороны от имени souser /var/yamail/sp-daemon.sh stop /var/yamail/sp-proxy.sh stop echo "sp-proxy stoped" } # Загружаем переменные из rc.conf load_rc_config $name run_rc_command "$1" [mx1:/usr/local/etc]#
При этом не забываем добавить пользователя souser c домашкой /var/yamail. У пользователя обязательно должен быть шел, а пароль лучше закоментить. Добавляем в rc.conf
soproxy_enable="YES"
для старта нашего свежеиспеченного скрипта.Запускаем его от рута и проверяем, что получилось
[mx1:/usr/local/etc]#rc.d/so-proxy.sh start [mx1:/usr/local/etc]#ps -aux | grep sp- souser 6697 0,0 0,0 1736 1172 p0 I 11:49 0:00,00 /bin/sh /var/yamail/sp-daemon.sh start souser 6698 0,0 0,0 1736 1176 p0 I 11:49 0:00,00 /bin/sh /var/yamail/sp-daemon.sh start souser 6699 0,0 1,4 85148 43296 p0 S 11:49 2:08,81 /usr/local/sbin/sp-daemon -f -m X-Spam Flag -p /var/run/sp-daemon.sock -i/usr/local/etc/ souser 6706 0,0 0,0 1732 1164 p0 I 11:49 0:00,00 /bin/sh /var/yamail/sp-proxy.sh start souser 6707 0,0 0,0 1732 1172 p0 I 11:49 0:00,00 /bin/sh /var/yamail/sp-proxy.sh start souser 6708 0,0 0,1 4652 2716 p0 S 11:49 0:47,61 /usr/local/sbin/sp-proxy -f -l 1125 -p var/run/sp-daemon.sock root 20449 0,0 0,0 1600 948 p0 S+ 18:39 0:00,00 grep sp- [mx1:/usr/local/etc]#
Теперь все работает от непривелегированного пользователя.не забываем менять владельца файлов на нового пользователя
chown souser:souser /var/yamail/*
Далее эту хрень надо подружить с почтовиком. В моем случае - exim.Перед роутером локальной доставки добавляем
684 #проверяем на спам 685 spam_yandex_route: 686 driver = manualroute 687 transport = spamoborona 688 domains = +local_domains 689 ## no_verify 690 condition = ${if eq {$interface_port}{25}{yes}{no}} 691 #condition=${if !eq {$received_protocol}{local}}" 692 ## address_test = false 693 route_data = localhost 694 self = send
В транспортах описываем транспорт
827 spamoborona: 828 driver = smtp 829 allow_localhost = true 830 port = 1125
И в самом начале аклей добавляем
360 # принимаем с локалхоста без проверки, т.к. с него приходят 361 # проверенные письма с спамобороны, а она не пишет отправителя 362 accept hosts = localhost:127.0.0.1
Теперь логика работы.Если письмо доходит до роутера локальной доставки - это локальное письмо. Соответственно,перед локальной доставкой мы его пересылаем на проверку на локалхост на порт 1125 в спамоборону. Там проверяется на спам и возвращается на локалхост на порт 1025 в экзим. Для него мы не проверяем акли и смотрим, что пришло не с 25 порта в роутерах - значит, письмо от спамобороны - доставляем локально.В заголовках появляется
X-Spam-Yversion: Spamooborona-2.3
Кстати,не забываем в exim указывать, чтоб слушал 1025 порт на локахосте.
local_interfaces = <; [127.0.0.1]:1025; [127.0.0.1]:25; [ваши адреса]
Тестированию поддается так: убираем роутер спамобороны из экзима и заходим телнетом на 1125 порт (это спамоборона) и средствами smtp пытаемся отправить себе письмо. Если все ок, письмо проходит проверку в спамобороне и передается в экзим на 1025 порт для доставки. Если с этим все ок и вы получили письмо, включаем роутер, и экзим начинает перенаправлять все письма на спамоборону.Логи читаем так:
[mx1:/usr/local/etc]#cat /etc/syslog.conf *.* /var/log/all.log .....
Чтоб нормально обновлялся правим /etc/crontab до такого
##-- Spamooborona cron entries start 10 5 * * * souser /usr/local/etc/spamooborona/scripts/cron_spamstat */20 * * * * souser /usr/bin/lockf -st 0 /var/tmp/rsync.so-rules.lock \ /usr/local/etc/spamooborona/scripts/cron_rul 00 09 * * * souser /usr/local/etc/spamooborona/scripts/cron_notify
Штука имеет гуй для настройки
/usr/local/etc/spamooborona/adm_so
или можно покопаться вручную в /usr/local/etc/spamooborona или /var/yamail.Кстати через гую рекомендую настроить глобальную политику обработки спама - я просто помечаю в теме.Так же есть статистика (не забываем ее включить и создать под нее папку)
[mx1:/usr/local/etc]#spamooborona/scripts/statcalc.sh summary at 2008-07-15 08-07-15 00:00:05 - 08-07-16 0 Summary: * 1 (0,00%) * 93 (0,44%) DLVR * 16732 (79,04%) SPAM * 4341 (20,51%) Mail * 1 (0,00%) 17:40:03 * 21168 total [mx1:/usr/local/etc]#
Интересно реализован механазм вайтлистинга. При добавлении в вайтлист письмо все равно проходит через спамобороу и ему присуждается спамовый коэффициент.Реализованы разные алгоритмы на обработку белых листов, в которых просто домен и белых листов, в которых пользователь@домен получатель@домен.если в белом списке найден домен - то минус 3 балла к спамовому весуесли связка получатель - отправитель - то минус 10 балловправила регулируются тут
cat /var/yamail/wl.rul rule FROM_IN_WL R_ALG -10 describe whitelist rule FROM_IN_PERSONAL_WL R_ALG -10 describe personal whitelist rule DOMAIN_IN_WL R_ALG -3 describe domain whitelisted rule DOMAIN_IN_PERSONAL_WL R_ALG -5 describe domain whitelisted personally
По поводу вайтлистинга. У них разные алгоритмы на обработку белых листов, в которых прото домен и белых листов, в которых пользователь@домен получатель@домен.если в белом списке найден домен - то минус 3 балла к спамовому весуесли связка получатель - отправитель - то минус 10 балловправила регулируются тут
Я держу вайтлисты в мускуле сразу на спамоборону и акли. Выглядит это так:В роутерах
#проверяем на спам spam_yandex_route: driver = manualroute transport = spamoborona domains = +local_domains condition = ${if and {{eq {$interface_port}{25}} \ {!match {$h_X-WHITELISTED:}{$sender_address}} }} route_data = localhost self = send
Это при условии, что существуют вайтлисты в аклях и при попадании в вайтлист добавляется заголовок
X-WHITELISTED: $sender_address
Пробовал делать кондишен с выборкой из мускуля, но че-т не получилось, чтоб было два условия, при этом одно из мускуля. В аклях, кстати,тож не получилось. Поэтому вайтлистинг в аклях выглядит так:
# пропускаем падонкав, не умеющих писать отправителя. accept set acl_m1 = ${lookup mysql{SELECT `white_senders` \
FROM `white_senders` WHERE `active`='1' \ AND `white_senders`='$sender_address'}} condition = ${if eq {$acl_m1} {$sender_address}{yes}{no}} hosts = ${lookup mysql{SELECT `hosts` \
FROM `white_senders` WHERE `active`='1' \ AND `white_senders`='$sender_address'}} add_header = X-WHITELISTED: $sender_address logwrite = !message sended by $sender_address - \ [$sender_host_address] - white sender!
Качество работы устроило вполне. Пока из косяков - забраковал 2 daily, но это из-за неправильно настроенных белых листов. В общем, все довольны и счастливы. Процент ложного срабатывания - пока минимальный.Но сразу опишусь, что штука эта комерческая и как она работает внутри - непонятно. Поэтой причине если есть возможность обойтись без нее, я бы посоветовал ее не ставить.