Почтовый сервер в связке Postfix, Courier-IMAP
При установке будем ориентироваться на наш любимый мануал: http://www.sys-adm.org.ua/mail/mail-howto-p1
Настройку будем производить для сервера с одним доменом. Система FreeBSD 9.0
1. Начинаем со стандартной связки Apache, MySQL, PHP, PHP-extension
# cd /usr/ports/www/apache22 # make install
# cd /usr/ports/databases/mysql55-server # make install
# cd /usr/ports/lang/php52 # make install
# cd /usr/ports/lang/php52-extensions # make install
После установки MySQL сразу придумываем имя БД, пользователя и пароль, т.к. использоваться они будут в конфигах, до того как будет создана БД.
2. Устанавливаем Openssl. Он нужен для генерации сертификатов/ключей, а также для поддержки SSL/TLS:
# cd /usr/ports/security/openssl/ # make install
3. Теперь ставим Cyrus-Sasl. Эта библиотека будет использоваться для SMTP-аутентификации, т.е. проверки логина/пароля по некоторому алгоритму, например PLAIN, LOGIN, CRAM-MD5:
# cd /usr/ports/security/cyrus-sasl2/ # make install
Выбираем нужное: MYSQL, LOGIN, PLAIN, CRAM, DIGEST
4. Собираем и настраиваем Courier-authlib, эту библиотеку Courier-IMAP использует для аутентификации пользователей.
# cd /usr/ports/security/courier-authlib/ # make install
Выбираем нужное: AUTH-MYSQL
Для автозапуска authdaemond прописываем в /etc/rc.conf:
courier_authdaemond_enable="YES"
Рихтуем конфиги:
[/usr/local/etc/authlib/authdaemonrc] authmodulelist="authmysql" authmodulelistorig="authmysql" daemons=5 authdaemonvar=/var/run/authdaemond subsystem=mail DEBUG_LOGIN=2 DEFAULTOPTIONS="wbnodsn=1" LOGGEROPTS=""
[/usr/local/etc/authlib/authmysqlrc] MYSQL_SERVER localhost MYSQL_DATABASE postfix MYSQL_USERNAME postfix MYSQL_PASSWORD postfix MYSQL_PORT 3306 MYSQL_OPT 0 MYSQL_CHARACTER_SET utf8 MYSQL_USER_TABLE mailbox #MYSQL_CRYPT_PWFIELD crypt MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD '1981' MYSQL_GID_FIELD '1981' MYSQL_LOGIN_FIELD username MYSQL_HOME_FIELD '/var/spool/mail' MYSQL_NAME_FIELD name MYSQL_MAILDIR_FIELD maildir MYSQL_QUOTA_FIELD quota MYSQL_WHERE_CLAUSE active='1'
Обращаем внимание на значения полей MYSQL_UID_FIELD и MYSQL_GID_FIELD, здесь необходимо указывать uid и gid пользователя и группы virtual соответственно.
Если MySQL запускается на той же машине, что и courier-authlib можно использовать сокет, вместо указания порта и имени сервера. При этом не нужно инициализировать MYSQL_SERVER/MYSQL_PORT.
Стартуем authdaemond:
# /usr/local/etc/rc.d/courier-authdaemond start Starting courier_authdaemond.
Если всё нормально, в логе должно быть:
Apr 27 15:09:48 test authdaemond: modules="authmysql", daemons=5 Apr 27 15:09:48 test authdaemond: Installing libauthmysql Apr 27 15:09:48 test authdaemond: Installation complete: authmysql
5. Переходим к настройке courier-imap.
# cd /usr/ports/mail/courier-imap/ # make install
Выбираем нужное: TRASHQUOTA, AUTH-MYSQL
Рихтуем конфиги:
[/usr/local/etc/courier-imap/pop3d] PIDFILE=/var/run/pop3d.pid MAXDAEMONS=40 MAXPERIP=5 POP3AUTH="PLAIN LOGIN CRAM-MD5" POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5" POP3AUTH_TLS="PLAIN LOGIN CRAM-MD5" POP3AUTH_TLS_ORIG="PLAIN LOGIN CRAM-MD5" POP3_PROXY=0 PORT=110 ADDRESS=192.168.0.10 TCPDOPTS="-nodnslookup -noidentlookup" LOGGEROPTS="-name=courier-imap" POP3DSTART=YES MAILDIRPATH=Maildir
[/usr/local/etc/courier-imap/imapd] ADDRESS=0 PORT=143 MAXDAEMONS=40 MAXPERIP=5 PIDFILE=/var/run/imapd.pid TCPDOPTS="-nodnslookup -noidentlookup" LOGGEROPTS="-name=imapd" IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE" IMAP_KEYWORDS=1 IMAP_ACL=1 IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE" IMAP_PROXY=0 IMAP_PROXY_FOREIGN=0 IMAP_IDLE_TIMEOUT=60 IMAP_MAILBOX_SANITY_CHECK=1 IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN" IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN" IMAP_DISABLETHREADSORT=0 IMAP_CHECK_ALL_FOLDERS=0 IMAP_OBSOLETE_CLIENT=0 IMAP_UMASK=022 IMAP_ULIMITD=65536 IMAP_USELOCKS=1 IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index IMAP_ENHANCEDIDLE=0 IMAP_TRASHFOLDERNAME=Trash IMAP_EMPTYTRASH=Trash:7 IMAP_MOVE_EXPUNGE_TO_TRASH=0 SENDMAIL=/usr/sbin/sendmail HEADERFROM=X-IMAP-Sender IMAPDSTART=YES MAILDIRPATH=Maildir
Если будем просматривать почту и с локалки и из мира, т.е. courier-imap будет слушать на всех активных интерфейсах, ставим ADDRESS=0
Если необходимо просматривать почту только через веб-интерфейс(imp), в поле ADDRESS=127.0.0.1
Если в системе много интерфейсов, а нужно привязать pop/imap сервер только к некоторым, то это можно сделать так:ADDRESS=0 PORT=192.168.127.1.110,127.0.0.1.110
Для автозапуска pop/imap добавляем в /etc/rc.conf:
courier_imap_pop3d_enable="YES" courier_imap_imapd_enable="YES"
Запускаем pop/imap сервер:
# /usr/local/etc/rc.d/courier-imap-imapd start Starting courier_imap_imapd. # /usr/local/etc/rc.d/courier-imap-pop3d start Starting courier_imap_pop3d
Проверяем:
# netstat -Aan | grep 110 cb276000 tcp4 0 0 *.110 *.* LISTEN # netstat -Aan | grep 143 c5e0c768 tcp4 0 0 *.143 *.* LISTEN
6. Ну вот мы и добрались до Postfix.
# cd /usr/ports/mail/postfix28 # make install
Выбираем нужное: PCRE, SASL2, TLS, MYSQL, VDA
В конце установки отвечаем на вопрос:
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y
Отключаем запуск sendmail при старте системы в /etc/rc.conf:
sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO"
Отключаем опции sendmail /etc/periodic.conf
daily_clean_hoststat_enable="NO" daily_status_mail_rejects_enable="NO" daily_status_include_submit_mailq="NO" daily_submit_queuerun="NO"
Редактируем конфигурационный файл postfix /usr/local/etc/postfix/main.cf:
Spoiler
Указываем postfix, как производить аутентификацию пользователей. Для этого создаем файл smtpd.conf со следующим содержимым:
[/usr/local/lib/sasl2/smtpd.conf] pwcheck_method: auxprop mech_list: PLAIN LOGIN CRAM-MD5 auxprop_plugin: sql sql_usessl: yes sql_engine: mysql sql_hostnames: localhost sql_user: postfix sql_passwd: postfix sql_database: postfix sql_select: select password from mailbox where username = '%u@%r' log_level: 3
Инициализируем базу данных псевдонимов:
/usr/local/bin/newaliases
Создаем необходимые файлы:
# cd /usr/local/etc/postfix # touch hello_access sender_access # touch recipient_access client_access # postmap hello_access # postmap sender_access # postmap recipient_access # postmap client_access # mkdir /usr/local/etc/postfix/mysqlLookupMaps
Создаём и правим файлы:
[/usr/local/etc/postfix/mysqlLookupMaps/alias.conf] user = postfix password = postfix hosts = localhost dbname = postfix table = alias select_field = goto where_field = address
[ee /usr/local/etc/postfix/mysqlLookupMaps/domain.conf] user = postfix password = postfix hosts = localhost dbname = postfix table = domain select_field = domain where_field = domain additional_conditions = and active = '1' and backupmx = '0'
[/usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf] user = postfix password = postfix hosts = localhost dbname = postfix table = mailbox select_field = maildir where_field = username additional_conditions = and active = '1'
[/usr/local/etc/postfix/mysqlLookupMaps/quota.conf] user = postfix password = postfix hosts = localhost dbname = postfix table = mailbox select_field = quota where_field = username additional_conditions = and active = '1'
[/usr/local/etc/postfix/mysqlLookupMaps/sender.conf] user = postfix password = postfix hosts = localhost dbname = postfix table = mailbox select_field = username where_field = username additional_conditions = and active = '1'
Создаём группу и добавляем в неё пользователя:
# pw group add virtual -g 1981 # pw user add virtual -g virtual -s /sbin/nologin -u 1981
Создаем папку, где у нас будет храниться почта, и выставляем необходимые права:
# mkdir /var/spool/mail # chown virtual:virtual /var/spool/mail/ # chmod 740 /var/spool/mail/ # chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/ # chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf # chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/
Для автозапуска postfix добавляем в /etc/rc.conf:
postfix_enable="YES"
Запускаем postfix:
# /usr/local/etc/rc.d/postfix start postfix/postfix-script: starting the Postfix mail system
7. Устанавливаем Postfixadmin, web-интерфейс для администрирования почтовика.
# cd /usr/ports/mail/postfixadmin # make install
Выбираем: MYSQLI
Прописываем в конфиг апача Alias или виртуальный хост для postfixadmin.
Создаём БД postfix. Заводим пользователя и заводим ему пароль:
mysql> grant all on postfix.* to postfix@localhost identified by 'пароль';
Рихтуем конфиг config.inc.php:
$CONF['configured'] = true; $CONF['setup_password'] = 'пароль_для_установки'; $CONF['default_language'] = 'ru'; $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'пароль_БД'; $CONF['database_name'] = 'postfix'; $CONF['emailcheck_resolve_domain']='NO'; $CONF['encrypt'] = 'cleartext';
Заходим http://ip_address/postfixadmin/setup.php если всё хорошо, то в базе создадутся все необходимые таблицы.
Теперь надо ввести пароль отсюда: $CONF['setup_password'] = 'пароль_для_установки';
Нажать кнопочку и увидеть надпись, примерно такого содержания(это сгенерится хэш_пароля):
If you want to use the password you entered as setup password, edit config.inc.php and set $CONF['setup_password'] = 'f191361d412caae0e72ac7e1b125e2c4:c74ef83b1bdeb6c8567d930fa57bf1084c55f27f';
Этот хэш надо внести вместо пароля сюда:
$CONF['setup_password'] = 'хэш_пароля';
Ну и в итоге создаём суперадмина, используя 'пароль_для_установки'
После настройки удаляем setup.php и заходим на страничку админки: http://ip_address/postfixadmin/
Создаём домен и ящик админа.
Теперь можно переходить к созданию почтовых ящиков.
Протестируем сервер.
Проверим поддержку квот. Для этого отправим письмо пользователю test@megapuper.ru, у которого квота 1Мб, письмо с вложением ~3Мб.
May 15 12:08:40 servmp postfix/smtpd[35103]: connect from mail.mtel.su[213.129.127.98] May 15 12:08:40 servmp postfix/smtpd[35103]: CFB78638E4E: client=mail.mtel.su[213.129.127.98] May 15 12:08:40 servmp postfix/cleanup[35107]: CFB78638E4E: message-id=<op.wecmn2iqnx8338@finn> May 15 12:08:45 servmp postfix/qmgr[23741]: CFB78638E4E: from=<test@mtel.su>, size=3274009, nrcpt=1 (queue active) May 15 12:08:45 servmp postfix/smtpd[35103]: disconnect from mail.mtel.su[213.129.127.98] May 15 12:08:45 servmp postfix/virtual[35109]: CFB78638E4E: to=<test@megapuper.ru>, relay=virtual, delay=4.9, delays=4.7/0.01/0/0.18, dsn=5.2.2, status=bounced (maildir delivery failed: "Sorry, the user's maildir has overdrawn his diskspace quota, please try again later") May 15 12:08:45 servmp postfix/cleanup[35107]: AEBF5638E54: message-id=<20120515120845.AEBF5638E54@mail.megapuper.ru> May 15 12:08:45 servmp postfix/bounce[35110]: CFB78638E4E: sender non- delivery notification: AEBF5638E54 May 15 12:08:45 servmp postfix/qmgr[23741]: AEBF5638E54: from=<>, size=3685, nrcpt=1 (queue active) May 15 12:08:45 servmp postfix/qmgr[23741]: CFB78638E4E: removed
Как видно из log-а:
«status=bounced (maildir delivery failed: «Sorry, the user's maildir has overdrawn his diskspace quota, please try again later»)»
поддержка квот работает. Текст сообщения можно задать в main.cf в файле virtual_maildir_limit_message.
Теперь попробуем отправить письмо в мир, без аутентификации.
finn@/root#telnet mail.megapuper.ru 25 Trying 109.172.52.114... Connected to mail.megapuper.ru. Escape character is '^]'. 220 mail.megapuper.ru ESMTP helo servmp.megapuper.ru 250 mail.megapuper.ru mail from:<test@megapuper.ru> 250 2.1.0 Ok rcpt to:<test@mtel.su> 554 5.7.1 <test@mtel.su>: Relay access denied
При этом в log-е должно быть следующее:
May 15 12:26:29 servmp postfix/smtpd[35230]: connect from mail.mtel.su[213.129.127.98] May 15 12:27:26 servmp postfix/smtpd[35230]: NOQUEUE: reject: RCPT from mail.mtel.su[213.129.127.98]: 554 5.7.1 <test@mtel.su>: Relay access denied; from=<test@megapuper.ru> to=<test@mtel.su> proto=SMTP helo=<servmp.megapuper.ru>
Как видно из сообщения - «Relay access denied». Релей почты для пользователей, не прошедших аутентификацию запрещен.
Теперь пробуем отправить почту с несуществующего ящика внутри домена.
finn@/root#telnet mail.megapuper.ru 25 Trying 109.172.52.114... Connected to mail.megapuper.ru. Escape character is '^]'. 220 mail.megapuper.ru ESMTP helo servmp.megapuper.ru 250 mail.megapuper.ru mail from:<user@megapuper.ru> 250 2.1.0 Ok rcpt to:<finn@mail.ru> 550 5.1.0 <finn@megapuper.ru>: Sender address rejected: User unknown
Как видно, сервер не разрешает отправлять почту с несуществующих адресов.
На этом базовую настройку МТА можно считать завершенной.
8. Установка clamav
Устанавливаем антивирус clamav, который будет проверять все почтовые сообщения на вирусы.
# cd /usr/ports/security/clamav # make install
Выбираем нужное: ARC, ARJ, LHA, UNZOO, UNRAR, ICONV
Для автозапуска clamd вместе с системой прописываем в /etc/rc.conf:
clamav_clamd_enable="YES"
Редуктируем конфигурационный файл /usr/local/etc/clamd.conf:
LogFile /var/log/clamav/clamd.log PidFile /var/run/clamav/clamd.pid DatabaseDirectory /var/db/clamav LocalSocket /var/run/clamav/clamd.sock FixStaleSocket yes User clamav AllowSupplementaryGroups yes ScanPDF yes ScanMail yes MaxFileSize 5M
Выставляем необходимые права и запускаем clamav
# chown -R clamav:clamav /var/log/clamav/ # chown -R clamav:clamav /var/run/clamav/ # chown -R clamav:clamav /var/db/clamav/
# /usr/local/etc/rc.d/clamav-clamd start Starting clamav_clamd.
При этом в log-файле должно быть примерно следующее:
+++ Started at Mon Jul 23 14:56:30 2012 clamd daemon 0.97.4 (OS: freebsd8.2, ARCH: i386, CPU: i386) Running as user clamav (UID 106, GID 106) Log file size limited to 1048576 bytes. Reading databases from /var/db/clamav Not loading PUA signatures. Bytecode: Security mode set to "TrustSigned". Loaded 1277640 signatures. LOCAL: Unix socket file /var/run/clamav/clamd.sock LOCAL: Setting connection queue length to 200 Limits: Global size limit set to 5242880 bytes. Limits: File size limit set to 5242880 bytes. Limits: Recursion level limit set to 16. Limits: Files limit set to 10000. Archive support enabled. Algorithmic detection enabled. Portable Executable support enabled. ELF support enabled. Mail files support enabled. OLE2 support enabled. PDF support enabled. HTML support enabled. Self checking every 600 seconds. Set stacksize to 1114112 No stats for Database check - forcing reload Reading databases from /var/db/clamav Database correctly reloaded (1277640 signatures)
После установки антивируса надо обновить антивирусные базы. Для этого используем freshclam, которая идет вместе с clamav. Редактируем конфиг:
[ee /usr/local/etc/freshclam.conf] DatabaseDirectory /var/db/clamav UpdateLogFile /var/log/clamav/freshclam.log PidFile /var/run/clamav/freshclam.pid DatabaseOwner clamav AllowSupplementaryGroups yes DatabaseMirror db.ru.clamav.net Checks 24 NotifyClamd /usr/local/etc/clamd.conf
Ставим freshclam в автозагрузку:
clamav_freshclam_enable="YES"
и стартуем:
# /usr/local/etc/rc.d/clamav-freshclam start
В логе должно быть, примерно следующее:
Received signal: wake up ClamAV update process started at Mon Jul 23 13:56:46 2012 main.cvd is up to date (version: 54, sigs: 1044387, f-level: 60, builder: sven) daily.cld is up to date (version: 15168, sigs: 238519, f-level: 63, builder: guitar) bytecode.cld is up to date (version: 188, sigs: 38, f-level: 63, builder: neo)
9. Установка и настройка spamassassin - антиспам
# cd /usr/ports/mail/p5-Mail-SpamAssassin # make install
Выбираем нужное: AS_ROOT, SPAMC, SACOMPILE, SSL, GNUPG, MYSQL, SPF_QUERY
Ставим spamassassin в автозагрузку:
spamd_enable="YES"
и правим конфиг:
[ee /usr/local/etc/mail/spamassassin/local.cf] rewrite_header Subject *****SPAM***** report_safe 1 required_score 7.0 use_bayes 1 bayes_auto_learn 1 bayes_ignore_header X-Bogosity bayes_ignore_header X-Spam-Flag bayes_ignore_header X-Spam-Status
Это минимальный набор параметров, необходимый для проверки нашей системы. Для получения полного списка всех параметров, а также описания их назначения запускаем следующую команду:
# perldoc Mail::SpamAssassin::Conf
Запускаем:
# /usr/local/etc/rc.d/sa-spamd start Jul 23 17:11:16 servmp spamd[11349]: logger: removing stderr method Jul 23 17:11:16 servmp spamd[11351]: config: no rules were found! Do you need to run 'sa-update'? Jul 23 17:11:17 servmp spamd[11349]: child process [11351] exited or timed out without signaling production of a PID file: exit 255 at /usr/local/bin/spamd line 2642.
Делаем:
# /usr/local/bin/sa-update
вторая попытка:
# /usr/local/etc/rc.d/sa-spamd start Jul 23 17:13:07 servmp spamd[11378]: logger: removing stderr method Jul 23 17:13:10 servmp spamd[11380]: Can't locate Mail/SpamAssassin/CompiledRegexps/body_0.pm in @INC (@INC contains: /var/db/spamassassin/compiled/5.012/3.003002 /var/db/spamassassin/compiled/5.012/3.003002/auto /usr/local/lib/perl5/ site_perl/5.12.4 /usr/local/lib/perl5/5.12.4/BSDPAN /usr/local/lib/perl5/site_perl/5.12.4/mach /usr/local/lib/perl5/5.12.4/mach /usr/local/lib/perl5/5.12.4) at (eval 901) line 1. Jul 23 17:13:11 servmp spamd[11380]: spamd: server started on port 783/tcp (running version 3.3.2) Jul 23 17:13:11 servmp spamd[11380]: spamd: server pid: 11380 Jul 23 17:13:11 servmp spamd[11380]: spamd: server successfully spawned child process, pid 11384 Jul 23 17:13:11 servmp spamd [11380]: spamd: server successfully spawned child process, pid 11385 Jul 23 17:13:11 servmp spamd[11380]: prefork: child states: IS Jul 23 17:13:11 servmp spamd[11380]: prefork: child states: II
# sa-compile # spamassassin -D --lint
третья попытка:
# /usr/local/etc/rc.d/sa-spamd start Jul 23 17:35:10 servmp spamd[12561]: logger: removing stderr method Jul 23 17:35:12 servmp spamd[12563]: zoom: able to use 428/428 'body_0' compiled rules (100%) Jul 23 17:35:13 servmp spamd[12563]: spamd: server started on port 783/tcp (running version 3.3.2) Jul 23 17:35:13 servmp spamd[12563]: spamd: server pid: 12563 Jul 23 17:35:13 servmp spamd[12563]: spamd: server successfully spawned child process, pid 12564 Jul 23 17:35:13 servmp spamd[12563]: spamd: server successfully spawned child process, pid 12565 Jul 23 17:35:13 servmp spamd[12563]: prefork: child states: II
Всё нормально.
10. Установка amavisd-new
Устанавливаем amavisd-new, который является посредником между MTA (postfix) и различными фильтрами/сканерами (spamassassin, clamav)
# cd /usr/ports/security/amavisd-new # make install
Выбираем нужное: BDB, MYSQL, SPAMASSASSIN, ALTERMIME, FILE, RAR, UNRAR, ARJ, UNARJ, LHA, ARC, CAB, RPM, ZOO, UNZOO, TNEF
Ставим amavisd в автозагрузку:
amavisd_enable="YES"
Редактируем конфиг /usr/local/etc/amavisd.conf:
Spoiler
Запускаем amavisd: #/usr/local/etc/rc.d/amavisd start
В логе примерно следующее:
Spoiler
Проверяем amavisd-new:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready quit 221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel Connection closed by foreign host.
Теперь внесем изменения в файл /usr/local/etc/postfix/master.cf
. Добавив следующие строчки:
smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks</code>
Перезапускаем postfix. И снова проверяем amavisd
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready mail from:<finn@megapuper.ru> 250 2.1.0 Sender <finn@megapuper.ru> OK rcpt to:<postmaster@megapuper.ru> 250 2.1.5 Recipient <postmaster@megapuper.ru> OK Data 354 End data with <CR><LF>.<CR><LF> Subject: Test1 - Clean message Hello world . 250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 9D3E3638DE3 mail from:<finn@megapuper.ru> 250 2.1.0 Sender <finn@megapuper.ru> OK rcpt to:<postmaster@megapuper.ru> 250 2.1.5 Recipient <postmaster@megapuper.ru> OK Data 354 End data with <CR><LF>.<CR><LF> Subject: Test 2 - Virus test pattern X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* . 250 2.7.0 Ok, discarded, id=01543-03-5 - INFECTED: Eicar-Test-Signature quit 221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel Connection closed by foreign host.
Как видно из сообщения - discarded, id=00950-02 - VIRUS: Eicar-Test-Signature , вирус он нашел.
Теперь необходимо указать postfix, чтобы он все письма для проверки передавал amavisd, для этого необходимо добавить следующую строку в main.cf:
content_filter=smtp-amavis:[127.0.0.1]:10024
Перезапускаем postfix и проверяем работу spamassassin:
# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.megapuper.ru ESMTP helo finn 250 mail.megapuper.ru mail from:<finn@megapuper.ru> 250 2.1.0 Ok rcpt to:<postmaster@megapuper.ru> 250 2.1.5 Ok 354 End data with <CR><LF>.<CR><LF> XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X . 250 2.0.0 Ok: queued as 19196638E83 quit 221 2.0.0 Bye Connection closed by foreign host.
Смотрим логи:
# tail -f /var/log/maillog Jul 25 17:46:28 servmp amavis[22943]: (22943-06) (!)run_av (ClamAV-clamd) FAILED - unexpected , output="/var/amavis/tmp/amavis-20120725T172001-22943-B8C3bK2r/parts: lstat() failed: Permission denied. ERROR\n" Jul 25 17:46:28 servmp amavis[22943]: (22943-06) (!)ClamAV-clamd av-scanner FAILED: CODE(0x2845d2f8) unexpected , output="/var/amavis/tmp/amavis-20120725T172001-22943-B8C3bK2r/parts: lstat() failed: Permission denied. ERROR\n" at (eval 119) line 899. Jul 25 17:46:28 servmp amavis[22943]: (22943-06) (!)WARN: all primary virus scanners failed, considering backups
Проблема возникает из-за того что clamav, не может получить доступ к папке где лежат письма на проверку для него т.к. amavis передает ему это путь в виде строки, а права по умолчанию на папку /var/amavis/ стоят drwxr-x—
Решается очень просто. Добавлением пользователя под которым запускается clamav (обычно clamav) в группу vsan:
# pw groupmod vscan -M clamav
Рестартим и смотрим снова:
Jul 26 13:10:39 servmp postfix/smtpd[43691]: connect from unknown[192.168.0.10] Jul 26 13:10:47 servmp postfix/smtpd[43691]: 1976B638D9C: client=unknown[192.168.0.10] Jul 26 13:11:00 servmp postfix/cleanup[44690]: 1976B638D9C: message-id=<20120726091047.1976B638D9C@mail.megapuper.ru> Jul 26 13:11:00 servmp postfix/qmgr[24098]: 1976B638D9C: from=<finn@megapuper.ru>, size=414, nrcpt=2 (queue active) Jul 26 13:11:01 servmp postfix/smtpd[44698]: connect from localhost[127.0.0.1] Jul 26 13:11:01 servmp postfix/smtpd[44698]: 4331B638DFB: client=localhost[127.0.0.1] Jul 26 13:11:01 servmp postfix/cleanup[44690]: 4331B638DFB: message-id=<20120726091047.1976B638D9C@mail.megapuper.ru> Jul 26 13:11:01 servmp postfix/smtpd[44698]: disconnect from localhost[127.0.0.1] Jul 26 13:11:01 servmp postfix/qmgr[24098]: 4331B638DFB: from=<finn@megapuper.ru>, size=1122, nrcpt=3 (queue active) Jul 26 13:11:01 servmp amavis[41497]: (41497-20) Passed SPAM {RelayedTaggedInternal,Quarantined}, MYNETS LOCAL [192.168.0.10]:21767 [192.168.0.10] <finn@megapuper.ru> -> <finn@megapuper.ru>,<postmaster@megapuper.ru>, quarantine: spam- bOWSrda6jH2q.gz, Queue-ID: 1976B638D9C, Message-ID: <20120726091047.1976B638D9C@mail.megapuper.ru>, mail_id: bOWSrda6jH2q, Hits: 1000.207, size: 414, queued_as: 4331B638DFB, 300 ms Jul 26 13:11:01 servmp postfix/smtp[44696]: 1976B638D9C: to=<finn@megapuper.ru>, orig_to=<postmaster@megapuper.ru>, relay=127.0.0.1[127.0.0.1]:10024, delay=18, delays=18/0.01/0/0.31, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp: [127.0.0.1]:10025): 250 2.0.0 Ok: queued as 4331B638DFB) Jul 26 13:11:01 servmp postfix/smtp[44696]: 1976B638D9C: to=<postmaster@megapuper.ru>, relay=127.0.0.1[127.0.0.1]:10024, delay=18, delays=18/0.01/0/0.31, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 4331B638DFB) Jul 26 13:11:01 servmp postfix/qmgr[24098]: 1976B638D9C: removed Jul 26 13:11:01 servmp postfix/virtual[44700]: 4331B638DFB: to=<finn@megapuper.ru>, relay=virtual, delay=0.06, delays=0.02/0.03/0/0.01, dsn=2.0.0, status=sent (delivered to maildir) Jul 26 13:11:01 servmp postfix/virtual[44700]: 4331B638DFB: to=<finn@megapuper.ru>, orig_to=<postmaster@megapuper.ru>, relay=virtual, delay=0.07, delays=0.02/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to maildir) Jul 26 13:11:01 servmp postfix/virtual[44700]: 4331B638DFB: to=<postmaster: 4331B638DFB: to=@megapuper.ru>, relay=virtual, delay=0.07, delays=0.02/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to maildir) Jul 26 13:11:01 servmp postfix/qmgr[24098]: 4331B638DFB: removed Jul 26 13:11:05 servmp postfix/smtpd[43691]: disconnect from unknown[192.168.0.10]
11. Установка и настройка Maia.
Maia-Mailguard утилита для настройки спам и антивирусных фильтров. Она позволяет устанавливать собственные настройки для фильтров спама и вирусов.
Ставим Pear(хранилище расширений и дополнений PHP):
# cd /usr/ports/devel/pear # make install
Редактируем /usr/local/etc/php.ini
:
;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;;
; UNIX: "/path1:/path2" include_path = ".:/usr/local/share/pear"
Ставим PEAR’s HTML Purifier:
# pear channel-discover htmlpurifier.org # pear install hp/HTMLPurifier
Ставим Maia из портов:
# cd /usr/ports/security/maia # make install
Выбираем нужное: APACHE, WEBHOST, MYSQL, POSTFIX, PFA, CLAMAV, SPAMASSASSIN остальное по желанию
НЕ ЗАКОНЧЕНО
12. Дополнительные возможности Postfixadmin
АВТООТВЕТЧИК
Для настройки автоответчика надо создать пользователя vacation и группу vacation, от имени которых будет работать скрипт vacation.pl, создать домашнюю папку пользователя vacation, поместить в нее скрипт vacation.pl, а также соответствующим образом изменить владельца папки и права скрипта:
# pw groupadd vacation -g 65501 # pw useradd vacation -g vacation -s /sbin/nologin -u 65501 # mkdir /usr/local/etc/postfix/vacation # cp /usr/local/www/postfixadmin/VIRTUAL_VACATION/vacation.pl /usr/local/etc/postfix/vacation # chown -R vacation:vacation /usr/local/etc/postfix/vacation # chmod 500 /usr/local/etc/postfix/vacation/vacation.pl
Теперь правим скрипт vacation.pl
our $db_type = 'mysql'; our $db_username = 'postfix'; our $db_password = 'postfix'; our $db_name = 'postfix'; our $vacation_domain = 'autoreply.megapuper.ru'; our $smtp_server = 'localhost'; our $smtp_server_port = 25; our $interval = 0;
Добавляем определение транспорта vacation в файл /usr/local/etc/postfix/master.cf:
vacation unix - n n - - pipe flags=Rq user=vacation argv=/usr/local/etc/postfix/vacation/vacation.pl -f ${sender} -- ${recipient}</code>
Далее добавляем строку, определяющую транспорт vacation, в файл transport, находящийся в /usr/local/etc/postfix и являющийся таблицей транспортов:
autoreply.megapuper.ru vacation:
И выполняем:
# postmap transport
Домен autoreply.megapuper.ru является абстрактным, т.е. не нуждается в регистрации соответствующих записей в DNS, достаточно добавить запись об этом домене в файл /etc/hosts:
127.0.0.1 autoreply.megapuper.ru
Добавляем в /usr/local/etc/postfix/main.cf ранее созданную(измененную) таблицу транспортов:
transport_maps = hash:$base/vacation/transport
Остаётся подправить config.inc.php для включения функций управления автоответчиком в интерфейсе PostfixAdmin:
$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.megapuper.ru';
$CONF['vacation_control'] = 'YES';
$CONF['vacation_control_admin'] = 'YES';
Перезапускаем Postfx командой postfix reload и начать пользоваться автоответчиком. При возникновении каких-либо проблем c работой скрипта vacation.pl смотрим /var/log/messages.
p.s.: Ошибка вида:
(expanded from): Command died with status 2:
"/usr/local/etc/postfix/vacation/vacation.pl". Command output: Can't locate MIME/EncWords.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.9/BSDPAN
говорит о том, что не хватает некоторых модулей Perl, которые доставим из портов.
ОЧИСТКА ДИСКА
По умолчанию, при удалении почтового ящика через Postfixadmin, он удаляется из базы, но остаётся физически на диске. Таким образом его приходится удалять руками. Данную траблу можно решить включением автоматического удаления ящиков с жесткого диска, если информация о них была предварительно удалена из базы данных через Postfixadmin.
НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ СКОПИРОВАТЬ КУДА-НИБУДЬ ВСЮ ПОЧТУ, ОТ ГРЕХА
Добавляем запуск скрипта в крон:
0 0 * * * root /usr/local/www/postfixadmin/ADDITIONS/cleanupdirs.pl --delete
В данном случае диск очищается раз в сутки в 24:00. Список удалённых ящиков записывается в /var/log/removed_mailbox.log
p.s.: насколько я понял скрипт по умолчанию заточен на структуру расположения почтовых ящиков вида:
/var/spool/mail/domen/ящик
у меня так /var/spool/mail/ящик
При запуске прибил мне все ящики
Поправленный скрипт(если папки расположены так /var/spool/mail/ящик) позаимствован отсюда http://www.sergeysl.ru/freebsd-postfixadmin/
#!/usr/bin/perl -w
use strict;
use DBI;
use File::Path;
use Getopt::Long;
### change settings as needed, see notes above #################################
our $root_path = "/var/spool/mail";
our $logfile = "/var/log/removed_maildirs.log";
our $db_hostname = "localhost";
our $db_port = "3306"; # this script currently supports MySQL only
our $db_database = "postfix";
our $db_username = "postfix";
our $db_password = "postfix";
### begin program ##############################################################
my(@dirs_to_delete, $logfile_open);
my $delete_old_dirs = 0; # do not delete by default, use cmdline to change this
my $print_also = 0; # also print items when deleting, use cmdline to change this
GetOptions ('delete' => \$delete_old_dirs, 'print' => \$print_also);
my $conn_info = "DBI:mysql:database=$db_database;hostname=$db_hostname;port=$db_port";
my $dbh = DBI->connect($conn_info, $db_username, $db_password)
or die $DBI::errstr;
opendir USERDIR, $root_path
or die "Unable to access directory '$root_path' ($!)";
foreach my $user_dir (sort readdir USERDIR) {
next if $user_dir =~ /^\./; # skip dotted dirs
push @dirs_to_delete, "$root_path/$user_dir"
if &check_dir("SELECT maildir FROM mailbox WHERE maildir = ?",
"$user_dir/"); # end slash needed for checkdir
}
closedir USERDIR;
$dbh->disconnect;
if (@dirs_to_delete) {
foreach my $to_delete (@dirs_to_delete) {
if ($delete_old_dirs == 1) {
$logfile_open = open LOGFILE, ">> $logfile"
or die "Unable to append logfile '$logfile' ($!)"
unless $logfile_open;
rmtree $to_delete;
print LOGFILE localtime() . " Deleting directory '$to_delete'\n";
print localtime() . " Deleting directory '$to_delete'\n"
if $print_also;
} else {
print localtime() . " Need to delete directory '$to_delete'\n";
}
}
}
close LOGFILE if $logfile_open;
sub check_dir {
my($query, $dir) = @_;
my $sth = $dbh->prepare($query);
my $num_rows = $sth->execute($dir);
$sth->finish;
($num_rows eq "0E0") ? 1 : 0;
}
ПОЛЕЗНЫЕ КОМАНДЫ
Вывод дефолтного значения параметра:
# postconf -d smtpd_sasl_auth_enable
smtpd_sasl_auth_enable = no
Вывод текущего значения параметра:
# postconf smtpd_sasl_auth_enable
smtpd_sasl_auth_enable = yes
Вывод версии postfix:
# postconf | grep ^mail_version
mail_version = 2.8.9
Просмотр текущей очереди сообщений:
# postqueue -p
Удаление всех писем из очереди:
# postsuper -d ALL
Повторная отправка сообщений, которые находятся в очереди:
# postqueue -f