Автор: Сгибнев Михаил
В этом документе описывается, как установить на FreeBSD 7.1 MTA Postfix в связке с ClamAV, Postgrey и Dspam. Основная цель — обеспечить фильтрацию вирусов и спама, транслируя всю продравшуюся сквозь барьеры почту на внутренний почтовый сервер.
Сразу оговорюсь, что я не слишком большой профессионал в создании почтовых систем и некоторые вещи, возможно, сделаны неправильно. Буду рад исправлениям/замечаниям.
Как обычно, обновляем систему и порты:
freebsd-update fetch
freebsd-update install
portsnap fetch
portsnap extract
Из системы портов нам понадобятся:
- /usr/ports/mail/postfix
- /usr/ports/mail/postgrey
- /usr/ports/security/clamav
- /usr/ports/security/clamsmtp
- /usr/ports/mail/dspam — я устанавливал его без поддержки баз данных и без CGI скриптов, но с функцией debug
Запускать dspam будем с правами пользователя dspam, а не root, что предполагается по умолчанию, для чего добавляем в файл /etc/make.conf следущие строки:
DSPAM_OWNER=dspam
DSPAM_GROUP=dspam
DSPAM_HOME_OWNER=dspam
DSPAM_HOME_GROUP=dspam
Создаем пользователя:
pw groupadd dspam
pw useradd dspam -g dspam -s "/sbin/nologin" -c "DSPAM"
Устанавливаем dspam:
cd /usr/ports/mail/dspam
make config
make install
И исправляем права доступа:
chown -R dspam:dspam /var/log/dspam
mkdir /var/run/dspam
chown -R dspam:dspam /var/run/dspam
Все пользователи, для простоты, будут у нас в одной группе. Я исходил из тех соображений, что пользователей много, а вот обучать фильтр придется мне одному и уж лучше делать это сразу для всех скопом.
vi /var/db/dspam/group
globalgroup:shared:*
Сразу устанавливаем права доступа:
chown -R dspam:dspam /var/db/dspam
Устанавливаем остальные пакеты:
cd /usr/ports/mail/postfix
make install
cd /usr/ports/mail/postgrey
make install
cd /usr/ports/security/clamav
make install
cd /usr/ports/security/clamsmtp
make install
И, не теряя времени даром, вносим все это хозяйство в /etc/rc.conf:
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
clamsmtpd_enable="YES"
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
postfix_enable="YES"
postgrey_enable="YES"
dspam_enable="YES"
Мой файл dspam.conf выглядит следующим образом:
# Common
Home /var/db/dspam
StorageDriver /usr/local/lib/libhash_drv.so
ServerMode standard
ServerDomainSocketPath "/var/run/dspam/dspam.sock"
ServerPID /var/run/dspam/dspam.pid
ServerParameters "-deliver=innocent, spam"
ServerIdent "localhost.localdomain"
ClientHost "/var/run/dspam/dspam.sock"
Notifications off
PurgeSignatures 14 # Stale signatures
PurgeNeutral 90 # Tokens with neutralish probabilities
PurgeUnused 90 # Unused tokens
PurgeHapaxes 30 # Tokens with less than 5 hits (hapaxes)
PurgeHits1S 15 # Tokens with only 1 spam hit
PurgeHits1I 15 # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
Debug *
SystemLog on
UserLog on
Opt out
ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse off
MaxMessageSize 307200
Trust dspam
Trust postfix
Trust root
Trust mixa
TrainingMode teft
TestConditionalTraining on
Feature chained
Feature whitelist
Algorithm graham burton
PValue graham
ProcessorBias on
# User
Preference "signatureLocation=headers" # 'message' or 'headers'
Preference "showFactors=on"
Preference "spamAction=tag"
Preference "spamSubject=***SPAM***"
# Hash
HashRecMax 98317
HashAutoExtend on
HashMaxExtents 0
HashExtentSize 49157
HashMaxSeek 100
HashConnectionCache 10
# Inject mail into postfix
DeliveryHost 127.0.0.1
DeliveryPort 10026
DeliveryIdent localhost
DeliveryProto SMTP
Приступаем к настройке Postfix. Кроме дефолтных настроек, уже находящихся в main.cf, я добавил следущее:
transport_maps = hash:/usr/local/etc/postfix/transport
relay_domains = hash:/usr/local/etc/postfix/relay_domains
virtual_transport = hash:/usr/local/etc/postfix/transport
# =============== DSPAM =====================
dspam_destination_recipient_limit = 1
# =============== DSPAM =====================
local_recipient_maps =
local_transport = local
strict_mime_encoding_domain = yes
disable_vrfy_command = yes
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net,
permit_mynetworks,
check_client_access regexp:/usr/local/etc/postfix/dul_checks,
permit
smtpd_helo_required = yes
smtpd_helo_restriction = permit_mynetworks,
check_helo_access regexp:/usr/local/etc/postfix/helo_regexp
smtpd_recipient_restrictions = reject_unauth_pipelining,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unauth_destination,
reject_invalid_hostname,
reject_non_fqdn_hostname,
check_sender_mx_access cidr:/usr/local/etc/postfix/mx_access.cidr,
# =============== DSPAM =====================
check_client_access pcre:/usr/local/etc/postfix/dspam_filter_access,
# =============== DSPAM =====================
check_policy_service inet:127.0.0.1:10023
# =============== ClamAv =====================
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
# =============== ClamAv =====================
Я не стал связывать между собой ClamAV и Dspam, так как на некоторых форумах встречал сообщения о том, что работа связки бывает нестабильной.
Мой transport:
dreamcatcher.ru smtp:[10.1.5.62]
Так как обучать антиспам я обучать буду путем отправки писем, содержащих спам, на почтовый ящик spam@mail.dreamcatcher.ru, то мой relay_domains выглядит следующим образом:
dreamcatcher.ru OK
mail.dreamcatcher.ru OK
Внимание! Вместо обратной пересылки писем на сервер я сейчас просто забираю письма из почтового ящика postmaster с помощью mutt.
Это связано с тем, что Lotus Notes при пересылке откусывает заголовки DSPAM. Эту проблему я пока не решил.
По рекомендациям профессионалов используются фильтры:
dul_checks
/([0-9]*-){3}[0-9]*(\..*){2,}/i 553 SPAM_ip-add-rr-ess_networks
/([0-9]*\.){4}(.*\.){3,}.*/i 553 SPAM_ip-add-rr-ess_networks
/.*\..*\...\.comcast\.net/i 553 SPAM_comcast-net
/.*yahoobb.*\.bbtec\.net/i 553 SPAM_yahoobb_bbtec-net
/[0-9]{12}\.bbtec\.net/i 553 SPAM_host_bbtec-net
/.*\.broadband\.hu/i 553 SPAM_broadband-hu
/client.*\..*\..*/i 553 SPAM_CLIENT
/cable.*\..*\..*/i 553 SPAM_CABLE
/pool.*\..*\..*/i 553 SPAM_POOL
/dial.*\..*\..*/i 553 SPAM_DIAL
/ppp.*\..*\..*/i 553 SPAM_PPP
/dslam.*\..*\..*/i 553 SPAM_DSLAM
/dhcp.*\..*\..*/i 553 SPAM_DHCP
/[\.-]dsl.*\..*\..*/i 553 SPAM_DSL
/[ax]dsl.*\..*\..*/i 553 SPAM_XDSL
/.*([0-9]*\.){4}cableonline\.com\.mx/i 553 SPAM_IP-cableonline-com-mx
/.*\.([0-9]*\.){4}ip\.holtonks\.net/i 553 SPAM_ip-holtonks-net
/([0-9]*-){3}[0-9]*\.fibertel\.com\.ar/i 553 SPAM_IP-fibertel-com-ar
/.*[0-9]*-[0-9]*\.fibertel\.com\.ar/i 553 SPAM_IP-fibertel-com-ar
/[0-9]*\.user\.veloxzone\.com\.br/i 553 SPAM_user-veloxzone-com-br
/[0-9]*\.customer\.alfanett\.no/i 553 SPAM_customer-alfanett-no
/.*([0-9]*-){3}[0-9]*\.telecom\.net\.ar/i 553 SPAM_host-telecom-net-ar
/.*(-[0-9]*){2}\.telpol\.net\.pl/i 553 SPAM_host-telpol-net-pl
/(.*\.){2}maxonline\.com\.sg/i 553 SPAM_host-maxonline-com-sg
/(.*-){2}.*\.fairgamemail\.us/i 553 SPAM_host-fairgamemail-us
/[0-9]*[0-9]*-\.wispnet\.net/i 553 SPAM_host-wispnet-net
/.*-.*(\..*){2}\.ne\.jp/i 553 SPAM_host-ne-jp
/[0-9]*\..*\.ne\.jp/i 553 SPAM_h09t-ne-jp
/(.*\.){3}ad\.jp/i 553 SPAM_host-ad-jp
/(.*\.){4}revip\.asianet\.co\.th/i 553 SPAM_revip-asianet-co-th
/[0-9]*\..*\.virtua\.com\.br/i 553 SPAM_host-virtua-com-br
/([0-9]*-){3}[0-9]*\.exatt\.net/i 553 SPAM_host-exatt-net
/([0-9]*\.){4}ip\.alltel\.net/i 553 SPAM_host-ip-alltel-net
/[0-9]{6,}\.chello\.../i 553 SPAM_host-chello
/.*[0-9]*\..*\.chello\.../i 553 SPAM_host-chello-xx
/.*\..*\.t-dialin\.net/i 553 SPAM_t-dialin-net
/.*\..*\.t-ipconnect\.de/i 553 SPAM_t-ipconnect-de
/([0-9]*-){2,3}[0-9]*\..*\.cgocable\.net/i 553 SPAM_host-cgocable-net
/.*\..*\.shawcable\.net/i 553 SPAM_host-shawcable-net
/p[0-9]*\.mp[0-9]*\.aaanet\.ru/i 553 SPAM_aaa_modem_pool
/([0-9]*-){2}[0-9]*\.ip\.adsl\.hu/i 553 SPAM_ip-adsl-hu
/([0-9]{1,3}\.){2}broadband4\.iol\.cz/i 553 SPAM_broadband-iol-cz
helo_regexp
/([0-9]{1,3}(\.|-)){3}[0-9]{1,3}/i REJECT IP-able helo SPAM
mx_access.cidr
10.0.0.0/8 REJECT Domain MX in RFC 1918 private network
172.16.0.0/12 REJECT Domain MX in RFC 1918 private network
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network
127.0.0.0/8 REJECT Domain MX in loopback network
224.0.0.0/4 REJECT Domain MX in class D multicast network
240.0.0.0/5 REJECT Domain MX in class E reserved network
248.0.0.0/5 REJECT Domain MX in reserved network
0.0.0.0/8 REJECT 010 Domain MX in broadcast network
169.254.0.0/16 REJECT 020 Domain MX in link local network
dspam_filter_access
/./ FILTER dspam:dspam
master.cf
# AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
# DSPAM
dspam unix - n n - 10 pipe
flags=Ru user=dspam argv=/usr/local/bin/dspam
--deliver=innocent --user ${recipient} -i -f $sender
-- $recipient
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
Для проверки можно использовать следущие команды:
telnet mail.dreamcatcher.ru 25
HELO test.com
MAIL FROM: mixa@test.com
RCPT TO: mixa@www2.dreamcatcher.ru
DATA
From: mixa@test.com
To: mixa@www2.dreamcatcher.ru
Test
.
Внимание! Вместо обратной пересылки писем на сервер я сейчас просто забираю письма из почтового ящика postmaster с помощью mutt.
Это связано с тем, что Lotus Notes при пересылке откусывает заголовки DSPAM. Эту проблему я пока не решил. После сохранения писем в локальном каталоге пользователя, учу фильтр командой:
dspam_train mixa /home/mixa/Spam /home/mixa/NoSpam
Буду рад предложениям и замечаниям, чтобы улучшить эту статью на msgibnev(ого-го какая собака)gmail.com
Ссылки по теме:
http://woland.pl.ua/399-dspam-ustanovka-i-nastroyka/
http://www.samag.ru/art/07.2005/07.2005_09.html
http://demon.yekt.com/3.html
http://switch.richard5.net/isp-in-a-box-v2/setting-up-dspam/configure-postfix-for-the-dspam-content-filter/
Реклама на сайте висит не просто так! Спасибо!