На моем узле установлена FreeBSD и MTA Exim.
В один прекрасный момент количество получаемого спама увеличилось настолько, что просто не обращать на него внимание стало невозможно. Тут-то и начались поиски солюшенов.
Spamassassin меня не совсем устроил. Особенно процесс установки Perl пакетов :-)))
Зато DSPAM понравился целиком и полностью.
Итак. Устанавливаем DSPAM.
Скачиваем с оригинального сайта — Nuclear Elephant: The DSPAM Project
Распаковываем: tar xvzf dspam-3.8.0.tar.gz
Конфигуряем с использованием mySQL
./configure \ --enable-neural-networking \ --disable-bias \ --with-storage-driver=mysql_drv \ --with-mysql-includes=/usr/local/include \ --with-mysql-libraries=/usr/local/lib \ --enable-debug \ --with-dspam-home-owner=exim \ --with-dspam-group=mail \ --with-delivery-agent=/usr/local/sbin/exim \ --with-quarantine-agent=/usr/local/sbin/exim \ --enable-experimental \ --enable-domain-scale
Если вы используете «виртуальных пользователей», то необходимо добавить
—enable-virtual-users
Далее запускаем make && make install
Готово! DSPAM установлен!
Теперь приступим к конфигурированию Exim и DSPAM.
Для начала необходимо создать БД и пользователя в mySQL
Непременно используйте InnoDB сторидж во избежание отвала в корку mysql, либо повреждения базы данных!
admin@localhost#> mysqladmin -uroot -p create dspam admin@localhost#> mysql -uroot -p dspam < tools.mysql.drv/mysql_objects-4.1.sql admin@localhost#> mysql -uroot -p dspam < tools.mysql.drv/virtual_users.sql admin@localhost#> mysql -uroot -p dspam mysql> grant all on dspam.* to dspam@localhost identified by 'пароль'; mysql> exit
С БД на этом покончено.
Далее необходимо сконфигурить екзим. Я взял стандартные роутеры и транспорты из wiki дспама. Работает. Итак:
Запихиваем в конфиг экзима сразу после userforward router следующее:
dspam_router: no_verify check_local_user # When to scan a message : # - it isn't already flagged as spam from Spamassassin # - it isn't already flagged as spam from DSPAM # - it isn't already scanned # - it isn't local # - it isn't from one internal domain user to another # - it is less than 512k in size condition = "${if and { \ {!def:h_X-Spam-Flag:} \ {!def:h_X-FILTER-DSPAM:} \ {!eq {$received_protocol}{local}} \ { <= {$message_size}{512k}} \ }\ {1}{0}}" headers_add = "X-FILTER-DSPAM: by $primary_hostname on $tod_full" driver = accept transport = dspam_spamcheck # Which users to run dspam for. #local_parts = /usr/local/etc/exim/dspam-testers dspam_addspam_router: driver = accept local_part_prefix = spam- transport = dspam_addspam dspam_falsepositive_router: driver = accept local_part_prefix = nospam- transport = dspam_falsepositive
В транспорты пихаем этот текст
dspam_spamcheck: driver = pipe command = "/usr/local/bin/dspam --deliver=innocent --user ${lc:$local_part} -f \ '$sender_address' -- %u" home_directory = "/tmp" current_directory = "/tmp" user = exim group = mail log_output = true return_fail_output = true return_path_add = false message_prefix = message_suffix = dspam_addspam: driver = pipe command = "/usr/local/bin/dspam --class=spam --source=error --user \ ${lc:$local_part} -f '$sender_address' -- %u" home_directory = "/tmp" current_directory = "/tmp" user = exim group = mail log_output = true return_fail_output = true return_path_add = false message_prefix = message_suffix = dspam_falsepositive: driver = pipe command = "/usr/local/bin/dspam --class=innocent --source=error \ --deliver=innocent,spam --user ${lc:$local_part}\ -f '$sender_address' -- %u" home_directory = "/tmp" current_directory = "/tmp" user = exim group = mail log_output = true return_fail_output = true return_path_add = false message_prefix = message_suffix =
Естественно, не забываем исправить user и group под реальное положение дел :-)
Запускаем, проверяем.
Если при доставке почты получаем что-то, вроде
Child process of address_pipe transport returned 127 (could mean unable to exec or command does not exist) from command: /usr/local/bin/dspam
значит exim не может запустить /usr/local/bin/dspam, поскольку пермишн a+x у запускаемого отсутствует. Ставим, проверяем снова.
Затем проводим обучение системы, пересылая спамовые письма на адрес spam-ваш_ящик@ваш.домен и неспамовые на nospam-ваш_ящик@ваш.домен.
Поскольку юзеры зело ленивы, можно сделать спам-фильтр не индивидульным для каждого ящика, а общим, для всей системы. Возможно это съэкономит вам несколько миллионов нераных клеток, и несколько миллиардов байт на жестком диске :-)
И в любом юзерском почтаре выцепляем хидеры, по которым решаем, что делать с данным письмом — сразу в корзину, или похранить немного. Хотя, в принципе, dspam может сам удалять спамовые письма, но я ему не доверяю :-D
X-Spam-Score: 5.8 (+++++) X-Spam-Report: Spam detection software, running on the system "mx.myhost.com", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see postmaster@myhost.com for details. Content preview: XXXXXXXXXXX XXXXXXXX X X X X X X X X XXXXXX! XXXXXXXXXX! XXXXXXX! XXXXXX XXXXXXX XXXXXX. XXXXXXXX XX XXXXXXX. XXX (495) 6 4 . 8 4 . 4 3 2 [...] Content analysis details: (5.8 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.4 SPF_HELO_FAIL SPF: HELO does not match SPF record (fail) [SPF failed: Please see http://www.openspf.org/why.html?sender=ocn.ne.jp&ip=221.189.3.135&receiver=sunrise.sgpi.kz] 0.8 HTML_FONT_FACE_CAPS BODY: HTML font face has excess capital characters 0.0 HTML_MESSAGE BODY: HTML included in message 0.2 HTML_FONT_BIG BODY: HTML tag for a big font size 1.8 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in bl.spamcop.net [Blocked - see ] 2.5 RCVD_IN_XBL RBL: Received via a relay in Spamhaus XBL [221.189.3.135 listed in sbl-xbl.spamhaus.org] X-Spam-Flag: YES
На этом заканчиваю. Будут вопросы — пишите.