FreeBSD: Почтовая система среднего офиса на базе Postfix

PostfixОписанная в этой статье почтовая система была запущена в эксплуатацию в далеком 2006 году. С течением времени она многократно дорабатывалась с целью расширения функциональности и повышения удобства администрирования. Сегодня почтовая система умеет обслуживать несколько доменов, использует для хранения своей учетной информации базу данных MySQL, для управления которой применяется PostfixAdmin, простейший POP3/POP3S-сервер на базе popa3d и stunnel заменен на POP3/POP3S/IMAP4/IMAP4S-сервер Courier-IMAP, в подсистему защиты от вирусов и СПАМа встроена утилита p0f, предназначенная для определения типа операционных систем почтовых серверов, а также добавлены функции DKIM подписания и DKIM верификации, наконец, в подсистему учета статистики добавлена возможность оценки величины потока сообщений с помощью Mailgraph.

Постановка задачи

Необходимо создать почтовую систему среднего офиса (до 50-100 клиентов) с надежной защитой от вирусов и СПАМа, а также c возможностью безопасного использования из-за пределов корпоративной сети. Самым важным и сложным моментом рассматриваемой задачи (судя по моему скромному опыту) является избавление от СПАМа, объем которого в последнее время достигает катастрофических значений. В Сети есть масса статей, описывающих те или иные этапы борьбы со СПАМом. Я изучал и испытывал многие из найденных конфигураций, но ни одна из них не смогла устроить меня на 100%. В связи с этим пришлось экспериментировать, собирая все по кусочкам. Ниже описана получившаяся в результате почтовая система, которую мы использовали до февраля 2008 года. С тех пор подсистема защиты от вирусов и СПАМа заметно расширилась, но та ее часть, которая описана ниже, прекрасно работает и сейчас. Всех все устраивает. Неожиданные письма появляются крайне редко, хотя менеджеры не перестают публиковать свои адреса на публичных сайтах.

Исходные данные

Имеется сервер с FreeBSD, находящийся на входе подсети центрального офиса. В качестве MTA мы будем использовать Postfix. В качестве ответа на вопрос: «почему?», я предлагаю Вам изучить статью Почтовая система для среднего и малого офиса, которая, кроме всего прочего, описывает архитектуру Postfix и дает рекомендации по диагностика возможных проблем. Кроме Postfix, нам понадобится следующее программное обеспечение: для шифрования SMTP-трафика — OpenSSL; для аутентификации удаленных SMTP-клиентов — Cyrus-SASL2 + Cyrus-SASL2-saslauthd; для связи Postfix с системами защиты от вирусов и СПАМа — Amavisd-New; для защиты от вирусов — ClamAV; для защиты от СПАМа — SpamAssassin + DCC + Pyzor + Razor-Agents; для хранения баз данных SpamAssassin — сервер MySQL (процесс настройки сервера MySQL не рассматривается в данной статье за исключением создания базы данных и пользователя SpamAssassin); для формирования информативных отчетов (они нужны сисадминам для разрешения проблем) — pflogsumm; для формирования красивых отчетов (они нужны руководству для дополнительного осознания того, что сисадмин не туниядец) — AWStats; для обеспечения доступа к отчетам — сервер Apache (процесс настройки сервера Apache не рассматривается в данной статье за исключением добавления возможности отображения отчетов о работе почтовой системы). Все перечисленное программное обеспечение будет устанавливаться из портов, поэтому я настоятельно рекомендую Вам обновить их перед выполнением действий, описанных ниже (я использовал FreeBSD 4.10 и последние версии портов для нее). Ссылки на источники информации будут приводиться применительно к конкретным разделам статьи.

Установка и начальная настройка Postfix

Установку Postfix необходимо выполнить из портов:

cd /usr/ports/mail/postfix
make install

В окне конфигурации, которое появляется в процессе выполнения команды make install, необходимо отметить опции: [X] PCRE Perl Compatible Regular Expressions, [X] SASL2 Cyrus SASLv2 (Simple Auth. and Sec. Layer), [X] TLS Enable SSL and TLS support. Если окно конфигурации не появилось, выполните команду make config. В конце процесса установки Вам будет задан запрос о замене используемого по умолчанию MTA, на который нужно ответить утвердительно. Для того, чтобы Postfix запускался при загрузке операционной системы, необходимо выполнить требование команды make install — добавить в файл /etc/rc.conf строки:

sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"

Файлы конфигурации Postfix хранятся в папке /usr/local/etc/postfix. На данном этапе для нас интересны два файла: main.cf (главный файл конфигурации) и aliases (файл, описывающий псевдонимы). В файле main.cf необходимо изменить следующие значения (подробное описание всех опций, которые можно задать в данном файле, приведено в postconf(5)):

myhostname = host.domain.com
mydomain = domain.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $mydomain
mynetworks = 127.0.0.0/8, 192.168.0.0/24
alias_database = hash:/usr/local/etc/postfix/aliases
alias_maps = $alias_database

Естественно, host.domain.com и domain.com нужно заменить на FQDN сервера и домена, а список mynetworks откорректировать в соответствии с конфигурацией сети. В файле aliases (подробное описание формата данного файла приведено в aliases(5)) необходимо задать псевдоним пользователя root, а затем выполнить команду newaliases. Не забудьте, что для корректной работы SMTP-сервера Ваш брандмауэр должен разрешать прохождение TCP-трафика на все нужные адреса сервера порт 25, поэтому добавьте соответствующие правила, если они отсутствуют. На этом первичная настройка Postfix заканчивается. Можно запустить Postfix командой postfix start, посмотреть сообщения, которые пишутся в /var/log/maillog, и проверить работоспособность сервера, подключившись к 25 порту локального хоста с помощью клиента telnet, как описано здесь однако, даже если ошибок нет, расслабляться еще очень рано, т.к. сервер является достаточно легкой добычей для СПАМеров.

Добавление поддержки аутентификации SMTP

Аутентификация SMTP, функционирование которой описано в документе RFC-2554, предназначена для разграничения доступа пользователей к почтовому серверу на основании их учетных данных (имен и паролей). Мы будем использовать аутентификацию SMTP для авторизации пользователей, находящихся за пределами доверенных сетей (т.е. сетей, описанных в параметре mynetworks, рассмотренном выше). Для аутентификации пользователей, имеющих почтовые клиенты, работающие под Windows (такие как Microsoft Outlook, Microsoft Outlook Express, The Bat! и т.д.), нам потребуются методы аутентификации LOGIN и PLAIN. Пароли пользователей мы будем брать из основной базы данных паролей операционной системы. Действия, описанные в данном разделе, выполнялись под руководством статьи Tim Yocum Postfix with TLS and SASL.
В первую очередь необходимо установить Cyrus-SASL2 и Cyrus-SASL2-salauthd из портов:

cd /usr/ports/security/cyrus-sasl2
make install
cd ../cyrus-sasl2-saslauthd
make install

Все лишние (в смысле не используемые нами) возможности Cyrus-SASL2 нужно отключить:

cd /usr/local/lib/sasl2
mkdir deactivated
mv *anonymous* deactivated
mv *crammd5* deactivated
mv *digestmd5* deactivated
mv *ntlm* deactivated
mv *otp* deactivated
mv *sasldb* deactivated

В папке /usr/local/lib/sasl2 содержится два файла конфигурации Cyrus-SASL2: sendmail.conf (для использования совместно с Sendmail) и smtpd.conf (для использования совместно с Postfix). Нас интересует второй, содержимое которого нужно заменить на:

pwcheck_method: saslauthd

Такое значение параметра pwcheck_method заставляет Cyrus-SASL2 использовать для аутентификации Cyrus-SASL2-saslauthd. Файл sendmail.conf можно переместить в папку deactivated. Для того, чтобы Cyrus-SASL2-saslauthd запускался при загрузке операционной системы и использовал ее базу данных паролей, необходимо добавить в файл /etc/rc.conf следующие строки:

saslauthd_enable="YES"
saslauthd_flags="-a getpwent"

После настройки Cyrus-SASL2 и Cyrus-SASL2-saslauthd необходимо включить поддержку SASL2 в файле main.cf:

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $mydomain
broken_sasl_auth_clients = yes

Указанные параметры имеют следующие значения: smtpd_sasl_auth_enable — включение поддержки SASL, smtpd_sasl_security_options — дополнительные опции SASL (в нашем случае запрет анонимной аутентификации), smtpd_sasl_local_domain — доменная часть имени пользователя (в нашем случае используется имя домена, т.е. при настройке почтовых клиентов в разделе «Аутентификация SMTP» можно просто устанавливать опцию «Использовать параметры получения почты POP3», а не задавать имя пользователя и пароль), broken_sasl_auth_clients — опция необходима для поддержки старых версий почтовых клиентов, например Microsoft Outlook Express 4 и Microsoft Exchange 5, использующих другую форму команды AUTH, которая описана в документе RFC-4954. На этом добавление поддержки SASL к Postfix заканчивается (естественно, необходимо откорректировать соответствующие наборы правил *_restrictions в файле main.cf, о чем будет сказано ниже). Остается перезапустить Postfix и начать пользоваться аутентификацией SMTP. Однако не стоит торопиться, т.к. аутентификация SMTP максимально эффективна только совместно с TLS-шифрованием трафика.

Добавление поддержки TLS-шифрования трафика

TLS-шифрование трафика предназначено для обеспечения защиты трафика при взаимодействии клиентов, находящихся за пределами доверенных сетей, с нашим сервером, а также при взаимодействии нашего сервера c другими почтовыми серверами. Для TLS-шифрования трафика мы будем использовать функции OpenSSL и самоподписной доверенный сертификат X.509. Действия, описанные в данном разделе, выполнялись под руководством статьи Tim Yocum Postfix with TLS and SASL. Для создания самоподписного доверенного сертификата, находясь в папке /usr/local/etc/postfix, необходимо выполнить команду:

openssl req -new -nodes -x509 -out smtpd.pem -keyout smtpd.pem -days 3650

Команда req заставляет OpenSSL создать сертификат, ключи: -new — создать запрос на сертификат, -nodes — не шифровать закрытый ключ, -x509 (совместно с -new) — создать самоподписной сертификат, -keyout — задает местонахождение закрытого ключа, -out — задает местонахождение самоподписного сертификата, -days — задает время действия сертификата (365×10 дней, что приблизительно равно десяти годам). В процессе выполнения команды на экран будут выданы запросы о вводе таких параметров как: Country Name, State or Province Name; Locality Name; Organization Name; Organizational Unit Name; Common Name; Email Address. Самым важным параметром является значение Common Name. В нашем случае оно должно совпадать с FQDN сервера, по которому клиенты будут обращаться к нему для отправки почты. После генерации сертификата необходимо включить поддержку TLS в файле main.cf:

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Указанные параметры имеют следующие значения: smtp_use_tls — использовать TLS, если удаленный сервер сообщает о поддержке TLS, smtpd_use_tls — сообщать клиентам о поддержке TLS, smtpd_tls_auth_only — использовать аутентификацию SMTP только для TLS-соединений, smtp_tls_note_starttls_offer — фиксировать в логе имена серверов, выдающих сообщение STARTTLS, поддержка TLS для которых не включена, smtpd_tls_key_file — местонахождение закрытого ключа сервера, smtpd_tls_cert_file — местонахождение сертификата сервера, smtpd_tls_CAfile — местонахождение самоподписного доверенного сертификата, smtpd_tls_loglevel — детальность сообщений о TLS-активности, выводимых в лог, smtpd_tls_received_header — запрашивать заголовки сообщений с информацией о версии протокола и алгоритме шифрования, smtpd_tls_session_cache_timeout — время, в течение которого данные в кэше TLS-сессии считаются актуальными, tls_random_source — имя устройства-генератора псевдослучайных чисел (PRNG). Для того, чтобы Postfix принимал TLS-соединения на специальный порт (465/SMTPS, а не 25/SMTP), в файле /usr/local/etc/postfix/master.cf необходимо раскомментировать строки:

smtps inet n - n - - smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

Не забудьте, что Ваш брандмауэр должен разрешать прохождение TCP-трафика на адреса нужных интерфейсов сервера порт 465, поэтому добавьте соответствующие правила, если они отсутствуют. На этом добавление поддержки TLS-шифрования трафика к Postfix заканчивается. Остается перезапустить Postfix и начать пользоваться аутентификацией SMTP и TLS-шифрованием трафика.

Защита от вирусов и СПАМа средствами Postfix

Средства защиты от вирусов и СПАМа, встроенные в Postfix, описаны в документе Postfix SMTP relay and access control. Я также рекомендую Вам обратиться к подразделу «UCE/Virus» раздела «Howtos and FAQs» официального сайта Postfix и внимательно почитать статьи, которые OpenNET выдаст по запросу «postfix spam». Я предлагаю достаточно жесткую политику защиты от вирусов и СПАМа, которая не исключает потерю некоторых валидных сообщений, отправленных с некорректно настроенных серверов, которых в России достаточно много. В первый месяц использования описанной конфигурации Вам придется внимательно анализировать логи, генерируемые pflogsumm. Затем иногда нужно будет вручную обновлять содержимое соответствующих файлов (этот момент подробно описан ниже). Некоторые могут не согласиться с таким подходом. Выбирать Вам. Лично мне проще добавить одну-две строки за месяц, чем ежедневно выгребать кучи СПАМа из пользовательских почтовых ящиков. На этом философия заканчивается, и я перехожу к описанию настроек. Внимание, все файлы, описанные в данном разделе, должны находиться в папке /usr/local/etc/postfix, также в эту папку необходимо переходить перед выполнением любой из описанных в данном разделе команд. Изменение любого из параметров, задаваемых в файле main.cf вступает в силу только после перезапуска Postfix. В отдельно отмеченных случаях перезапуску должно предшествовать выполнение команды postmap.
Начинаем с изменения файла main.cf. В первую очередь необходимо ограничить максимальный размер почтовых ящиков и сообщений значениями 50 МБайт и 10 МБайт (мне кажется, что эти цифры более чем достаточны):

mailbox_size_limit = 52428800
message_size_limit = 10485760

Затем необходимо изменить коды ответов сервера об ошибках доставки сообщений, чтобы ПО СПАМера имело меньше шансов адекватного анализа причин невозможности доставки сообщений:

invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550

Затем необходимо запретить использование адресов, отличных от определенных в документе RFC-821, запретить использование команды VRFY и потребовать обязательное использование команды HELO/EHLO:

strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_helo_required = yes

Далее следует очень важный параметр smtpd_delay_reject. Я настоятельно рекомендую не изменять его значение по умолчанию (yes). В противном случае сеанс связи с почтовым сервером будет обрываться при срабатывании первого из ограничений, под которое попал клиент, и Вы даже не узнаете о потере возможно валидных сообщений и, соответственно, не сможете оперативно изменить настройки для их беспрепятственной доставки.
В связи с использованием отложенной обработки ограничений можно поместить все ограничения доступа к почтовому серверу на этапах установки соединения, получения команд HELO/EHLO и MAIL FROM в раздел, описывающий ограничения доступа на этапе получения команды RCPT TO, оставив пустыми остальные из перечисленных разделов:

smtpd_client_restrictions =
smtpd_helo_restrictions =
smtpd_sender_restrictions =
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination,
  reject_unauth_pipelining,
  check_client_access hash:/usr/local/etc/postfix/access_client,
  check_client_access pcre:/usr/local/etc/postfix/access_client.pcre,
  reject_unknown_client_hostname,
  check_helo_access hash:/usr/local/etc/postfix/access_helo,
  reject_invalid_helo_hostname,
  reject_non_fqdn_helo_hostname,
  reject_unknown_helo_hostname,
  check_sender_access hash:/usr/local/etc/postfix/access_sender,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  reject_unverified_sender,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unverified_recipient,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client combined.njabl.org,
  reject_rbl_client dnsbl.njabl.org,
  reject_rbl_client dul.ru,
  reject_rbl_client dynablock.njabl.org,
  reject_rbl_client opm.blitzed.org,
  reject_rhsbl_client blackhole.securitysage.com,
  reject_rhsbl_client rhsbl.sorbs.net,
  reject_rhsbl_sender blackhole.securitysage.com,
  reject_rhsbl_sender rhsbl.sorbs.net,
  permit

Указанные ограничения доступа имеют следующие значения: permit_mynetworks — разрешить доступ из доверенных сетей, permit_sasl_authenticated — разрешить доступ клиентам, прошедшим процедуру аутентификации SMTP, reject_unauth_destination — если наш сервер является конечной точкой следования почтового сообщения (сервер может быть релеем для других доменов, но в нашем случае эта возможность не используется) запретить отправку сообщений, получатели которых находятся за пределами доменов, описанных в параметрах $mydestination, $inet_interfaces и $virtual_maps (говоря другими словами, запретить Postfix быть открытым релеем), reject_unauth_pipelining — запретить некорректное использование команд конвейерной обработки, check_client_access hash:... — проверить, разрешен ли доступ в файле, являющемся параметром данного ограничения (файл access_client имеет формат, описанный в access(5), его содержимое и рекомендации по использованию приведены ниже), check_client_access pcre:... — ограничение аналогично предыдущему за исключением того, что используется другой формат файла (файл access_client.pcre имеет формат, описанный в pcre_table(5), его содержимое приведено ниже), reject_unknown_client_hostname — запретить доступ клиентам, не зарегистрированным в DNS, check_helo_access hash:... — проверить, разрешено ли выданное клиентом приветствие в файле, являющемся параметром данного ограничения (файл имеет формат, описанный в access(5), его содержимое и рекомендации по использованию приведены ниже), reject_invalid_helo_hostname — запретить доступ, если имя хоста, содержащееся в выданном клиентом приветствии, имеет некорректный синтаксис, reject_non_fqdn_helo_hostname — запретить доступ, если имя хоста, содержащееся в выданном клиентом приветствии, не является FQDN, reject_unknown_helo_hostname — запретить доступ, если для имени хоста, содержащемся в выданном клиентом приветствии, не существует A или MX запись в DNS, check_sender_access hash:... — проверить, разрешен ли адрес отправителя сообщения в файле, являющемся параметром данного ограничения (файл имеет формат, описанный в access(5), его содержимое и рекомендации по использованию приведены ниже), reject_non_fqdn_sender — запретить доступ, если адрес отправителя сообщения имеет некорректный формат, reject_unknown_sender_domain — запретить доступ, если для имени домена адреса отправителя не существует A или MX запись в DNS, reject_unverified_sender — запретить доступ, если адрес отправителя не может быть проверен (механизм проверки описан в Postfix Address Verification Howto), reject_non_fqdn_recipient, — запретить доступ, если адрес получателя сообщения имеет некорректный формат, reject_unknown_recipient_domain — запретить доступ, если для имени домена адреса получателя не существует A или MX запись в DNS, reject_unverified_recipient, — запретить доступ, если адрес получателя не может быть проверен (механизм проверки описан в Postfix Address Verification Howto), reject_rbl_client — проверить адрес сети клиента по блэклисту, адрес которого является параметром данного ограничения, reject_rhsbl_client — проверить имя домена клиента по блэклисту, адрес которого является параметром данного ограничения, reject_rhsbl_sender — проверить имя домена, содержащееся в адресе отправителя, по блэклисту, адрес которого является параметром данного ограничения, permit — разрешить доступ. Внимание, список блэклистов, а также их использование на этапе анализа заголовков сообщений, — спорный вопрос. Я исходил из соображений экономии трафика и минимизации нагрузки на процессор сервера со стороны ПО, анализирующего текст сообщений.
Далее следует запретить использование команды ETRN из-за пределов доверенных сетей:

smtpd_etrn_restrictions =
  permit_mynetworks,
  reject

После сохранения файла main.cf необходимо создать файлы access_client, access_client.pcre, access_helo и access_sender:

touch access_client access_client.pcre access_helo access_sender

Файл access_client предназначен в основном для разрешения доступа с хостов, которые не зарегистрированы в DNS (в России таких немало), или попали в какой-либо блэклист (среди таких часто оказываются бесплатные почтовые системы, доски объявлений, форумы и т.п.). Для таких хостов необходимо задать правила вида <IP-адрес> OK и/или hostname OK. Для того, чтобы запретить доступ какому-либо клиенту, необходимо использовать REJECT вместо OK. После изменения файла access_client необходимо выполнить команду postmap access_client.
Файл access_client.pcre предназначен для блокировки абонентов Dial-Up, кабельных и xDSL сетей, которые не сочли нужным зарегистрировать «нормальное» имя в DNS. Большая часть таких абонентов — СПАМеры. Если Вам все же нужно принимать сообщения от одного из таких абонентов, добавьте его имя хоста или IP-адрес в файл access_client, рассмотренный выше. Файл access_client.pcre имеет следующее содержимое (коды ошибок и сообщения, выдаваемые при блокировке клиентов, можно изменить на свое усмотрение):

/[ax]dsl.*\..*\..*/i REJECT Your message looks like SPAM
/\.dsl.*\..*\..*/i   REJECT Your message looks like SPAM
/cable.*\..*\..*/i   REJECT Your message looks like SPAM
/client.*\..*\..*/i  REJECT Your message looks like SPAM
/dhcp.*\..*\..*/i    REJECT Your message looks like SPAM
/dial.*\..*\..*/i    REJECT Your message looks like SPAM
/dialup.*\..*\..*/i  REJECT Your message looks like SPAM
/dslam.*\..*\..*/i   REJECT Your message looks like SPAM
/host.*\..*\..*/i    REJECT Your message looks like SPAM
/node.*\..*\..*/i    REJECT Your message looks like SPAM
/pool.*\..*\..*/i    REJECT Your message looks like SPAM
/ppp.*\..*\..*/i     REJECT Your message looks like SPAM
/user.*\..*\..*/i    REJECT Your message looks like SPAM

Файл access_helo предназначен для блокировки абонентов, выдающих в приветствии имена, связанные с localhost, или одно из FQDN нашего сервера. Большая часть таких абонентов — СПАМеры. Также в данном файле можно разрешить доступ клиентам, выдающим некорректное приветствие, от которых все же нужно получать сообщения. Мой файл access_helo имеет следующее содержимое:

127.0.0.1             REJECT Your server configured incorrectly
localhost             REJECT Your server configured incorrectly
localhost.localdomain REJECT Your server configured incorrectly
localhost.domain.com  REJECT Your server configured incorrectly
10                    REJECT Your server configured incorrectly
172.16                REJECT Your server configured incorrectly
192.168               REJECT Your server configured incorrectly
1.2.3.4               REJECT Your server configured incorrectly
name1.domain.com      REJECT Your server configured incorrectly
name2.domain.com      REJECT Your server configured incorrectly
name3.domain.com      REJECT Your server configured incorrectly
mail3.kc.sss          OK
prommkmos.PMK.local   OK
prommkmos2.PMK.local  OK

Первые 11 правил запрещают доступ клиентам, выдающим некорректное приветствие (domain.com необходимо заменить на FQDN нашего домена, 1.2.3.4 — на IP-адрес нашего сервера, а вместо name1.domain.comnameN.domain.com подставить все FQDN нашего сервера, заданные в DNS записями типа A и CNAME), 3 последних правила разрешают доступ нужным нам коряво настроенным клиентам (коды ошибок и сообщения, выдаваемые при блокировке клиентов, можно изменить на свое усмотрение). После изменения файла access_helo необходимо выполнить команду postmap access_helo.
Файл access_sender предназначен в основном для разрешения доступа отправителей, адреса или имена доменов которых попали в какой-либо блэклист, или удаленный сервер запрещает проверку их существования. Для разрешения доступа нужного отправителя или всех отправителей нужного домена необходимо добавить правила вида <Почтовый адрес отправителя> OK или @<Имя домена отправителя> OK, соответственно. После изменения файла access_sender необходимо выполнить команду postmap access_sender.
Осталось запретить получение сообщений, в которые вложены исполняемые файлы (файлы с расширением acm, ax, bat, bin, bpl, cat, chm, cmd, com, cpl, dat, dll, dpl, drv, exe, hlp, inf, ini, msc, nls, ocx, olb, pif, rom, scr, sys, tlb, vbs, vxd), которые, как правило, не рассылаются по электронной почте, поэтому очень вероятно, что это вирусы или троянские программы, а также трафикоемкие файлы, такие как аудиозаписи (файлы с расширением 669, aac, aif, aiff, amf, au, far, it, itz, kar, m3u, m4a, mdz, mid, midi, miz, mmf, mod, mp1, mp2, mp3, mp4, mtm, nsa, nst, ogg, okt, pls, ptm, rmi, s3m, s3z, snd, stm, stz, ult, voc, vaw, wma, xm, xmz) и видеоклипы (файлы с расширением asf, avi, m2v, mov, mpeg, mpg, nsv, qt, wmv). Для запрета отправки перечисленных файлов необходимо использовать механизм фильтрации заголовков почтовых сообщений, описанный в header_checks(5). В первую очередь необходимо указать в файле main.cf, где находятся файлы с правилами фильтрации не закодированных и закодированных MIME заголовков (данные файлы имеют формат, описанный в regexp_table(5)):

header_checks = regexp:/usr/local/etc/postfix/header_checks
mime_header_checks = regexp:/usr/local/etc/postfix/mime_header_checks

Затем необходимо создать файлы header_checks и mime_header_checks:

touch header_checks mime_header_checks

Файл header_checks должен содержать по одной строке для каждого типа файлов (ниже приведены две строки для файлов с расширениями com и ехе, для всех остальных типов файлов необходимо добавить аналогичные строки):

/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.com/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.exe/ REJECT

Файл mime_header_checks также должен содержать по одной строке для каждого типа файлов (ниже приведены две строки для файлов с расширениями com и ехе, для всех остальных типов файлов необходимо добавить аналогичные строки):

/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)com)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)exe)(\?=)?"?\s*$/ REJECT

По умолчанию при срабатывании правил, заданных в файлах header_checks и mime_header_checks, выдаются стандартные сообщения об ошибках 5.7.1 message content rejected. Для того, чтобы сделать их более информативными и позволяющими локализовать сработавшее правило необходимо добавить в файлы header_checks и mime_header_checks соответствующие описания ошибок (после слов REJECT), например, HCR_COM: Attached COM file(s) rejected и MHCR_COM: Attached COM file(s) rejected, соответственно.
Во многих источниках рекомендуется добавлять в файл header_checks правила, блокирующие сообщения, содержащие определенные поля в заголовке, например:

/^Bel-Tracking: .*/    REJECT
/^Hel-Tracking: .*/    REJECT
/^Kel-Tracking: .*/    REJECT
/^BIC-Tracking: .*/    REJECT
/^Lid-Tracking: .*/    REJECT
/^X-Mailer: Avalanche/ REJECT

Часто в файле header_checks задаются правила, которые удаляют определенные поля из заголовков сообщений, например, поле с запросом подтверждения прочтения, которое часто используется СПАМерами для подтверждения существования почтового адреса:

/^Disposition-Notification-To:/ IGNORE

На этом я заканчиваю описание настроек Postfix, обеспечивающих защиту от вирусов и СПАМа (чуть позже останется немного подправить файлы main.cf и macter.cf для стыковки Amavisd-New и Postfix). Конфигурация почтовой системы, полученная на данном этапе, вполне работоспособна, но я все же рекомендую не торопиться использовать ее, пока не будет установлено, настроено и подключено специальное ПО для борьбы с вирусами и СПАМом. Только совместно с ним можно реализовать максимально эффективную комплексную защиту.

Установка и настройка ClamAV

Установку ClamAV необходимо выполнить из портов:

cd /usr/ports/security/clamav
make install

В окне конфигурации, которое появляется в процессе выполнения команды make install, необходимо отметить опции: [X] ARC Enable arch archives support, [X] ARJ Enable arj archives support, [X] LHA Enable lha archives support и [X] UNZOO Enable zoo archives support. Если окно конфигурации не появилось, выполните команду make config. После завершения установки ClamAV необходимо создать два файла clamd.conf и freshclam.conf:

cd /usr/local/etc
touch clamd.conf freshclam.conf

Файл clamd.conf задает конфигурацию антивирусного демона clamd и имеет следующее содержимое:

LogFile /var/log/clamav/clamd.log
LogClean
LogTime
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/db/clamav
LocalSocket /var/run/clamav/clamd
FixStaleSocket
User clamav
AllowSupplementaryGroups
ScanPE
ScanOLE2
ScanMail
ScanHTML
ScanArchive
ScanRAR

Указанные параметры имеют следующие значения: LogFile — местонахождение лог-файла, LogClean — отображать в лог-файле не зараженные файлы, LogTime — отображать в лог-файле время выполнения всех операций, PidFile — местонахождение файла, содержащего идентификатор процесса clamd, DatabaseDirectory — местонахождение антивирусных баз, LocalSocket — местонахождение локального сокета, который «слушает» демон, FixStaleSocket — удалять сокет, оставшийся после некорректного завершения работы clamd, User — пользователь, от имени которого работает clamd, AllowSupplementaryGroups — учитывать права доступа для дополнительных групп, ScanPE, ScanOLE2, ScanMail, ScanHTML, ScanArchive и ScanRAR — сканировать PE-EXE файлы Win32, объекты OLE2, почтовые сообщения, гипертекстовые документы, архивы и архивы RAR, соответственно.
Файл freshclam.conf задает конфигурацию системы обновления антивирусных баз freshclam и имеет следующее содержимое:

DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups
DatabaseMirror database.clamav.net
Checks 8
NotifyClamd

Указанные параметры имеют следующие значения: DatabaseDirectory — местонахождение антивирусных баз, UpdateLogFile — местонахождение лог-файла, PidFile — местонахождение файла, содержащего идентификатор процесса freshclam, DatabaseOwner — пользователь — владелец антивирусных баз, AllowSupplementaryGroups — учитывать права доступа для дополнительных групп, DatabaseMirror — источник получения обновлений антивирусных баз, Checks — количество проверок появления обновлений (в нашем случае 8 раз за сутки или каждые 3 часа), NotifyClamd — извещать clamd о том, что антивирусные базы обновились.
Для того, чтобы clamd и freshclam запускались при загрузке операционной системы, необходимо добавить в файл /etc/rc.conf следующие строки:

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

На этом настройка ClamAV заканчивается. Можно запустить clamd (командой /usr/local/etc/rc.d/clamd.sh start) и freshclam (командой /usr/local/etc/rc.d/freshclam.sh start) и посмотреть сообщения, которые пишутся в /var/log/clamav/clamd.log и /var/log/clamav/freshclam.log, соответственно.

Установка и настройка DCC

Установку DCC необходимо выполнить из портов:

cd /usr/ports/mail/dcc-dccd
make install

Какая-либо дополнительная настройка не требуется. Работоспособность DCC можно проверить, выполнив команду cdcc 'info'. Внимание, для корректной работы DCC Ваш брандмауэр должен разрешать прохождение UDP-трафика с 6277 порта серверов, находящихся во внешней сети, поэтому добавьте соответствующие правила, если они отсутствуют.

Установка и настройка Pyzor

Установку Pyzor необходимо выполнить из портов:

cd /usr/ports/mail/pyzor
make install

После завершения установки Pyzor необходимо выполнить команду pyzor discover, после чего в Вашей домашней папке появится папка .pyzor, а в ней файл servers. На данном этапе настройка Pyzor заканчивается.

Установка и настройка Razor-Agents

Установку Razor-Agents необходимо выполнить из портов:

cd /usr/ports/mail/razor-agents
make install

После завершения установки Razor-Agents необходимо выполнить команды razor-admin -create и razor-admin -register, после чего в Вашей домашней папке появится папка .razor, а в ней несколько файлов. На данном этапе настройка Razor заканчивается.

Установка и настройка SpamAssassin

В первую очередь проверьте версию интерпретатора Perl, установленного в системе по умолчанию, по команде perl -v. Если она меньше 5.8, Вам необходимо установить Perl 5.8 из портов и сделать его обработчиком Perl по умолчанию:

cd /usr/ports/lang/perl5.8
make install
cd work
chmod +x use.perl
./use.perl port

Установку SpamAssassin необходимо выполнить из портов:

cd /usr/ports/mail/p5-Mail-SpamAssassin
make install

В окне конфигурации, которое появляется в процессе выполнения команды make install, дополнительно к отмеченным по умолчанию необходимо отметить опции: [X] MYSQL Add MySQL support и [X] RAZOR Add Vipul's Razor support. Если окно конфигурации не появилось, выполните команду make config. После завершения установки SpamAssassin необходимо создать базу данных spamassasin и пользователя spamassassin для работы с ней. Запустите клиент MySQL по команде mysql -u <имя пользователя-администратора> -p, введите пароль и выполните команды:

CREATE DATABASE spamassassin;
GRANT SELECT,INSERT,UPDATE,DELETE ON spamassassin.* TO spamassasin IDENTIFIED BY 'spamassassin';
FLUSH PRIVILEGES;

После закрытия клиента MySQL необходимо создать таблицы базы данных spamassassin:

cd /usr/local/share/doc/p5-Mail-SpamAssassin/sql
mysql -u <имя пользователя-администратора> -p spamassassin > awl_mysql.sql
mysql -u <имя пользователя-администратора> -p spamassassin > bayes_mysql.sql
mysql -u <имя пользователя-администратора> -p spamassassin > userpref_mysql.sql

После завершения создания базы данных spamassassin следует отредактировать главный файл конфигурации local.cf, по умолчанию находящийся в папке /usr/local/etc/mail/spamassassin. Содержимое данного файла приведено ниже (подробное описание всех опций, которые можно задать в файле local.cf, можно получить по команде perldoc Mail::SpamAssassin::Conf):

report_safe              0
ok_locales               en ru
trusted_networks         127. 192.168.0.
use_pyzor                1
use_razor2               1
skip_rbl_checks          0
dns_available            yes
use_bayes                1
use_bayes_rules          1
bayes_auto_learn         1
auto_whitelist_factory   Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn             DBI:mysql:spamassassin:localhost
user_awl_sql_username    spamassassin
user_awl_sql_password    spamassassin
bayes_store_module       Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn            DBI:mysql:spamassassin:localhost
bayes_sql_username       spamassassin
bayes_sql_password       spamassassin
user_scores_dsn          DBI:mysql:spamassassin:localhost
user_scores_sql_username spamassassin
user_scores_sql_password spamassassin

Указанные параметры имеют следующие значения: report_safe — режим модификации сообщения, если оно расценено как СПАМ (в нашем случае такую модификацию выполняет Amavisd-New), ok_locales — разрешенные языки сообщений, trusted_networks — список доверенных сетей (сообщения, отправленные из этих сетей не могут быть расценены как СПАМ), use_pyzor — использовать Pyzor при проверке сообщений, use_razor2 — использовать Razor-Agents при проверке сообщений, skip_rbl_checks — отключить проверку сообщений по блэклистам (в нашем случае проверка включена), dns_available — доступность службы DNS (по умолчанию SpamAssassin проверяет доступность DNS, предполагая наличие возможных проблем с сетью, в нашем случае проверки отключены), use_bayes — использовать Bayes-алгоритмы при проверке сообщений, use_bayes_rules — использовать «родные» правила Bayes совместно с правилами, полученными в процессе обучения, bayes_auto_learn — использовать автоматическое обучение Bayes, auto_whitelist_factory — модуль доступа к источнику данных, содержащему таблицу AWL, user_awl_dsn — имя источника данных, содержащего таблицу AWL, user_awl_sql_username и user_awl_sql_password — имя пользователя и пароль для доступа к источнику данных, содержащему таблицу AWL, bayes_store_module — модуль доступа к источнику данных, содержащему таблицы Bayes, bayes_sql_dsn — имя источника данных, содержащего таблицы Bayes, bayes_sql_username и bayes_sql_password — имя пользователя и пароль для доступа к источнику данных, содержащему таблицы Bayes, user_scores_dsn — источник данных, содержащий таблицу пользовательских настроек, user_scores_sql_username и user_scores_sql_password — имя пользователя и пароль для доступа к источнику данных, содержащему таблицу пользовательских настроек. Проверить синтаксис файла local.cf можно командой spamassassin --lint.
Для включения поддержки DCC необходимо раскомментировать строку loadplugin Mail::SpamAssassin:: Plugin::DCC в файле /usr/local/etc/mail/spamassassin/v310.pre.
На данном этапе настройка SpamAssassin заканчивается. Внимание, алгоритмы Bayes начнут работать не сразу, а только после накопления достаточного количества данных, происходящего в процессе самообучения. Для максимальной эффективности SpamAssassin нужно дополнительно обучить. Для этого требуется накопить несколько сотен «нормальных» сообщений и несколько сотен сообщений, являющихся СПАМом (по умолчанию по 200 сообщений). Когда сообщения накоплены, необходимо выполнить команды:

sa-learn --ham <файл в формате mailbox / папка, содержащая сообщения в формате msg>
sa-learn --spam <файл в формате mailbox / папка, содержащая сообщения в формате msg>

Установка и настройка Amavisd-New

Установку Amavisd-New необходимо выполнить из портов:

cd /usr/ports/security/amavisd-new
make install

В окне конфигурации, которое появляется в процессе выполнения команды make install, необходимо отметить опции: [X] BDB Use BerkeleyDB for nanny/cache/snmp, [X] SPAMASSASSIN Use mail / p5-Mail-SpamAssassin, [X] File Use newer file(1) utility from ports, [X] UNRAR RAR support with archives/unrar и [X] ARJ support with archivers/arj. Если окно конфигурации не появилось, выполните команду make config. После завершения установки необходимо отредактировать файл конфигурации amavisd.conf, находящийся в папке /usr/local/etc. В моем случае данный файл имеет следующее содержимое:

use strict;
#############################################################################
# Section I - Essential daemon and MTA settings #############################
#############################################################################
$MYHOME = '/var/amavis';
$mydomain = 'domain.com';
$daemon_user = 'vscan';
$daemon_group = 'vscan';
$TEMPBASE = ";$MYHOME/tmp";
$db_home = "$MYHOME/db";
$helpers_home = $MYHOME;
$pid_file = "$MYHOME/amavisd.pid";
$lock_file = "$MYHOME/amavisd.lock";
$ENV{TMPDIR} = $TEMPBASE;
$enable_db = 1;
$enable_global_cache = 1;
$forward_method = 'smtp:[127.0.0.1]:10025';
$notify_method = $forward_method;
$max_servers = 2;
$max_requests = 10;
$child_timeout= 20*60;
@local_domains_acl = (".");
#############################################################################
# Section II - MTA specific #################################################
#############################################################################
$insert_received_line = 1;
$unix_socketname = "$MYHOME/amavisd.sock";
$inet_socket_port = 10024;
@inet_acl = qw(127.0.0.1);
#############################################################################
# Section III - Logging #####################################################
#############################################################################
$DO_SYSLOG = 1;
$SYSLOG_LEVEL = 'mail.info';
$log_level = 0;
$log_recip_templ = undef;
#############################################################################
# Section IV - Notifications/DSN, bounce/reject/discard/pass, quarantine ####
#############################################################################
$hdr_encoding = 'koi8-r';
$bdy_encoding = 'koi8-r';
$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_DISCARD;
$final_spam_destiny = D_DISCARD;
$final_bad_header_destiny = D_PASS;
$warnvirussender = 0;
$warnspamsender = 0;
$warnbannedsender = 0;
$warnbadhsender = 0;
$warnvirusrecip = 0;
$warnbannedrecip = 0;
$warnbadhrecip = 0;
$warn_offsite = 0;
$virus_admin = "virusalert\@$mydomain";
$spam_admin = "spamalert\@$mydomain";
$mailfrom_notify_admin = "virusalert\@$mydomain";
$mailfrom_notify_recip = "virusalert\@$mydomain";
$mailfrom_notify_spamadmin = "spamalert\@$mydomain";
$mailfrom_to_quarantine = 'virus or spam';
$QUARANTINEDIR = '/var/virusmails';
$virus_quarantine_method = 'local:virus-%i-%n';
$spam_quarantine_method = 'local:spam-%i-%n';
$virus_quarantine_to = 'virus-quarantine';
$spam_quarantine_to = 'spam-quarantine';
$X_HEADER_TAG = 'X-Virus-Scanned';
$X_HEADER_LINE = "by Amavisd-New and ClamAV at mail.domain.com";
$remove_existing_x_scanned_headers = 1;
$remove_existing_spam_headers = 1;
#############################################################################
# Section V - Per-recipient and per-sender handling, whitelisting, etc. #####
#############################################################################
$sql_select_white_black_list = undef;
$recipient_delimiter = '+';
$localpart_is_case_sensitive = 0;
#############################################################################
# Section VI - Resource limits ##############################################
#############################################################################
$MAXLEVELS = 14;
$MAXFILES = 1500;
$MIN_EXPANSION_QUOTA = 100*1024;
$MAX_EXPANSION_QUOTA = 300*1024*1024;
$MIN_EXPANSION_FACTOR = 5;
$MAX_EXPANSION_FACTOR = 500;
$virus_check_negative_ttl = 3*60;
$virus_check_positive_ttl = 30*60;
$spam_check_negative_ttl = 30*60;
$spam_check_positive_ttl = 30*60;
#############################################################################
# Section VII - External programs, virus scanners ###########################
#############################################################################
$bypass_decode_parts = 1;
$path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin';
$file = 'file';
$dspam = 'dspam';
@decoders = (
  ['mail', \&do_mime_decode],
  ['asc', \&do_ascii],
  ['uue', \&do_ascii],
  ['hqx', \&do_ascii],
  ['ync', \&do_ascii],
  ['F', \&do_uncompress, ['unfreeze','freeze -d','melt','fcat'] ],
  ['Z', \&do_uncompress, ['uncompress','gzip -d','zcat'] ],
  ['gz', \&do_gunzip],
  ['gz', \&do_uncompress, 'gzip -d'],
  ['bz2', \&do_uncompress, 'bzip2 -d'],
  ['lzo', \&do_uncompress, 'lzop -d'],
  ['rpm', \&do_uncompress, ['rpm2cpio.pl','rpm2cpio'] ],
  ['cpio', \&do_pax_cpio, ['pax','gcpio','cpio'] ],
  ['tar', \&do_pax_cpio, ['pax','gcpio','cpio'] ],
  ['tar', \&do_tar],
  ['deb', \&do_ar, 'ar'],
  ['zip', \&do_unzip],
  ['rar', \&do_unrar, ['rar','unrar'] ],
  ['arj', \&do_unarj, ['arj','unarj'] ],
  ['arc', \&do_arc, ['nomarch','arc'] ],
  ['zoo', \&do_zoo, 'zoo'],
  ['lha', \&do_lha, 'lha'],
  ['cab', \&do_cabextract, 'cabextract'],
  ['tnef', \&do_tnef_ext, 'tnef'],
  ['tnef', \&do_tnef],
  ['exe', \&do_executable, ['rar','unrar'], 'lha', ['arj','unarj'] ],
);
$sa_local_tests_only = 0;
$sa_mail_body_size_limit = 256*1024;
$sa_spam_modifies_subj = 1;
$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt = 2;
$sa_tag2_level_deflt = 8;
$sa_kill_level_deflt = 10;
@av_scanners = (
['ClamAV-Clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
@av_scanners_backup = (
  ['ClamAV-ClamScan', 'clamscan',
  "--stdout --disable-summary -r --tempdir=$TEMPBASE {}", [0], [1],
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
#############################################################################
# Section VIII - Debugging ##################################################
#############################################################################
@debug_sender_acl = ( "root\@$mydomain" );
$sa_debug = 0;
1;

Значения и возможные варианты задания всех параметров, содержащихся в файле amavisd.conf, достаточно подробно описаны в файле /usr/local/etc/amavisd.conf.dist. Для того, чтобы Amavisd-New корректно заработал с приведенным файлом конфигурации, достаточно изменить domain.com на FQDN Вашего домена и определить псевдонимы пользователей spamalert и virusalert в файле alieses. Если в процессе отладки возникнет необходимость полностью отключить функции защиты от СПАМа, добавьте строку @bypass_spam_checks_maps = (1);, для полного отключения защиты от вирусов предназначена строка @bypass_virus_checks_maps = (1);. Внимание, параметры $sa_tag_level_deflt (оценка, при которой к заголовкам сообщений добавляются соответствующие X-Spam-тэги), $sa_tag2_level_deflt (оценка, при которой сообщения помечаются как СПАМ), $sa_kill_level_deflt (оценка, при которой с сообщениями выполняется предопределенные действия, в нашем случае уничтожение) имеют достаточно гуманные значения, которые вполне меня устраивают. Чем сильнее Вы уменьшите эти числа, тем лучше будет фиксироваться СПАМ, но одновременно возрастет вероятность потери валидных сообщений. Лучше всего определить эти значения экспериментальным путем. Я не буду описывать все строки файла amavisd.conf. Во-первых, их слишком много, а во-вторых, их досконально описали гораздо раньше меня. Лично я пользовался статьей Создание почтовой системы на базе exim, dbmail, amavisd-new и postgresql, которую настоятельно рекомендую и Вам для осуществления более тонкой настройки Amavisd-New.
Для того, чтобы SpamAssassin, запускаемый Amavisd-New, мог использовать Pyzor и Razor-Agents необходимо переместить папки, содержащие их конфигурационные файлы, в домашнюю папку пользователя vscan, от имени которого работает Amavisd-New, и изменить их владельца:

cd /var/amavis
mv ~/.pyzor .
mv ~/.razor .
chown -R vscan:vscan .pyzor .razor

Для того, чтобы демон clamd имел доступ ко временной папке Amavisd-New, необходимо добавить пользователя clamav в группу vscan:

pw groupmod vscan -M clamav

Для того, чтобы Postfix корректно взаимодействовал с Amavisd-New, т.е. отправлял сообщения для проверки на 10024 порт локального интерфейса, который «слушает» Amavisd-New, и принимал их назад на 10025 порте локального интерфейса, необходимо добавить в файл /usr/local/etc/postfix/main.cf строки:

content_filter=smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

и в файл /usr/local/etc/postfix/master.cf строки:

smtp-amavis unix - - n - 4 smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
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_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -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

Для того, чтобы Amavisd-New запускался при загрузке операционной системы необходимо добавить в файл /etc/rc.conf строку:

amavisd_enable = "YES"

На этом настройка Amavisd-New заканчивается. Можно запустить его командой /usr/local/etc/rc.d/amavisd.sh start и посмотреть сообщения, которые пишутся в /var/log/maillog. Естественно, нужно перезапустить и Posfix. Если ошибки отсутствуют, то в заголовках сообщений теперь можно увидеть поля X-Virus-Scanned, X-Spam-Scope, X-Spam-Level и X-Spam-Status, а в папке /var/virusmails отвергнутые сообщения.

Установка и настройка Pflogsumm

Установку Pflogsumm необходимо выполнить из портов:

cd /usr/ports/mail/pflogsumm
make install

Какая-либо дополнительная настройка не требуется. Остается создать несколько скриптов, заставляющих pflogsumm формировать отчеты за заданные интервалы времени, и обеспечить их запуск с помощью cron. В моей системе ежедневный отчет обновляется каждый час в течение рабочего дня, а также один раз в начале следующего дня (чтобы добавить информацию о том, что произошло после завершения рабочего дня до полуночи включительно). Для хранения отчетов я использую папку pflogsumm, находящуюся в корневой папке одного из виртуальных хостов Apache (в моем случае этот виртуальный хост служит исключительно для доступа к различным статистическим отчетам о работе служб коммуникационного сервера, конфигурация данного виртуального хоста приведена ниже). Папка pflogsumm содержит три вложенных папки. Вложенная папка current содержит ежедневные отчеты за текущий месяц, previous — ежедневные отчеты за предыдущий месяц, archive — архивы отчетов за предыдущие месяцы (один tar.bz2-файл за каждый месяц, содержащий соответствующие ежедневные отчеты).
Для формирования / обновления ежедневных отчетов в течение рабочего дня служит скрипт account.hourly, имеющий следующее содержимое:

#!/bin/sh
srvroot=<Путь к корневой папке виртуального хоста>
echo -e "$srvroot/pflogsumm/current/\n$(date "+%d-%m-%Y")" > /tmp/pflogsumm.name
/usr/local/bin/pflogsumm -d today /var/log/maillog --smtpd_stats --mailq --problems_first --rej_add_from --verbose_msg_detail --iso_date_time < `tr -d "\n" < /tmp/pflogsumm.name`
rm /tmp/pflogsumm.name

Для обновления ежедневных отчетов в начале следующего дня служит скрипт account.daily, имеющий следующее содержимое:

#!/bin/sh
srvroot=<Путь к корневой папке виртуального хоста>
/usr/bin/zcat /var/log/maillog.0.gz > /tmp/pflogsumm.maillog
echo -e "$srvroot/pflogsumm/current/\n$(date -v-1d "+%d-%m-%Y")" > /tmp/pflogsumm.name
/usr/local/bin/pflogsumm -d yesterday /tmp/pflogsumm.maillog --smtpd_stats --mailq --problems_first --rej_add_from --verbose_msg_detail --iso_date_time > `tr -d "\n" < /tmp/pflogsumm.name`
rm /tmp/pflogsumm.maillog /tmp/pflogsumm.name

Для упаковки ежедневных отчетов за предыдущий месяц и переноса их в архив, а также для переноса отчетов за текущий месяц в папку отчетов за предыдущий месяц в первый день месяца служит скрипт account.monthly, имеющий следующее содержимое:

#!/bin/sh
arcdate=$(date -v-2m "+%m.%Y")
srvroot=<Путь к корневой папке виртуального хоста>
cd $srvroot/pflogsumm/previous
/usr/bin/tar -cf $srvroot/pflogsumm/archive/pflogsumm.$arcdate.tar --remove-files *
/usr/bin/bzip2 -f9 $srvroot/pflogsumm/archive/pflogsumm.$arcdate.tar
mv $srvroot/pflogsumm/current/* $srvroot/pflogsumm/previous

Для того, чтобы описанные скрипты запускались в нужное время (account.hourly ежедневно в 8:45, 9:45…20:45, account.daily ежедневно в 0:30, account.monthly ежемесячно 1 числа в 1:15), необходимо добавить в файл /etc/crontab строки:

45 8-20 * * * root <Путь к скрипту>/account.hourly
30 0    * * * root <Путь к скрипту>/account.daily
15 1    1 * * root <Путь к скрипту>/account.monthly

Конфигурация виртуального name-based хоста для доступа к статистическим отчетам имеет следующий вид:

<VirtualHost <IP-адрес>:80>
  ServerName stat.company.com
  DocumentRoot /data/httpd/stat-company-com/html
  ErrorLog /data/httpd/stat-company-com/logs/httpd-error.log
  CustomLog /data/httpd/stat-company-com/logs/httpd-access.log combined
  <Directory /data/httpd/stat-company-com/html/>
    AuthName "This server require authorization"
    AuthUserFile /usr/local/etc/apache/htpasswd
    AuthType Basic
    Require user <Список пользователей, которым разрешен доступ>
    Options Indexes
    Order deny,allow
    Deny from all
    Allow from ...
    Allow from ...
  </Directory>
</VirtualHost>

Вам нужно заменить stat.company.com на FQDN Вашего сервера, поставить реальные IP-адреса и добавить необходимых пользователей в файл htpasswd и в директиву Require user. О том, как это сделать, подробно написано в разделе Authentication, Authorization, and Access Control официальной документации Apache.
На этом настройка pflogsumm заканчивается. Остается перезапустить Apache командой apachectl restart. Теперь Вы можете в любой момент времени посмотреть состояние почтовой системы через браузер. Однако, если отчеты, сформированные pflogsumm, увидит руководство, в лучшем случае Вы заметите легкий испуг, в худшем — недоверие к Вам, как к специалисту.

Установка и настройка AWStats

Установку AWStats необходимо выполнить из портов:

cd /usr/ports/www/awstats
make install

Внимание, в моей системе папка, содержащая компоненты AWStats, находится в папке /usr/local, поэтому не забудьте исправить соответствующие пути в файлах конфигурации AWStats и Apache. Также не забудьте исправить stat.company.com и company.com на FQDN Вашего сервера и домена. Отчет AWStats о работе почтового сервера обновляется каждый час в течение рабочего дня, а также один раз в начале следующего дня (чтобы добавить информацию о том, что произошло после завершения рабочего дня до полуночи включительно). В связи с этим используются два файла конфигурации, которые в соответствующие моменты времени копируются в файл /etc/awstats/awstats.mail.conf.
Файл конфигурации /etc/awstats/awstats.postfix.conf, используемый при выполнении команд обновления базы данных AWStats в течение рабочего дня, имеет следующее содержимое:

#############################################################################
# MAIN SETUP SECTION
#############################################################################
LogFile="/usr/local/awstats/tools/maillogconvert.pl standard < /var/log/maillog |"
LogType=M
LogFormat="%time2 %email %email_r %host %host_r %method %url %code %bytesd"
DirData="/data/httpd/awstats"
DirCgi="/awstats"
DirIcons="/awstatsicons"
SiteDomain="mail.company.com"
HostAliases="127.0.0.1 localhost REGEX[company\.com$]"
AllowFullYearView=3
AllowToUpdateStatsFromBrowser=0
#############################################################################
# OPTIONAL ACCURACY SETUP SECTION
#############################################################################
LevelForBrowsersDetection=0
LevelForOSDetection=0
LevelForRefererAnalyze=0
LevelForRobotsDetection=0
LevelForWormsDetection=0
LevelForSearchEnginesDetection=0
LevelForFileTypesDetection=0
#############################################################################
# OPTIONAL APPEARANCE SETUP SECTION
#############################################################################
UseFramesWhenCGI=0
ShowSummary=HB
ShowMonthStats=HB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=0
ShowHostsStats=HBL
ShowAuthenticatedUsers=0
ShowRobotsStats=0
ShowEMailSenders=HBML
ShowEMailReceivers=HBML
ShowSessionsStats=0
ShowPagesStats=0
ShowFileTypesStats=0
ShowFileSizesStats=0
ShowBrowsersStats=0
ShowOSStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
ShowSMTPErrorsStats=1
#############################################################################
# PLUGINS
#############################################################################
LoadPlugin="decodeutfkeys"

Основное внимание следует уделить параметрам данного файла, содержащимся в секции MAIN SETUP SECTION. Эти параметры имеют следующие значения: LogFile — местонахождение лог-файла, используемого для получения данных, LogType — тип используемого лог-файла (в нашем случае лог-файл почтового сервера), LogFormat — формат используемого лог-файла (подробное описание данного параметра приведено в документе AWStats configuration directives / options), DirData — местонахождение базы данных AWStats, DirCgi — виртуальный путь (относительно FQDN сервера, через который осуществляется доступ к отчетам) к папке с CGI-скриптами AWStats, DirIcons — виртуальный путь (относительно FQDN сервера, через который осуществляется доступ к отчетам) к папке с пиктограммами, используемыми в отчетах AWStats, SiteDomain — «главное» FQDN сервера, HostAliases — все имена-псевдонимы сервера, AllowFullYearView — разрешение CLI и CGI формирования годовых отчетов (параметр предназначен для экономии процессорного времени, по умолчанию разрешено формирование только через командную строку, в нашем случае, как через командную строку, так и через браузер, т.к. особых тормозов ни в том, ни в другом случае я не заметил), AllowToUpdateStatsFromBrowser — разрешение обновления статистики через браузер (в нашем случае отключено по соображениям безопасности). Параметры, содержащиеся в секциях OPTIONAL ACCURACY SETUP SECTION и OPTIONAL APPEARANCE SETUP SECTION, задают некоторые режимы работы AWStats и внешний вид отчетов. Скорее всего Вам не придется изменять их значения. В разделе PLUGINS включен единственный плагин, предназначенный для корректного отображения UTF-символов в отчетах.
Для ежечасного обновления базы данных в течение рабочего дня необходимо добавить в скрипт account.hourly, рассмотренный выше, строки:

cp /etc/awstats/awstats.postfix.conf /etc/awstats/awstats.mail.conf
/usr/local/awstats/cgi-bin/awstats.pl -config=mail -update

Файл конфигурации /etc/awstats/awstats.postfix2.conf, используемый при выполнении команды обновления базы данных AWStats в начале следующего дня, отличается от рассмотренного выше только значением параметра LogFile, которое связано с автоматической ротацией лог-файлов почтового сервера. Параметр LogFile в данном случае должен иметь значение:

"/usr/bin/gzip -cd /var/log/maillog.0.gz | /usr/local/awstats/tools/maillogconvert.pl standard |"

Для обновления базы данных AWStats в начале следующего дня необходимо добавить в скрипт account.daily, рассмотренный выше, строки:

cp /etc/awstats/awstats.postfix2.conf /etc/awstats/awstats.mail.conf
/usr/local/awstats/cgi-bin/awstats.pl -config=mail -update

Затем необходимо добавить в конфигурацию виртуального хоста, предназначенного для доступа к отчетам AWStats следующие строки:

Alias /js/ "/usr/local/awstats/js/"
Alias /awstatsclasses "/usr/local/awstats/classes/"
Alias /awstatscss "/usr/local/awstats/css/"
Alias /awstatsicons "/usr/local/awstats/icons/"
ScriptAlias /awstats/ "/usr/local/awstats/cgi-bin/"
RedirectPermanent /awstats/mail http://stat.company.com/awstats/awstats.pl?config=mail

Директивы Alias и ScriptAlias задают виртуальные пути (относительно FQDN сервера, через который осуществляется доступ к отчетам) к папкам, содержащим компоненты, используемые в отчетах AWStats, директива RedirectPermanent используется для повышения удобства (по умолчанию для доступа к отчету AWStats о работе почтовой системы в браузере требуется ввести URL http://stat.company.com/awstats/awstats.pl?config=mail, в нашем случае — http://stat.company.com/awstats/mail). На этом настройка AWStats заканчивается. Остается перезапустить Apache и продемонстрировать руководству, как работает вверенная Вам почтовая система. Лично я не пользуюсь отчетами AWStats (применительно к почтовой системе, хотя, например, для анализа статистики доступа к Web-серверам AWStats, как мне кажется, незаменим), т.к. меня не беспокоит, кому и сколько писем отправляют менеджеры, однако для укрощения темперамента некоторых личностей красивые отчеты AWStats просто необходимы.

Заключение

Кажется, я написал все, что хотел или все, что вспомнил. Наверняка многие части описанной конфигурации можно оптимизировать и повысить их эффективность, что я возможно и сделаю, благодаря Вашим советам. Время показало, что статья оказалось в той или иной степени полезной многим IT-специалистам, столкнувшимся с проблемой борьбы со СПАМом. Если в процессе настройки у Вас возникнут проблемы, внимательно анализируйте лог-файлы и читайте обсуждение статьи на форуме OpenNET. Если ничего не помогает, задавайте мне вопросы, попробуем решить проблему вместе.

Понравилась статья?

 Подпишитесь на RSS или почтовую рассылку

 Присоединяйтесь в Google+ или Twitter

 Поделитесь ссылкой в социальной сети или блоге

FreeBSD: Почтовая система среднего офиса на базе Postfix: 172 комментария

  1. Прочитал вашу статью про настройку почтового сервера на базе postfix и еще некоторого софта — понравилось. Но так как у меня стоит Fedora 8 на серверах — небольшое дополнение. Скрипт для pflogsumm.daily там проще записать такой (связано со спецификой реализации утилиты data и хранения скриптов):

    #!/bin/sh
    dirpath=/var/www/html/logs/smtp/
    dirtemp=/tmp/
    dirlogs=/var/log/
    dirprog=/usr/sbin/
    echo "$dirpath" > $dirtemp/pflogsumm.name
    date "+%d-%m-%Y-%a" >> $dirtemp/pflogsumm.name
    rm -f $dirtemp/maillog.sum
    touch $dirtemp/maillog.sum
    for i in $(ls -t -r $dirlogs |grep maillog); do
    cat $dirlogs/$i >> $dirtemp/maillog.sum
    done
    $dirprog/pflogsumm -d yesterday $dirtemp/maillog.sum --smtpd_stats --mailq --problems_first --rej_add_from --verbose_msg_detail --iso_date_time > `tr -d "\n" < $dirtemp/pflogsumm.name`
    rm -f $dirtemp/pflogsumm.name
    rm -f $dirtemp/maillog.sum

    В цикле собираем из кучи небольших логов (они режутся по объему и не архивируются) полный, а потом его анализируем. И в имени файла за «вчера» добавляем название дня недели — очень выручает при анализе. 🙂

    • С Fedor’ой я не знаком, и данные скрипты совсем не моя заслуга (их основа взята из статья в «Системном администраторе» на которую я сослался). Т.к. приведенные мной варианты нас полностью устраивают, я сильно не заморачиваюсь по поводу их улучшения/оптимизации. Тем не менее спасибо за дополнение, которое может помочь пользователям других ОС.

  2. В статье указан параметр smtpd_tls_auth_only = yes, в этом случае sasl не работает, убил много времени пока понял в чем дело 🙂

    • В этом случае SASL работает только совместно с TLS, т.е. только при подключении на 465 порт. В моем случае так подключаются все клиенты, которые находятся за пределами локальной сети (из локальной сети — на 25 порт без аутентификации SMTP).

  3. Вопрос по настройке Постфикса + Спам Асасина! Все настроено, работает, но почему-то некоторые письма попадают в спам, при попытке показать их как не спам и пересылке их пользователям они все равно возвращаются обратно с той же пометкой (SPAM).

    • Быстрое, но неоптимальное решение — повысить оценки, при которых происходит пометка письма как СПАМа. Более сложное, но оптимальное решение — настроить whitelists в Amavisd-New и/или изменить оценки, которые ставит SpamAssassin при срабатывании определенных правил.

  4. Доброго времени суток!
    Прочитал инструкцию и делал практически все по ней. Правда пока в урезанном масштабе. Мне требуется для начала только чтобы спамассассин помечал сообщения как фильтр и постфикс отлуплял сообщения от тех, кто находится в блеклистах. Проверял ручками ИП в письме со спамом (он в блеклисте), а на сервер все равно падает и проходит по ящикам. Не понимаю почему возможна такая ситуация.
    FreeBSD 7 + Postfix почтовый шлюз, транслирует почту на внутренний сервер и переправляет исходящую почту. Постфикс версии 2.6. Не понятно почему он их не банит и пропускает.
    Кроме того во входящих письмах в заголовках нет ни строчки о том, что письмо прошло через антиспам систему.
    В юниксе пока я не очень силен, но обрубать спам нужно.
    Помогите пожалуйста чем сможете.

    • Здравствуйте!

      Мне требуется для начала только чтобы спамассассин помечал сообщения как фильтр и постфикс отлуплял сообщения от тех, кто находится в блеклистах.

      Для того, чтобы СПАМ помечался, но не резался, измените строку $final_spam_destiny = D_DISCARD; в файле /usr/local/etc/amavisd.conf на $final_spam_destiny = D_PASS;. Более подробно этот вопрос освещен в документе amavisd-new documentation bits and pieces.

      Проверял ручками ИП в письме со спамом (он в блеклисте), а на сервер все равно падает и проходит по ящикам. Не понимаю почему возможна такая ситуация. FreeBSD 7 + Postfix почтовый шлюз, транслирует почту на внутренний сервер и переправляет исходящую почту. Постфикс версии 2.6. Не понятно почему он их не банит и пропускает.

      Я не рекомендую добавлять СПАМеров в блэклисты. Последние предназначены больше для разрешения приема сообщений от коряво настроенных почтовых серверов. СПАМ итак гасится согласно достаточно жесткой политике. Однако, если возникает желание использовать блэклисты, то причин их «несрабатывания» только две — либо сообщения отправлены на адрес postmaster@ (а также не могут быть доставлены, и Postfix автоматом переслал их на postmaster@), либо Вы что-то сделали невнимательно. В настоящее время система работает под FreeBSD 7.0 на последних версиях портов (обновляются еженедельно). Поэтому вопросов по поводу версий возникать не должно.

      • В общем сделал в точности с Вашим описанием, но получилось так, что почта от нас вообще перестала уходить, правда в логах какая то часть писем стала прописываться как спам и отклоняться. А еще странное набдюдение попытался по 10024 порту подключиться в рабочей конфигурации и ничего не получилось. Заменил конфигурацию постфикса на рабочую, но с входящим спамом и подключение по 10024 появилось. Странно.

        • Еще раз повторяю — невнимательность. Посмотрите, что выдает команда sockstat -4 по поводу master, smtpd и amavis. Postfix должен слушать *:25, *:465; 127.0.0.1:10025, а amavis — 127.0.0.1:10024. Внимательно редактируйте файлы main.cf, master.cf и amavisd.conf, пока не добьетесь этого. Также очень внимательно смотрите отчеты pflogsumm. В процессе тестирования и отладки запустите на другой консоли отображение сообщений, которые пишутся в лог:

          tail -f /var/log/maillog

          • Доброго всем времени суток!
            Хочу отметить особую полезность данной инфы по настройке антиспама, 12 июня все починил и сделал как нужно. Теперь единственное неудобство, что вместо 16 писем в час приходит 4 письма спама в день. Неудобство в завышающейся самооценке. Собственно выражаю большое спасибо автору статей и ответов на вопросы. Единственное отмечу про свою первоначальную ошибку. Строя шлюз для почтовых сообщений перенаправлял все порты необходимые сразу на внутренний сервер почты, включая 25 порт. Потому у меня не было логов по входящей почте. За пару дней все настроил как следует и теперь меня все радует.
            Еще раз большое спасибо.

            • Доброго времени суток! Я очень рад, что сумел помочь Вам. Кстати, в связи с автоматическим обучением Bayes со временем СПАМа будет еще меньше 😉

              • Собственно прошла неделя наблюдений и возник вопрос. При просмотре заголовков входящих сообщений заинтересовал один момент, причем в трех вариациях:
                1. Большая часть спама — у нее проставляется оценка и все прочее;
                2. В основном полезные письма — в ней проставляется только Scanned by Amavisd…, оценок нет;
                3. Нашел в ящиках пользователей часть писем, причем такие письма приходят не ко всем, а строго к одному контингенту. У них в заголовках вообще нет даже Scanned by … и оценок. Вид такой будто отправлено из сети. Собственно заголовок:

                Return-Path:
                Received: by mx.atrend.ru (Postfix, from userid 95)
                id F37FC12878F; Tue, 24 Jun 2008 14:45:40 +0400 (MSD)
                Received: from eth-80.225-homell.natm.ru (eth-80.225-homell.natm.ru [89.252.80.225])
                by mx.atrend.ru (Postfix) with ESMTP id B49FD127AFB
                for ; Tue, 24 Jun 2008 14:44:38 +0400 (MSD)
                Received: from [89.252.80.225] by brake.com.s7b2.psmtp.com; Tue, 24 Jun 2008 13:45:46 +0300
                From: "Gregg Britton"
                To: Subject: =?koi8-r?B?7dkg0sHCz9TBxc0g0yDs4OL57ekg8fr56+Ht6SEg?=
                Date: Tue, 24 Jun 2008 13:45:46 +0300
                MIME-Version: 1.0
                Content-Type: multipart/alternative;
                boundary="----=_NextPart_000_0006_01C8D600.9A78A100"
                X-Mailer: Microsoft Office Outlook, Build 11.0.5510
                Thread-Index: Aca6QBFYS1L988IPDWD5868R017T45==
                X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4963.1700
                Message-ID: <01c8d600$9a78a100$e150fc59@oakgjb

                Вот и вопрос как они сюда попадают и почему не проставляется оценка?

                • 1. Большая часть спама — у нее проставляется оценка и все прочее;
                  2. В основном полезные письма — в ней проставляется только Scanned by Amavisd…, оценок нет;

                  Невнимательность! В статье отмечены параметры: $sa_tag_level_deflt — оценка, при которой к заголовкам сообщений добавляются соответствующие X-Spam-тэги, $sa_tag2_level_deflt — оценка, при которой сообщения помечаются как СПАМ, и $sa_kill_level_deflt — оценка, при которой с сообщениями выполняется предопределенные действия.

                  3. Нашел в ящиках пользователей часть писем, причем такие письма приходят не ко всем, а строго к одному контингенту. У них в заголовках вообще нет даже Scanned by … и оценок. Вид такой будто отправлено из сети. Собственно заголовок…

                  Из сети или не из сети, можно увидеть в логах.

  5. День добрый!
    Где поменять тело письма ответа сервера, о невозможности доставить письмо абоненту сервера Postfix + Amavisd-New?
    И еще один вопрос по SpamAssassin. В тело пишеться:

    X-Spam-Status: Yes, score=16.064 required=6 tests=[BAYES_99=10.8,
    HTML_MESSAGE=0.001, MSGID_FROM_MTA_HEADER=0.803,
    RAZOR2_CF_RANGE_51_100=0.5, RAZOR2_CF_RANGE_E4_51_100=1.5,
    RAZOR2_CHECK=0.5, RCVD_IN_BL_SPAMCOP_NET=1.96]

    Очень часть выдает такое значени BAYES_99=10.8 при score BAYES_99 0.0001 0.0001 3.5 3.5
    Откуда он берет эти данные?

    • Добрый день!

      Где поменять тело письма ответа сервера, о невозможности доставить письмо абоненту

      Соответствующие шаблоны сообщений о невозможности доставки можно изменить с помощью параметров $notify_sender_templ, $notify_virus_sender_templ, $notify_virus_admin_templ, $notify_virus_recips_templ, $notify_spam_sender_templ, $notify_spam_admin_templ. Читайте документацию и комментарии в файле amavisd.conf-sample. Настоятельно не рекомендую отправлять отлупы СПАМерам. Не следует лишний раз подтверждать валидность атакованных адресов 😉

      И еще один вопрос по SpamAssassin. В тело пишеться:

      X-Spam-Status: Yes, score=16.064 required=6 tests=[BAYES_99=10.8,
      HTML_MESSAGE=0.001, MSGID_FROM_MTA_HEADER=0.803,
      RAZOR2_CF_RANGE_51_100=0.5, RAZOR2_CF_RANGE_E4_51_100=1.5,
      RAZOR2_CHECK=0.5, RCVD_IN_BL_SPAMCOP_NET=1.96]

      Очень часть выдает такое значени BAYES_99=10.8 при score BAYES_99 0.0001 0.0001 3.5 3.5
      Откуда он берет эти данные?

      Bayes — интеллектуальные алгоритмы, которые еще и обучаются в процессе работы SpamAssassin. Как и какие оценки по ним выставляются, я не знаю (не было оснований изучать этот вопрос). Возможно Ваша база данных SpamAssassin еще не содержит нужное количество информации для работы Bayes, возможно Вам поможет дополнительное обучение. Это просто первое, что приходит в голову. Более подробную информацию о работе Bayes и о выставляемых оценках можно найти на сайте SpamAssassin.

  6. Настраивал почту по другой статье, потом увидел вашу статью и внес изменения в main.cf, создал файлики access_client, access_client.pcre, access_helo, access_sender, перезагрузил почтовик но ошибки, описанные после REJECT, в логах mail.err, mail.info, mail.log так и не появились (нету ни «Your message looks like SPAM», ни «Your server configured incorrectly»). Может я конечно чего не понимаю…Помогите пожалуйста…
    Вот кусок конфига сервера:

    myhostname = mail1.kuraga.ru
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    myorigin = /etc/mailname
    mydestination = mail1.kuraga.ru, localhost.kuraga.ru, kuraga.ru, localhost
    relayhost =
    mynetworks = 127.0.0.0/8 192.168.0.0/24
    mailbox_command = procmail -a "$EXTENSION"
    mailbox_size_limit = 0
    message_size_limit = 10485760
    mailbox_transport = lmtp:unix:/var/run/cyrus/socket/lmtp
    recipient_delimiter = +
    inet_interfaces = all
    local_recipient_maps =
    #new antispam preferense
    invalid_hostname_reject_code = 550
    non_fqdn_reject_code = 550
    unknown_address_reject_code = 550
    unknown_client_reject_code = 550
    unknown_hostname_reject_code = 550
    unverified_recipient_reject_code = 550
    unverified_sender_reject_code = 550
    strict_rfc821_envelopes = yes
    disable_vrfy_command = yes
    smtpd_helo_required = yes
    smtpd_delay_reject = yes
    smtpd_recipient_restrictions=
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_unauth_pipelining,
    check_client_access hash:/etc/postfix/access_client,
    check_client_access pcre:/etc/postfix/access_client.pcre,
    reject_unknown_client_hostname,
    check_helo_access hash:/etc/postfix/access_helo,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname,
    reject_unknown_helo_hostname,
    check_sender_access hash:/etc/postfix/access_sender,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    reject_unverified_sender,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unverified_recipient,
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client combined.njabl.org,
    reject_rbl_client dnsbl.njabl.org,
    reject_rbl_client dul.ru,
    reject_rbl_client dynablock.njabl.org,
    reject_rbl_client opm.blitzed.org,
    reject_rhsbl_client blackhole.securitysage.com,
    reject_rhsbl_client rhsbl.sorbs.net,
    reject_rhsbl_sender blackhole.securitysage.com,
    reject_rhsbl_sender rhsbl.sorbs.net,
    permit
    smtpd_etrn_restrictions =
    permit_mynetworks,
    reject
    #sasl
    smtpd_sasl_local_domain =
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_security_options = noanonymous
    broken_sasl_auth_clients = yes
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
    smtpd_sasl_authenicated_header = yes
    smtpd_sasl_application_name = smtpd
    content_filter=smtp-amavis:[127.0.0.1]:10024
    receive_override_options = no_address_mappings

    • Т.е. Вам шлют почту с адресов, которые попадают под шаблоны, описанные в access_client.pcre, и сервер их спокойно пропускает и ничего не пишет в лог? В первую очередь проверьте содержимое названного мной файла. Все должно совпадать со статьей до «закорючки»! У меня ежедневно отвергается по несколько тысяч таких попыток.

      • Ура! я нашел в чем был геморой… Провозился весь день.. Перечитал кучу литературы… А все дело было в лишней строчке smtpd_recipient_restrictions — в конфиге обратите внимание — их две… Вот постфикс и брал последнюю 🙂
        Теперь у меня другой вапрос — вот строчка лога:

        Jul 18 11:07:50 mail1 amavis[6939]: (06939-01) Passed CLEAN, [87.224.128.21] [87.224.250.120] -> , Message-ID: , mail_id: gA36NWKfuonw, Hits: -, queued_as: 6AB62C5823, 1186 ms

        Почему «Hits:» не стоит цифра? Или ето не то? Почему нету значений спамассасина… Razor… Pyzor… В конфигах я вообще не нашел ни у вас нигде либо еще — как цепляется к амавису спамассасин… Антивирь — видно… Его работа в логе тоже видна («Passed CLEAN»), а вот спамассассина нет или так и должно быть? Помогите пожалуйста…

        • А все дело было в лишней строчке smtpd_recipient_restrictions — в конфиге обратите внимание — их две )… Вот постфикс и брал последнюю 🙂

          Я посмотрел только на первую строку smtpd_recipient_restrictions. Она показалась мне вполне нормальной 🙂

          Почему «Hits:» не стоит цифра? Или ето не то? Почему нету значений спамассасина… Razor… Pyzor… В конфигах я вообще не нашел ни у вас нигде либо еще — как цепляется к амавису спамассасин… Антивирь — видно… Его работа в логе тоже видна (Passed CLEAN), а вот спамассасина нет или так и должно быть? Помогите пожалуйста…

          Антивирус ClamAV запускается в виде отдельного демона, слушающего заданный в конфигурации локальный сокет. SpamAssassin загружается как дополнительный Perl-модуль Amavisd-New. По поводу параметров ведения лога смотрите документацию Amavisd-New. Навскидку, попробуйте поменять $sa_debug = 0 на $sa_debug = 1 в amavisd.conf.


          • Jul 18 14:13:49 mail1 amavis[8743]: starting. /usr/sbin/amavisd-new at mail1.curaga.ru amavisd-new-2.4.2 (20060627), Unicode aware, LANG=ru_RU.UTF-8
            Jul 18 14:13:49 mail1 amavis[8743]: Perl version 5.008008
            Jul 18 14:13:49 mail1 amavis[8748]: Module Amavis::Conf 2.068
            Jul 18 14:13:49 mail1 amavis[8748]: Module Archive::Tar 1.30
            Jul 18 14:13:49 mail1 amavis[8748]: Module Archive::Zip 1.16
            Jul 18 14:13:49 mail1 amavis[8748]: Module BerkeleyDB 0.31
            Jul 18 14:13:49 mail1 amavis[8748]: Module Compress::Zlib 1.42
            Jul 18 14:13:49 mail1 amavis[8748]: Module Convert::TNEF 0.17
            Jul 18 14:13:49 mail1 amavis[8748]: Module Convert::UUlib 1.06
            Jul 18 14:13:49 mail1 amavis[8748]: Module Digest::MD5 2.36
            Jul 18 14:13:49 mail1 amavis[8748]: Module MIME::Entity 5.420
            Jul 18 14:13:49 mail1 amavis[8748]: Module MIME::Parser 5.420
            Jul 18 14:13:49 mail1 amavis[8748]: Module MIME::Tools 5.420
            Jul 18 14:13:49 mail1 amavis[8748]: Module Mail::Header 1.74
            Jul 18 14:13:49 mail1 amavis[8748]: Module Mail::Internet 1.74
            Jul 18 14:13:49 mail1 amavis[8748]: Module Net::Cmd 2.26
            Jul 18 14:13:49 mail1 amavis[8748]: Module Net::SMTP 2.29
            Jul 18 14:13:49 mail1 amavis[8748]: Module Net::Server 0.94
            Jul 18 14:13:49 mail1 amavis[8748]: Module Time::HiRes 1.86
            Jul 18 14:13:49 mail1 amavis[8748]: Module Unix::Syslog 0.100
            Jul 18 14:13:49 mail1 amavis[8748]: Amavis::DB code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Amavis::Cache code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: SQL base code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: SQL::Log code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: SQL::Quarantine NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Lookup::SQL code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Lookup::LDAP code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: AM.PDP-in proto code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: SMTP-in proto code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Courier proto code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: SMTP-out proto code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Pipe-out proto code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: BSMTP-out proto code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Local-out proto code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: OS_Fingerprint code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: ANTI-VIRUS code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: ANTI-SPAM code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: ANTI-SPAM-SA code NOT loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Unpackers code loaded
            Jul 18 14:13:49 mail1 amavis[8748]: Found $file at /usr/bin/file
            Jul 18 14:13:49 mail1 amavis[8748]: No $dspam, not using it
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .mail
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .asc
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .uue
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .hqx
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .ync
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .F tried: unfreeze, freeze -d, melt, fcat
            Jul 18 14:13:49 mail1 amavis[8748]: Found decoder for .Z at /bin/uncompress
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .gz
            Jul 18 14:13:49 mail1 amavis[8748]: Found decoder for .bz2 at /bin/bzip2 -d
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .lzo tried: lzop -d
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .rpm tried: rpm2cpio.pl, rpm2cpio
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .cpio tried: pax
            Jul 18 14:13:49 mail1 amavis[8748]: Found decoder for .cpio at /bin/cpio
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .tar tried: pax
            Jul 18 14:13:49 mail1 amavis[8748]: Found decoder for .tar at /bin/cpio
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .deb tried: ar
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .zip
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .rar tried: rar, unrar
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .arj tried: arj, unarj
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .arc tried: nomarch, arc
            Jul 18 14:13:49 mail1 amavis[8748]: Found decoder for .zoo at /usr/bin/zoo
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .lha tried: lha
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .doc tried: ripole
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .cab tried: cabextract
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .tnef
            Jul 18 14:13:49 mail1 amavis[8748]: Internal decoder for .tnef
            Jul 18 14:13:49 mail1 amavis[8748]: No decoder for .exe tried: rar, unrar; lha; arj, unarj

            Вот что нашел в сислоге 🙁

            • No decoder for…
              Вот что нашел в сислоге 🙁

              Внимательно отредактируйте Section VII - External programs, virus scanners в amavisd.conf. Посмотрите наличие и права доступа соответствующих утилит.
              P.S.: Не нужно торопиться! Сделайте все аккуратненько и забудьте 😉

  7. Доброго времени суток!
    С недавнего времени началась проблема и это странно. Заметил по пропавшим оценкам писем. В логах maillog пишется:

    ClamAV -... can't connect to unix socket /var/run/clamav/clamd.ctl.

    До этого все было замечательно, а теперь хз. По сути ощущается, что у какого то процесса не хватает доступа в каталог. Кстати, вторым сообщение пишется — ClamAV слишком много попыток обращения к файлу /var/run/clamav/clamd.ctl. Подскажите пожалуйста где и чего можно поправить?

    • Доброго времени суток! Имя сокета в файлах amavisd.conf и clamd.conf должно совпадать, пользователь clamav должен входить в состав группы vscan. Мне кажется, этого вполне достаточно 😉

      • Доброго настроения!
        Мне тоже так казалось, по всем пунктам так и есть, сокеты совпадают, clamav входит в vscan, но проблема есть. Попробую привести все сообщения в логе:

        (!) ClamAV-Clamd: Can't connect to UNIX socket /var/log/clamav/clamd.ctl: Socket operation on non-socket, retrying (2)
        (!)run_av (ClamAV-clamd, built i/f): Too many reties to talk to /var/log/clamav/clamd.ctl (Can't connect to UNIX socket /var/log/clamav/clamd.ctl: Socket operation on non-socket) at (eval 99) line 310, line 3967.
        (!!) WARN: all primary virus scanners failed, considering backups

        Вот так пишет постоянно. Чтобы с этим поделать?

        • Добрый вечер!
          Мне кажется, проблема кроется в «Socket operation on non-socket». Не могу предположить ничего, кроме настроек clamav, конкретно — демона clamd. Читайте документацию по clamd и разбирайтесь с параметрами сокета и правами доступа к нему. Сам не сталкивался с такой проблемой.

  8. Мне очень понравился ваш сайт, изложение материала о почтовом сервере, всё очень доступно.
    А не думали ли вы создать специализироанный дистрибутив почтового сервера на подобии: freenas, askoziapbx, ipcop?
    Я уверен что ваших знаний было бы очень достаточно, а проект пользовался немыслемым спросом, ибо малые предприятия в России да и за рубежом нуждаются в такого рода проекте.

    • А не думали ли вы создать специализироанный дистрибутив почтового сервера на подобии: freenas, askoziapbx, ipcop?

      К сожалению, на это нет времени.

      Описанная почтовая система на данный момент заметно изменилась. Есть желание описать новшества, но все никак не доходят руки. В будущем постараюсь исправиться 🙂

      • Очень прошу написать изменения.
        Буду очень благодарен….
        Ваша система просто золото…
        более подробной и надёжной системы я ещё не находил…

        • Очень прошу написать изменения.

          1. Администрирование осуществляется через PostfixAdmin, настроенный чуть шире, чем написано в русскоязычных статьях, ну и транспорты / домены / ящики / алиасы хранятся в базе MySQL.
          2. В качестве POP3/IMAP4-сервера используется Courier-IMAP с поддержкой всех наворотов IMAP, включая виртуальные общие папки.
          3. Система развернута под FreeBSD 7.0, поэтому есть много мелких изменений в названиях файлов и т.д. Антиспам принципиально не изменился. Кстати, теперь я обучаю SpamAssassin, помогает.

          К сожалению, написать статью про всю систему не представляется возможным из-за отсутствия времени (статья получится как минимум раза в два больше). Позже постараюсь написать про PostfixAdmin и Courier-IMAP. Если предыдущая версия системы уже есть, то апгрейд не доставит много хлопот…

  9. Но не могу пронять от куда может быть проблема?

    NOQUEUE: reject: RCPT from tx2ehsobe004.messaging.microsoft.com[65.55.88.14]: 550 5.7.1 <TX2EHSOBE007.bigfish.com>: Helo command rejected: Host not found; from=<natalia.yermilina@thomsonreuters.com> to=<tvphoto@tv.tv-park.ru> proto=ESMTP helo=<TX2EHSOBE007.bigfish.com>

    • Как в большинстве случаев, в невнимательности.

      "Helo command rejected: Host not found".

      Что здесь не понятно? Если почта должна ходить, пропишите приветствие (HELO) этого хоста в access_helo:

      TX2EHSOBE007.bigfish.com OK

  10. А подскажите где пользователи добавляются? В системе как обычный юзер или по другому? Просто до сих пор де я читал для пользователей была созданна база на mysql или postresql.

    • По умолчанию Postfix использует базу данных пользователей операционной системы, т.е. в FreeBSD пользователей нужно добавлять в /etc/master.passwd (любым удобным способом — вручную, с помощью vipw, pw useradd и т.д.). Естественно, этим пользователям нужно ставить домашнюю папку — /nonexistent и shell — /sbin/nologin. Если пользователей немного, делайте, как я сказал, в противном случае, ставьте PostfixAdmin и настраивайте хранение пользователей в БД (этот вариант удобнее во всех отношениях, однако, немного сложнее в настройке).

  11. Очень хорошая статья но есть вопрос по поводу razor и pyzor. В логе пишется вот это:
    Jan 14 18:56:27 relay spamd[71767]: razor2: razor2 check failed: No such file or directory razor2: razor2 had unknown error during get_server_info at /usr/local/lib/perl5/site_perl/5.8.9/Mail/SpamAssassin/Plugin/Razor2.pm line 188. at /usr/local/lib/perl5/site_perl/5.8.9/Mail/SpamAssassin/Plugin/Razor2.pm line 326.
    Jan 14 18:56:27 relay spamd[71767]: pyzor: check failed: internal error

    Как это исправить?

    • Судя по сообщениям, Razor не видят какие-то файлы, либо файлы конфигурации, либо проверяемые сообщения. Разберитесь с местонахождением и правами доступа к этим файлам. Учтите, что в статье описано использование SpamAssassin как дополнительного модуля Amavisd-New, а в Вашем случае SpamAssassin запускается как самостоятельный демон.

  12. пытаюсь подключится telnet-ом на 25 порт для проверки системы и получаю отлуп (thunderbird выдает: в подключение отказанно), где копать чтоб исправить?
    Jan 19 10:15:59 mira postfix/smtpd[1121]: connect from localhost[127.0.0.1]
    Jan 19 10:15:59 mira postfix/smtpd[1121]: setting up TLS connection from localhost[127.0.0.1]
    Jan 19 10:15:59 mira postfix/smtpd[1121]: localhost[127.0.0.1]: TLS cipher list "ALL:!EXPORT:!LOW:+RC4:@STRENGTH"
    Jan 19 10:15:59 mira postfix/smtpd[1121]: SSL_accept:before/accept initialization
    Jan 19 10:15:59 mira postfix/smtpd[1121]: read from 285039C0 [2857D000] (11 bytes => -1 (0xFFFFFFFF))
    Jan 19 10:16:05 mira postfix/smtpd[1121]: read from 285039C0 [2857D000] (11 bytes => 11 (0xB))
    Jan 19 10:16:05 mira postfix/smtpd[1121]: 0000 68 65 6c 6f 20 61 64 6f|6e 69 78 helo ado nix
    Jan 19 10:16:05 mira postfix/smtpd[1121]: SSL_accept:error in SSLv2/v3 read client hello A
    Jan 19 10:16:05 mira postfix/smtpd[1121]: SSL_accept error from localhost[127.0.0.1]: -1
    Jan 19 10:16:05 mira postfix/smtpd[1121]: warning: TLS library problem: 1121:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s23_srvr.c:571:
    Jan 19 10:16:05 mira postfix/smtpd[1121]: lost connection after CONNECT from localhost[127.0.0.1]
    Jan 19 10:16:05 mira postfix/smtpd[1121]: disconnect from localhost[127.0.0.1]
    Jan 19 10:16:21 mira postfix/smtpd[1121]: connect from localhost[127.0.0.1]
    Jan 19 10:16:21 mira postfix/smtpd[1121]: setting up TLS connection from localhost[127.0.0.1]
    Jan 19 10:16:21 mira postfix/smtpd[1121]: localhost[127.0.0.1]: TLS cipher list "ALL:!EXPORT:!LOW:+RC4:@STRENGTH"
    Jan 19 10:16:21 mira postfix/smtpd[1121]: SSL_accept:before/accept initialization
    Jan 19 10:16:21 mira postfix/smtpd[1121]: read from 285039C0 [2857D000] (11 bytes => -1 (0xFFFFFFFF))
    Jan 19 10:16:24 mira postfix/smtpd[1121]: read from 285039C0 [2857D000] (11 bytes => 10 (0xA))
    Jan 19 10:16:24 mira postfix/smtpd[1121]: 0000 73 74 61 72 74 74 6c 73|0d 0a starttls ..
    Jan 19 10:16:24 mira postfix/smtpd[1121]: read from 285039C0 [2857D00A] (1 bytes => -1 (0xFFFFFFFF))
    Jan 19 10:16:29 mira postfix/smtpd[1121]: read from 285039C0 [2857D00A] (1 bytes => 1 (0x1))
    Jan 19 10:16:29 mira postfix/smtpd[1121]: 0000 75 u
    Jan 19 10:16:29 mira postfix/smtpd[1121]: SSL_accept:error in SSLv2/v3 read client hello A
    Jan 19 10:16:29 mira postfix/smtpd[1121]: SSL_accept error from localhost[127.0.0.1]: -1
    Jan 19 10:16:29 mira postfix/smtpd[1121]: warning: TLS library problem: 1121:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s23_srvr.c:571:
    Jan 19 10:16:29 mira postfix/smtpd[1121]: lost connection after CONNECT from localhost[127.0.0.1]
    Jan 19 10:16:29 mira postfix/smtpd[1121]: disconnect from localhost[127.0.0.1]

    • Для начала отключите TLS/SSL в Postfix и Thunderbird и настройте систему без TLS/SSL. После этого можно заняться прикручиванием TLS/SSL.

      • отключил все, оставил базовый конфиг постфиксу, telnet localhost 110 так и не работает, Connection refused. Unable to connect to remote host, на 25 работает на ура

      • я заметил что ничего не сказанно о pop3/imap, мож изза этого не работает у меня подключение на 110 порт?

          • Читал, это имеете ввиду?

            простейший POP3/POP3S-сервер на базе popa3d и stunnel заменен намного более серьезным POP3/POP3S/IMAP4/IMAP4S-сервером Courier-IMAP

            но эот туториал не описывает установку и настройку imap/pop3, поэтому и не работает у меня как надо, и если я установлю Courier-IMAP, будет правильное решение.

            • Начните с popa3d. Очень простой, легкий и беспроблемный POP3-сервер. К нему элементарно прикручивается stunnel для шифрования трафика. Courier-IMAP сложнее.

              • Устоновил все на ура! с нескока изменениями:
                1. транспорты / ящики / алиасы хранятся в базе MySQL.
                2. В качестве POP3/IMAP4-сервера — Courier-IMAP.
                3. Система развернута под FreeBSD 8.0.
                4. Прикрутил RoundCube для вебинтерфейса
                Но вот не получаю месаги с root, postmaster … на мое админское мыло (на этом же сервере), алиасы настроил, в /etc/mail/aliases есть запись но сервер выдает:
                Reporting-MTA: dns; miraj.domen.org
                X-Postfix-Queue-ID: 145E61CCB9
                X-Postfix-Sender: rfc822; meadmin@domen.org
                Arrival-Date: Tue, 2 Feb 2010 11:07:12 +0200 (EET)
                Final-Recipient: rfc822; postmaster@domen.org
                Original-Recipient: rfc822;postmaster@domen.org
                Action: failed
                Status: 5.1.1
                Diagnostic-Code: X-Postfix; unknown user: "postmaster@domen.org"

                • В случае хранения учетных записей в базе данных файл aliases, как правило, не используется (алиасы хранятся в базе данных). Если Вы настраивали почтовую систему по моей инструкции, то добавьте алиасы в базу данных, уберите из main.cf строку receive_override_options = no_address_mappings, перезапустите Postfix, и будет счастье 😉

                • А вот как настроить чтоб все сервера в сети отпраляли свои логи на определенный ящик как это делает система на которой установлен почтовый сервер?

                  • Не нужно на ящик. Гораздо удобнее использовать централизованный сервер логов, а еще лучше — системы SNMP-мониторинга.

  13. У меня все работает, автору большое спасибо — делал все точно по статьям, немного изменил под себя. у меня используется Cyrus-Imap.

      • Может подскажите, не могу чего-то найти решение. У меня есть виртуальные хосты в Apache, от них из веб приложений иногда отправляются письма. Так вот postfix выводит такое
        Jan 22 00:03:51 as postfix/pickup[40267]: 2D30B22E403: uid=80 from=
        ….
        Jan 22 00:03:51 as postfix/qmgr[1227]: 2D30B22E403: from=, size=1410, nrcpt=1 (queue active)
        ….
        Jan 22 00:03:55 as amavis[40472]: (40472-08) Blocked SPAM, ->….
        где хххх — имя моего не виртуального хоста, т.е. имя домена сервера.
        Как сделать так, чтобы postfix понимал, что нужно подставлять имя правильное, т.е. имя виртуального хоста Apache.
        Полагаю, что рыть нужно как-то в этом направлении Non-Postfix mailbox store: separate domains, non-UNIX accounts или все же если письмо отправляется от скрипта с правами www, то ничего не сделаешь? Сейчас нашел решение подправил файл amavisd.conf на уменьшение балов для адреса www@xxxxx, но наверное это не правильно….

        • Мне кажется, адрес подставляет не Postfix, а движок сайта. Как в Postfix, так и в Amavisd-New можно разрешить беспрепятственное прохождение сообщений с нужных адресов/из нужных доменов.

  14. SergeySL, если нет времени писать статью по изменениям, то может быть вы могли бы выложить содержание конфигурационных файлов или прислать на почту.

    • Я не буду выкладывать конфиги, т.к. это бессмысленно и бесполезно. Задавайте вопросы, постараюсь ответить.

  15. Для того, чтобы Postfix корректно взаимодействовал с Amavisd-New, т.е. отправлял сообщения для проверки на 10024 порт локального интерфейса, который “слушает” Amavisd-New, и принимал их назад на 10025 порте локального интерфейса, необходимо добавить в файл /usr/local/etc/postfix/main.cf строки:

    view sourceprint?
    1.content_filter=smtp-amavis:[127.0.0.1]:10024
    2.receive_override_options = no_address_mappings

    После выполнения этой инструкции перестает работать virtual_alias_maps
    А у меня на него натроенна групповая рассылка. Подскажите как сделать так, что бы и Amavisd работал и алиасы виртуальные работали? Очень нужно.

  16. вернее поcле опции no_address_mappings
    На сколько необходима жта опция амавизу? Без нее не будет корректно работать?

    • Выше я уже ответил EndErr, что в случае использования базы данных для хранения учетной информации строка receive_override_options = no_address_mappings не нужна.

      • Да я вобщем то так и сделал. И заработало все как надо. ЯЧ наверно вопрос не так задал. Мне интересно что дает этот параметр. Вернее что дает понятно, зачем нужно для амавиза. Вы ведь написали что нужно. Что он ему дает и что получается если его убрать? Амавизд теряет какой то функционал?

  17. Помогите разобраться со спамом.Вернее наоборот. Пользователь с моего же почтового сервера отправляет другому на этот же почтовом сервере и классифицируется как спам. Вот что выдает. Что тут не так то? А доеренные сети адрес попадает. Он вообще в локале. Настройка спамассасина и амавиз как в статье.

    Content analysis details: (11.9 points, 9.0 required)
    pts rule name description
    ---- ---------------------- --------------------------------------------------
    -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP
    3.4 FH_DATE_PAST_20XX The date is grossly in the future.
    0.0 HTML_MESSAGE BODY: HTML included in message
    2.9 TVD_SPACE_RATIO BODY: TVD_SPACE_RATIO
    2.8 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding
    1.5 RAZOR2_CF_RANGE_E4_51_100 Razor2 gives engine 4 confidence level above 50% [cf: 55]
    0.5 RAZOR2_CHECK Listed in Razor2
    0.5 RAZOR2_CF_RANGE_51_100 Razor2 gives confidence level above 50% [cf: 55]
    1.4 DCC_CHECK Listed in DCC
    2.4 DNS_FROM_OPENWHOIS RBL: Envelope sender listed in bl.open-whois.org.
    0.0 DIGEST_MULTIPLE Message hits more than one network digest check
    -2.0 AWL AWL: From: address is in the auto white-list

    В частности вот эти строки не понятны. Сообщение отправляется через outlook из office 2003. Настройки у него по умолчанию. НУ только серверы прописанны. Причем с дургих вроде отправляется нормально.

    3.4 FH_DATE_PAST_20XX The date is grossly in the future.
    2.9 TVD_SPACE_RATIO BODY: TVD_SPACE_RATIO
    2.8 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding
    1.5 RAZOR2_CF_RANGE_E4_51_100 Razor2 gives engine 4 confidence level

    Как исправить, что бы отправлялось и принималась от нее почта нормально.

    • Уважаемый, жизнь не стоит на месте. Для начала поищите, что делают те или иные тесты, которые выставили положительные оценки сообщению. Например, тест FH_DATE_PAST_20XX (я упоминал его в своем Твитере). А дальше по накатанному сценарию. Кроме настройки серверов, существует их ТЕХНИЧЕСКАЯ ПОДДЕРЖКА 😉

    • (это я так понимаю на дату ругается, но с датой на компе все впорядке..)

      Подобные вещи можно «понимать» только после изучения соответствующей документации. Проблема 2010 года в SpamAssassin была упомянута практически на всех IT-порталах и форумах 😉

  18. Добрый день!
    Собирал все на FreeBSD 8.0-RELEASE. вроде как работает, за одним НО. такое ощущение, что sa из-под amavisd-new совершенно игнорирует local.cf и вообще, кажется, всю /usr/local/etc/mail/spamassassin/. То есть, в тегах спамовых писем нет никаких упоминаний о Razor2, Pyzor, DCC и даже BAYES.
    И, кстати, да, с FH_DATE_PAST_20XX я стандартно борюсь так: в /usr/local/share/spamassassin/72_active.cf стоку:
    header FH_DATE_PAST_20XX Date =~ /20[0-9][1-9]/ [if-unset: 2006]
    заменяю на:
    header FH_DATE_PAST_20XX Date =~ /20[1-9][1-9]/ [if-unset: 2006]

      • Внимательно прочитайте статью. Если с подключением к БД что-то не так, spamassassin --lint выдаст сообщения об ошибках. Кстати, я тоже давно перешел на FreeBSD 8.0, поэтому версия операционной системы не может служить причиной ошибок.

        • [root@portlab /usr/ports/sysutils/screen]# spamassassin --lint
          [22073] warn: netset: cannot include 127.0.0.0/8 as it has already been included
          [root@portlab /usr/ports/sysutils/screen]#

          • А если попробовать spamassassin --lint -D? Только весь вывод этой команды сюда не прикладывайте, итак пора комментарии закрывать из-за их объема 🙂

    • Добрый вечер!
      Судя по всему, SpamAssassin у Вас не запускается. Выполните amavisd reload и посмотрите, что пишется /var/log/maillog. По поводу увелечения детальности отладочных сообщений Amavisd-New я говорил в статьях про DKIM.
      Правила SpamAssassin следует писать в local.cf, т.к. в Вашем случае они будут потеряны при обновлении.

      • Apr 4 17:56:00 portlab amavis[22066]: starting. /usr/local/sbin/amavisd at portlab.dc.rinet.ru
        ...
        Apr 4 17:56:02 portlab amavis[22068]: initializing Mail::SpamAssassin
        Apr 4 17:56:04 portlab amavis[22068]: SpamControl: init_pre_fork on SpamAssassin done
        Apr 4 17:56:04 portlab amavis[22068]: extra modules loaded after daemonizing/chrooting: Mail/SpamAssassin/BayesStore/SQL.pm, Mail/SpamAssassin/SQLBasedAddrList.pm

        вроде все ок. может у меня паранойя?

  19. Сергей, а при такой настройке почта от внешних почтовых серверов будет доходить? От них не потребуется такая-же аутентификация как от пользователей?

    • Естественно, будет доходить. Аутентификация требуется от клиентов, а не от других почтовых серверов. Как говорится, учите матчасть 😉

      • Сергей, спасибо! Я явно не нашел об этом информации и прежде чем настраивать на боевом сервере хотел уточнить.

        • На здоровье! Я писал про документ RFC-2554. В Сети есть его переводы на русский язык. Аккуратнее с «боевыми серверами» 🙂

          • Спасибо за статью!
            Я пробую ее на FreeBSD 8.0. Возникли проблемы.

            1. Не ставится dcc
            # portsnap fetch update
            ...
            # make install
            A description of ALT_HOME may be found in the ports Makefile.
            ===> Vulnerability check disabled, database not found
            ===> Found saved configuration for dcc-dccd-1.3.116
            => dcc-1.3.116.tar.Z doesn't seem to exist in /usr/ports/distfiles/.
            => Attempting to fetch from .../dcc/source/old/.
            fetch: .../dcc/source/old/dcc-1.3.116.tar.Z: Moved Permanently
            ...
            => Attempting to fetch from .../pub/FreeBSD/ports/distfiles/.
            fetch: transfer timed out
            => Couldn't fetch it - please try to retrieve this
            => port manually into /usr/ports/distfiles/ and try again.
            *** Error code 1
            Stop in /usr/ports/mail/dcc-dccd.
            *** Error code 1
            Stop in /usr/ports/mail/dcc-dccd.

            2. Не выполнятся команда
            # pyzor discover
            pyzor: Команда не найдена.

            Замечания относительно FreeBSD 8.0:
            1. Два раза в статье написана одна и та же строччка — во второй должно быть exe:
            /^Content-(Type|Disposition):.*name[[:space:]]*=.*\.com/ REJECT
            2. Сначало ставится Spamassassin, а потом уже появляется папки p5-Mail-SpamAssassin/sql и уже потом делается импорт БД, а в статье написано все это до установки Spamassassin
            3. Новый ClamAV сам соддает файлы clamd.conf и freshclam.conf в /usr/local/etc
            4. Postfix не создает файл smtpd.conf в /usr/local/lib/sasl2

            • и еще не ставится (+ ругается на отсутствие базы уязвимостей) amavisd-new

              # make install
              ===> Vulnerability check disabled, database not found
              ===> Found saved configuration for amavisd-new-2.6.4_5,1
              **** UPGRADE WARNING: SQL SCHEMA CHANGED ****
              If you are upgrading from version prior to 2.6.0
              Hit ^c now and read /usr/ports/UPDATING section or
              /usr/local/share/doc/amavisd-new/RELEASE_NOTES
              Hit ^c now to stop, any key to continue:
              => amavisd-new-2.6.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
              => Attempting to fetch from .../software/amavisd/.
              fetch: .../software/amavisd/amavisd-new-2.6.4.tar.gz: Forbidden
              ...
              fetch: transfer timed out
              => Couldn't fetch it - please try to retrieve this
              => port manually into /usr/ports/distfiles/ and try again.
              *** Error code 1
              Stop in /usr/ports/security/amavisd-new.
              *** Error code 1
              Stop in /usr/ports/security/amavisd-new.

              • 1. команда
                # pyzor discover
                выполнилась после перезагрузки
                2. DCC поставился из репозитория яндекса (ftp6.freebsd.org)
                3. Amavisd-new так и не ставится…

                • 1. команда
                  # pyzor discover
                  выполнилась после перезагрузки

                  Попробуйте /usr/ports/shells/bash или настройте sh, и подобных проблем не будет 😉
                  По старинке пользуюсь CVSup’ом 🙂 Может и Вам его попробовать? 😉

            • Я пробую ее на FreeBSD 8.0. Возникли проблемы.

              Я перешел на FreeBSD 8.0 в декабре 2009 года.

              Не ставится dcc

              У меня стоит dcc-dccd-1.3.116. Периодически обновляю порты, проблем не было. Кто мешает Вам найти файл dcc-1.3.116.tar.Z и последовать сообщению please try to retrieve this port manually into /usr/ports/distfiles/ and try again?

              pyzor: Команда не найдена.

              Настройте пути, по которым shell ищет исполняемые файлы. Я пользуюсь bash и настройками путей по умолчанию.

              Замечания относительно FreeBSD 8.0:
              1. Два раза в статье написана одна и та же строччка – во второй должно быть «exe»:
              /^Content-(Type|Disposition):.*name[[:space:]]*=.*.com/ REJECT
              2. Сначало ставится Spamassassin, а потом уже появляется папки p5-Mail-SpamAssassin/sql и уже потом делается импорт БД, а в статье написано все это до установки Spamassassin
              3. Новый ClamAV сам соддает файлы clamd.conf и freshclam.conf в /usr/local/etc
              4. Postfix не создает файл smtpd.conf в /usr/local/lib/sasl2

              1 и 2 — это и ежу понятною. Вам рекомендую также внимательно и придирчиво читать man’ы. Спасибо, все исправил 🙂
              3 и 4 — описанное делалось 5 лет назад в среде FreeBSD 4.10. За это время изменились форматы многих файлов, например, тех же файлов конфигурации ClamAV, однако, суть написанного осталась прежней. Кто хочет, тот всегда разберется 😉

  20. Ваша статья очень помогла в настройке офисной почты. Спасибо!
    Есть вопрос. Как сделать так чтобы письмо не помеченное как спам (но являющиеся спамом) можно было переслать на определенный адрес, например spam@company.com, для обработки SpamAssassin, т.е. что бы он на основании этого письма создал правила bayes?

    • На здоровье!
      Во-первых, создайте ящик spam@company.com, во-вторых, настройте почтовые клиенты пользователей так, чтобы они отправляли в этот ящик все письма, помечаемые как СПАМ, в-третьих, периодически скармливайте содержимое этого ящика sa-learn.

  21. Я забыл указать что использую dbmail, т.е. все письма храняться в базе данных, поэтому sa-learn --spam не подходит. Нужно именно пересылать спам на определеный ящик…

  22. Добрый день!
    Собирал все на FreeBSD 8.0-RELEASE. вроде как работает, за одним НО. такое ощущение, что sa из-под amavisd-new совершенно игнорирует local.cf и вообще, кажется, всю /usr/local/etc/mail/spamassassin/. То есть, в тегах спамовых писем нет никаких упоминаний о Razor2, Pyzor, DCC и даже BAYES.
    И, кстати, да, с FH_DATE_PAST_20XX я стандартно борюсь так: в /usr/local/share/spamassassin/72_active.cf стоку:
    header FH_DATE_PAST_20XX Date =~ /20[0-9][1-9]/ [if-unset: 2006]
    заменяю на:
    header FH_DATE_PAST_20XX Date =~ /20[1-9][1-9]/ [if-unset: 2006]

    • Добрый вечер! Ощущения лучше оставить для других ситуаций 😉

      sa … совершенно игнорирует local.cf и, вообще, кажется, всю /usr/local/etc/mail/spamassassin/

      Выполните spamassassin --lint -D, чтобы увидеть, что и как загружает SA. После этого выполните amavisd reload и посмотрите в логе /var/log/maillog список модулей, загруженных Amavisd-New. Если эти процедуры не выявят ошибки, ищите несостыковки в файле конфигурации Amavisd-New. На всякий случай напоминаю, что поля с оценками добавляются только тогда, когда оценка, выставленная сообщению, превышает $sa_tag_level_deflt 😉

  23. Со вчерашнего дня мой сервер начал рассылать СПАМ. Сейчас проверяю компы в локаке, но как проверить сам сервер на вред?

    • Я не собираюсь читать лекции по безопасности FreeBSD вообще и почтовых серверов в частности. В Сети есть тонны информации на эти темы. Не любите разбираться самостоятельно, платите специалистам за решение проблем 😉
      P.S.: Не нужно задавать философские вопросы 😉

  24. Перенес свой вопрос. У каждого менеджера свой ящик и общая папка на которую приходит основная масса писем, как сделать так что бы все письма, приходящие лично менеджерам, копировались бы в общую папку? MTA Postfix + веб морда PostfixAdmin. Алиасы PostfixAdmin уже существующих ящиков создавать не дает.

  25. Надеюсь я не ошибся темой 🙂

    Ситуация следующая:
    Создан сервис авторизованных рассылок (на подобии Smartresponder).
    В таких сервисах, все письма от авторов рассылок, зарегистрированных в сервисе, отправляются читателям с одного почтового ящика mail@домен.ru. В то же время в поле отправитель указывается Имя и Фамилия автора, а в поле e-mail получателя указывается е-mail автора (согласно данных, заполненных авторами при открытии аккаунта на сервисе). То есть получается что в поле е-mail отправителя указаны недостоверные данные и логично что многие почтовые сервисы (gmail, rambler) помещают письма в СПАМ.

    Задача – добиться 95-97% доставляемости писем в папку ВХОДЯЩИЕ на всех основных почтовых сервисах. Возможно, это можно сделать путем модификации Postfix на нашем выделенном сервере, установки специально ПО или другие варианты. Если есть опыт подобной настройки почтового сервера — подскажите за денежное вознаграждение само собой.

    • Надеюсь я не ошибся темой 🙂

      Ошиблись, но в разумных пределах 🙂

      В таких сервисах, все письма от авторов рассылок, зарегистрированных в сервисе, отправляются читателям с одного почтового ящика mail@домен.ru . В то же время в поле отправитель указывается Имя и Фамилия автора, а в поле e-mail получателя указывается е-mail автора (согласно данных, заполненных авторами при открытии аккаунта на сервисе).

      Можно отправлять почту не с адреса mail@домен.ru, а, например, подставлять вместо mail имя автора в транслите?

      То есть получается что в поле е-mail отправителя указаны недостоверные данные и логично что многие почтовые сервисы (gmail, rambler) помещают письма в СПАМ. Задача – добиться 95-97% доставляемости писем в папку ВХОДЯЩИЕ на всех основных почтовых сервисах.

      Предположу, что дело не в содержимом полей заголовков сообщений, а в большом количестве сообщений в единицу времени. Никто не хочет проверять свои серверы на способность противостоять DoS и тем более заставлять их рассылать СПАМ, как бы Вы его не называли. Если количество получателей рассылок ограничено, можно растянуть отправку писем по времени, иначе лучше наладить диалог с сапортом соответствующих сервисов.

      Если есть опыт подобной настройки почтового сервера – подскажите за денежное вознаграждение само собой.

      Postfix позволяет осуществлять любые извращения с заголовками сообщений. Если будут конкретные вопросы, обращайтесь, сделаем 🙂

      • Предположу, что дело не в содержимом полей заголовков сообщений, а в большом количестве сообщений в единицу времени.

        Ну тот же Смартреспондер, в день его почтовый сервер отсылает более миллиона писем, но как ни странно в 98% случаях все письма попадают во входящие и на гугле и на других почтовых сервесах (только раз у меня письмо попало в папку СПАМ на гугле). А тут у меня ушло всего 10 000 писем и почти все на гугле в СПАМ попали.

        Здесь можно узнать Ваш ICQ SergeySL ? Чтобы не засорять тему своими личными вопросами.

  26. Извините, что пишу сюда, но вижу, что вы разбираетесь в теме, может подскажете..
    Есть такая задача — письма, написанные ночью, отправлять днем. В Outlook+Exchange это решается легко, там можно указать дату и время после которого почтовый сервер сам отправит письмо (при выключенном компьютере клиента).

    Хотелось бы реализовать что-то подобное с Postfix. Сервер должен принять письмо, но отложить его дальнейшую отправку до определенного времени. Наверно нужно в теле письма как-то указывать дату и время, до которой почтовый сервер не должен отправлять письмо из очереди. Например что-то типа:

    {delay:22.04.2012 14-00}

    Просмотрел фильтры Postfix — можно отслеживать такой формат даты, но как в скрипте указать, что не нужно отправлять письмо до определенной даты — не понятно..

    Подскажите, пожалуйста, куда копать? Может быть есть какое-то стандартное решение этой задачи?
    Спасибо заранее.

  27. Привет
    спасибо за советы — очень много подчеркнул для себя.
    Но проблему по которой сюда пришел так и не смог решить сам.
    Надеюсь на вашу помощь.
    Настроил Postfix + Dovecot + DKIM
    но при отправке письма попадают в спам сразу 🙁
    Причина — в хеадере письма строка —
    Received: from unknown (HELO mydomain.com)
    Как исправить не могу понять …

  28. SergeySL, добрый день!
    После настройки почты и установки форума на движке phpBB, возник вопрос. Почтовые уведомления с форума не отправляются, в maillog сыпятся ошибки вида:
    (host imx1.rambler.ru[81.19.66.234] said: 450 4.1.8 : Sender address rejected: Domain not found (in reply to RCPT TO command)).
    Но почта с postfixadmin отправляется отлично.
    В hosts:
    ::1 localhost
    127.0.0.1 localhost.vasjapupkin.ru localhost
    127.0.0.1 autoreply.vasjapupkin.ru
    my.real.ip vasjapupkin vasjapupkin.ru

    В resolv.conf:
    domain vasjapupkin.ru
    nameserver 127.0.0.1

    почтовик собран на связке postfix dovecot mysql.
    В php.ini:
    sendmail_from = www@vasjapupkin.ru # понимаю что это для винды но поставил для пробы
    sendmail_path = "/usr/sbin/sendmail -t -i -f www@vasjapupkin.ru"

    Получается что почта не отправляется только через php (mail). А вот откуда он берёт и подставляет свои переменные $from $localdomain я так и не понял. Подскажите если сталкивались с таким.

      • Работа по ночам сказывается.
        С форума отправлял письмо на ящик рамблеровский, просто не досмотрел что предыдущая строка лога не закопипастилась. В общем в ней было сказано что обратный адрес www@vasjapupkin.localdomain отвергнут сервером рамблера. Но проблему уже решил. Был недосмотрен main.cf постфикса и не раскоментирован параметр myhostname. Теперь это всё работает. Как я понял, приставка www в имени отправителя, это uid процесса, который отправляет почту, в данном случае апач, но вот как это поменять, чтоб вместо uid он имя брал из конфигурации, я так и не понял.
        Параметры запуска sendmail -f name@domain.ru не сработали.

        • Как я понял, приставка www в имени отправителя, это uid процесса, который отправляет почту, в данном случае апач, но вот как это поменять, чтоб вместо uid он имя брал из конфигурации, я так и не понял.

          Чтобы не было алхимии, почитайте man или хотя бы запустите Аpache, например, от имени nobody. Не верю, что параметры отправки уведомлений phpBB — тайна за семью печатями 😉

          • Алхимии то нет никакой, да и апач ведёт себя как и должен. Уже со всем разобрался, а то что осталось уже не эту тему. Спасибо вашему сайту! оч много полезной информации!

  29. Фря стоит 9.1 (чистая)
    При рестарте на этапе установки TSL выдает следующее:
    postfix restart postfix: fatal: /usr/local/etc/postfix/main.cf, line 689: missing '=' after attribute name: "smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes"

      • Уважаемый root, с проблемой "smtps inet..." я разобрался, сам натупил, а вот предыдущую проблему, где ругалось на $alias_maps = $alias_database, не уверен, что правильно решил, я просто раскоментировал строки:
        alias_maps = hash:/etc/aliases
        alias_database = hash:/etc/aliases

        • Уважаемый root, с проблемой "smtps inet..." я разобрался, сам натупил

          Я не сомневался 😉

          я просто раскоментировал строки:
          alias_maps = hash:/etc/aliases
          alias_database = hash:/etc/aliases

          Мне кажется, было бы достаточно раскомментировать строку alias_database = ....

  30. В последней версии есть изменения, при работе с базой /usr/local/share/doc/p5-Mail-SpamAssassin/sql ругнется, тут нужно заменить в файлах строку с TYPE=MyISAM на ENGINE=MyISAM

  31. У вас есть ICQ или Skype? мне нужна Ваша помощь в онлайн режиме, пока что не знаю в чем именно проблема но я не могу подключиться клиентом к серверу.

  32. Добрый день,

    не могли бы вы объяснить, не много не понятна разница между:
    smtpd_sender_restrictions =
    smtpd_recipient_restrictions =
    Кто понимается под отправителями и получателями.
    Вы пишете,

    Файл access_sender предназначен в основном для разрешения доступа отправителей, адреса или имена доменов которых попали в какой-либо блэклист, или удаленный сервер запрещает проверку их существования.

    Я правильно понял, что речь идет об людях которые пишут не с моей почты @mydomain.ru, а с какой-то своей @otherdomain.ru?
    Если так, то почему этот файл находится в smtpd_recipient_restrictions =
    Разве он не относится к отправителям — smtpd_sender_restrictions =
    Вот здесь он как раз находится в smtpd_sender_restrictions =

    Дело в том, что я тысячу лет назад настроил почту в первую очередь по вашей статье, но в урезанном виде — часть параметров касаемых:
    smtpd_sender_restrictions =
    smtpd_recipient_restrictions =
    пришлось убрать, потому что у меня при таких настройках почта не бегала, а сейчас возникла необходимость добавить белый лист, для доменов которые не проходят проверку IP = Name

    • Вообще-то, я ссылался на все нужные man’ы и должен написать RTFM 🙂
      Адреса отправителя (MAIL FROM:) и получателя (RCPT TO:) передает SMTP-клиент, а соответствующие правила анализируют эти значения. По поводу access_sender вы правильно поняли. Он нужен редко и позволяет пропустить почту с адресов, попавших в blacklist, например. Ваши клиенты должны слать почту с адресов, находящихся в пределах mynetworks, либо проходить процедуру SASL-аутентификации, а если находятся за пределами доверенных сетей, то еще и использовать TLS-шифрование.
      Про домены, не прописанные в DNS, я тоже говорил. Добавляйте IP-адреса в файл access_client, и будет счастье 😉

      • Прошу прощения, на сайте я вижу ответ — вы правильно поняли, а ответ на почте — не правильно…
        Судя по всему, что не правильно.

    • И по поводу ЗДЕСЬ, делайте как там написано, никто не запрещает. Даже смотреть не буду, хотя там все может быть в разы лучше, чем у меня. Если я допустил ошибку, ткните носом в мануал, скажу спасибо. А все остальное меня не касается. Нет лишнего времени, поймите правильно.

      • Пример приводился не для того, чтобы указать, что у вас, что-то не правильно.

        Нет лишнего времени, поймите правильно.

        Понимаю правильно и спасибо за помощь и уделенное время.

        • Я пишу подобные комменты не из-за плохого характера, а из-за невнимательности читателей. Вот кусочек статьи с ответом на Ваш вопрос:

          Файл access_client предназначен в основном для разрешения доступа с хостов, которые не зарегистрированы в DNS (в России таких немало), или попали в какой-либо блэклист (среди таких часто оказываются бесплатные почтовые системы, доски объявлений, форумы и т.п.). Для таких хостов необходимо задать правила вида <IP-адрес> OK и/или hostname OK… После изменения файла access_client необходимо выполнить команду postmap access_client

  33. Добрый день. Делаю по вашей инструкции, но возникли проблемы с spamassassin. При попытке запуска выдает:
    warn: archive-iterator: no access to start: No such file or directory at /usr/local/lib/perl5/site_perl/5.14/Mail/SpamAssassin/ArchiveIterator.pm line 771.
    гугл к сожалению ничего внятного не сказал 🙁
    FreeBSD postfix 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r255898: Fri Sep 27 03:52:52 UTC 2013 root@bake.isc.freebsd.org:/usr/obj/usr/src/sys/GENERIC i386
    postfix-2.10.2,1 = up-to-date with port
    p5-Mail-SpamAssassin-Alt-3.3.2_1 = up-to-date with port

    • Доброй ночи! Статье 6 с небольшим лет, хотя с небольшими изменениями все работает на 8.4. Порты регулярно обновляются.
      Похоже, что Вы обновили perl, а модули нет. Для начала попробуйте portupgrade -f p5-*.

      • Проблема оказалась в руках как обычно 🙂
        Надо было запускать не spamassassin start, а spamd start

        Была еще проблема поправил строку
        @inet_acl = qw(127.0.0.1);
        на
        @inet_acl = qw( 127.0.0.1 [::1] 10.100.96.0/22 );

        То есть в акцесс лист внес свою подсеть, ибо без этого амавис реджектил почту.
        Спасибо за статью. ЗЫ У меня FreeBSD 9.2-RELEASE и, соответственно, все порты обновлены.

        • Если делать все по статье, то SpamAssassin не нужно запускать отдельно, он автоматически подгрузится при запуске Amavisd-New. У меня на рабочих серверах пока 8.4, но думаю, что и 10.0 с учетом изменений в синтаксисе конфигов все будет работать.

  34. Добрый день! В статье не описаны настройки ДНС для правильной работы электронной почты. Хотелось бы увидеть развернутую статью по этому вопросому. Особенно когда подробно рассмотрены различные варианты ДНС серверов: собственный днс сервер, днс сервер провайдера (который предоставляет канал), ДНС сервер хостинг-провайдера.

    • Доброй ночи! Если коротко, то в прямой зоне DNS должны быть A- и MX- записи для почтового сервера, в обратной PTR-запись для него же. Если хотите увидеть более подробно, то велком в Гугл, тема обмусолена на всех языках, включая русский.
      P.S.: Работа почтовой системы не зависит от того, на каком сервере хранятся записи, достаточно того, чтобы они были.

  35. Привет, спасибо за статью.
    Если можешь поделись своими мыслями по следующим вопросам:
    1) Можно ли с помощью постфикса защититься от спуфинг атак, например когда из внешней сети, на мой почтовый сервер приходит письмо от support@microsoft.com. Если ли что-то что сверяет MAIL FROM и реальный айпишник отправителя. SPF это почти то, что я хочу, только его никто не использует в России, например у правительственных сайтов нет SPF-записей.
    2) Можно ли с помощью постфикса запретить отправление писем из внешней сети c MAIL FROM из внутренней сети. Чтобы никто из внешней сети не мог слать письма от admin@mydomain. Я нашел как запретить отправку без аутентификации от существующих пользователей, однако это не мешает отправлять письма от несуществующих (superpuperadmin@mydomain) и вводить пользователей в заблуждение.
    3) как запретить внутреннему нарушителю отправлять письма внутри корпоративной сети от вымышленных имен?

    Заранее благодарен!
    нет, не паранойа =)

    • Привет, на здоровье!

      Можно ли с помощью постфикса защититься от спуфинг атак, например когда из внешней сети, на мой почтовый сервер приходит письмо от support@microsoft.com. Если ли что-то что сверяет MAIL FROM и реальный айпишник отправителя. SPF это почти то, что я хочу, только его никто не использует в России, например у правительственных сайтов нет SPF-записей.
      MAIL FROM не имеет отношение к адресу отправителя.

      Вот подробная инфа о том, как Postfix проверяет адреса. Идеального рецепта нет, но можно добиться отсечения большей части неправильных писем. Чем более жестокие настройки, тем больше нужных писем (с кривых Российских серверов) будет отброшено. Дальше Amavisd-New и SpamAssassin. Там тоже куча настроек, которые индивидуальны для каждого конкретного случая. На всякий случай я проверяю у себя и DKIM, и SPF силами Amavisd-New и Spamassassin.

      Можно ли с помощью постфикса запретить отправление писем из внешней сети c MAIL FROM из внутренней сети. Чтобы никто из внешней сети не мог слать письма от admin@mydomain. Я нашел как запретить отправку без аутентификации от существующих пользователей, однако это не мешает отправлять письма от несуществующих (superpuperadmin@mydomain) и вводить пользователей в заблуждение.
      Как запретить внутреннему нарушителю отправлять письма внутри корпоративной сети от вымышленных имен?

      Я бы заставил всех проходить SASL-аутентификацию. Т.е. ограничил бы mynetworks только локальным хостом.

      • 1. Неужели нет супер простого решения, чего-то что просто при входящем письме делает ДНС запрос на домен из MAIL FROM , а затем сравнивает адрес отправителя письма и то, что получено из ДНС.
        2. Если я сделаю всем обязательную аутентифию, то как ко мне будут приходить письма из внешней сети?

        • Почитайте про reject_unknown_sender_domain. А лучше сначала разберитесь, как отправляют почту клиенты, и как взаимодействуют между собой почтовые серверы.

        • 1. Неужели нет супер простого решения, чего-то что просто при входящем письме делает ДНС запрос на домен из MAIL FROM , а затем сравнивает адрес отправителя письма и то, что получено из ДНС.
          2. Если я сделаю всем обязательную аутентифию, то как ко мне будут приходить письма из внешней сети?

          попробуй так:
          в /usr/local/etc/postfix создай файл helo_checks с таким содержимым:

          /^domain\.ru$/ 550 Don't use my domain
          /^host\.domain\.ru$/ 550 Don't use my hostname
          /^host\.domain\.local$/ 550 Don't use my hostname
          /^192\.0\.168\.1$/ 550 Don't use my IP address
          /^\[192\.0\.168\.1\]$/ 550 Don't use my IP address
          /^1\.2\.3\.4$/ 550 Don't use my IP address
          /^\[1\.2\.3\.4\]$/ 550 Don't use my IP address
          /^[0-9.]+$/ 550 Your client is not RFC 2821 compliant

          пропиши в main.cf в секцию smtpd_recipient_restrictions
          check_helo_access pcre:/usr/local/etc/postfix/helo_checks
          по идее должно помочь.

  36. Здравствуйте.
    В прошлом году настраивал все по Вашей статье. Все работает как часы.
    Сейчас пишу диплом, там есть раздел про установку MTA с MUA — взял статью за основу 🙂
    P.S. В источники добавлю 🙂

    • Привет! Статья уже ОЧЕНЬ старенькая, а писать новую в три раза больше лень. Рад, что сумел помочь 🙂

      • В прошлом комменте забыл поблагодарить. Чтобы не плодить записи решил дождаться ответа и здесь уже написать.
        За статью отдельное человеческое спасибо. Реально помогла.
        А по поводу актуальности… Тут важна сама суть, основы так сказать, что с чем едят и почему. Кому дано — тот разберется дальше сам.

        • А по поводу актуальности… Тут важна сама суть, основы так сказать, что с чем едят и почему. Кому дано – тот разберется дальше сам.

          Золотые слова, и единственный верный подход. Сейчас очень редко так рассуждают. Гораздо чаще хотят, чтобы чуть ли не под их ТЗ статью написали, да еще и вместо спасибо что-нибудь некрасивое скажут. Не могу сказать, что задевает, но желание писать подобные статьи точно не усиливается. Еще раз удачи, главное начать, а дальше все само-собой пойдет 😉

          • Пару дней назад настраивал почтовый сервер, взял за основу Вашу статью, все еще актуальна, правда я делал через виртуальных юзеров и вебморду для них прикрутил, только некоторые ключи в конфигах поменялись и жаль убрали virtual_create_maildirsize, для постфикса хотя квоты работают.

            Есть вопрос, может знаете? Есть ли какой скрипт или еще что, что бы если пользователь заполнил на 75%, скажем, свой ящик, ему приходило письмо: «Мил человек а не хочешь почистить свою почту?»

  37. А у меня на самом начальном этапе возникла проблема Вы пишете В папке /usr/local/lib/sasl2 содержится два файла конфигурации Cyrus-SASL2: sendmail.conf (для использования совместно с Sendmail) и smtpd.conf (для использования совместно с Postfix). Нас интересует второй, содержимое которого нужно заменить на: pwcheck_method: saslauthd». Но у меня нет второго файла.

  38. Прошу помощи у знающих.
    Пришлось сегодня столкнуться с такой ошибкойпри работе pflogsumm:

    # ./account.hourly
    /usr/local/lib/perl5/5.16/mach/CORE/libperl.so: Undefined symbol "_ThreadRuneLocale"
    /usr/local/lib/perl5/5.16/mach/CORE/libperl.so: Undefined symbol "_ThreadRuneLocale"

    Выяснил, что местный админ ставил vlc на этот сервер, для перегона потока из мира в локалную сеть.
    Версия перла ранее была 5.12.4, теперь 5.16
    Может кто встречался с такой проблемой?
    Подскажите как её решить. Очень прошу… Может подскажит кто в каком направлении рыть.

  39. Обновил порты, сделал portupgrade -fr pflogsumm и также portupgrade -fr perl.
    Версия перла стоит:
    # pkg_info |grep perl
    p5-DBI-1.616_1 The perl5 Database Interface. Required for DBD::* modules
    p5-Term-ReadKey-2.30 A perl5 module for simple terminal control
    perl-threaded-5.12.4_3 Practical Extraction and Report Language
    perl5-5.16.3_6 Practical Extraction and Report Language

    Указанные действия не помогли…

    • Сообщения об ошибках скрипта в любом случае пишутся, если запускать его без перенаправлений ввода/вывода.

  40. Владимир некрофил =)))))) еще бы спросил отчего половина пакетов еще не обновлялась =)))))

    Ошибка некрофильская. связана с разными компиляторами )))) скорее всего lang компилили то, что требует еще более древнего компилятора.

  41. ^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)com)(\?=)?"?\s*$/ REJECT

    Если имя файла на русском языке, то это не работает, как быть в этом случае?

  42. Здравствуйте. Работает почтарь postfix+ cyrus-imapd + roundcube + openldap.
    Борьба со СПАМом настроена через сам постфикс, не прикручен ни один спам фильтр и антивирь, поскольку ось стоит Goslinux, и на нее не ставиться ни clamav, ни spamassasin, ни postgrey. Но это не суть, Спама приходит мало, постфикс справляется. Вопроса у меня два:
    1) не пишет логов о входящих сообщениях. Здесь в комментах вычитала «Строя шлюз для почтовых сообщений перенаправлял все порты необходимые сразу на внутренний сервер почты, включая 25 порт. Потому у меня не было логов по входящей почте». Прочитать прочитала, но ни че не поняла))) Как исправить?
    2) Не могу подключиться к почтовому серверу через клиентов (bat, outlook, thunderbird). roundcube подключается отлично, принимает и посылает почту.
    Проверила telnet ip_my_mail 110 закрыт. Не могу понять причину…
    Помогите хорошим советом.

    • Здравствуйте! Если бы Вы не были девушкой, комментарий такой длины сразу отправился бы в СПАМ. Я не собираюсь вникать в Ваш конфиг, но попробую ответить на вопросы.
      1. По умолчанию, логи пишутся для всех сообщений. Детальность логов определяется значением параметра debug_peer_level в файле main.cf. Если Вы не трогали этот параметр, логи должны писАться.
      2. RoundCube работает через локальный интерфейс, имеющий адрес 127.0.0.1. Смотрите настройки Cyrus’а, postfix здесь не при чем.

  43. Goslinux на базе Centos 6

    1) debug_peer_level = 2 в моем конфиге. Как можно уменьшить детализацию логов в части «тот то залогинился, зашел в папку inboх, переместил тото в корзину», а оставить действительно нужную информацию «от кого кому когда статус отправки/приема»?
    2) хорошо, посмотрю

    У вас нигде не написано ограничение на длину комментария)), но за ответ большое спасибо!

    • Goslinux на базе Centos 6

      Тогда почему говорите, что нельзя поставить нужный софт?

      1. Postfix не работает с Inbox, Sent и т.д., эти вещи делает Cyrus. По нему не подскажу, т.к. использую Courier-IMAP, но в Интернете полно информации. Вместо снижения детальности логов лучше разобраться с их ротацией.

      Про комментарии я писал в своих ответах. На здоровье 🙂

Оставить комментарий