печать

Postfix


Присказка

Долго прыгал вокруг сего продукта. Хороший сервер вроде, но что то не получается, почему то что то не работает, что то работает не как хочется или не так, как должно. Кой чего разузнал, попробую складно изложить.

Важно, очень важно тщательно прописывать параметры в файлах конфигурации. В первую голову в main.cf и master.cf. master.cf описывает сервисы, запускаемые мастером постфикса. Тех же демонов SMTP может быть им запущено несколько, к примеру — для фильтрации спама. Так вот, при этой самой фильтрации все они будут использовать один и тот же main.cf! Поэтому опции для всяких фильтрующих прокси и контент-фильтров лучше прописывать через ключ -o в файле master.cf при описании конкретного демона. Иначе получатся кольца, когда демон, обязанный принимать почту от фильтра, посылает ее на фильтрацию назад! Обидно только что диагностика при этом очень невнятная, что то вроде "не могу записать файл в очередь..."

В самом master.cf опцию -o надо предварять пробелом или табуляцией в самом начале строки. То есть при чтении этого файла постфикс анализирует первый символ. Если это решетка # — комментарий, если символ — описание сервиса, если пробел или табуляция — продолжение предыдущей строки. Как выяснилось, эта идеология применима и к main.cf тоже.

Итак, перейдем к делу. Идея — почтовая система с централизованной базой, фильтрацией спама и антивирусом. В качестве SMTP естественно постфикс. Для начала просто настроим фильтрацию спама, чтоб далее уже не мучаться.
Предполагается что постфикс уже настроен на прием и отправку сообщений оттуда, откуда надо, в простейшем случае с локалхоста методом тупой установки пакета biggrin Все нижеописанное происходит под управлением моего любимого Debian, но, думаю, пользователи других дистров и ОС тоже смогут найти что нибудь полезное.

Фильтрация спама и антивирус

Схема получается такая:
smtpd (25 порт) -> фильтр -> smtpd (10025 порт)->доставка в ящик

Работает это так: первый демон висит на 25ом порту и принимает входящие соединения. Получив письмо, он его ставит в очередь. Есть вариант фильтрации перед постановкой в очередь, но, так как на фильтрацию тратится значительное время, частенько отправка срывается. Поэтому была выбрана схема с фильтром после постановки в очередь. Из очереди письмо отправляется на фильтр, который висит себе на 10024 порту. Фильтр смотрит спам это или нет, и если нет, то отправляет его на третью часть схемы, а именно на 10025 порт для записи в ящик пользователя.

Конфигурация Postfix

Значит надо добавлять сервис smtpd на 10025 порт, а первому демону (с 25ого порта) сказать чтоб отправлял принимаемое на фильтр. Правим master.cf:
smtp      inet  n       -       -       -       -       smtpd
        -o content_filter=smtp-amavis:[127.0.0.1]:10024
smtp-amavis unix        -       -       n       -       -       smtp
        -o smtp_data_done_timeout=1200
        -o disable_dns_lookups=yes
# After-filter SMTP server. Receive mail from the content filter
# on localhost port 10025.
127.0.0.1:10025 inet n  -       -       -        -      smtpd
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_proxy_filter=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o receive_override_options=no_unknown_recipient_checks

Стандартному демону smtp добавлена инструкция отправлять все принятое на фильтрацию на localhost порт 10024 транспортом smtp-amavis. Как говорилось в присказке строчку эту в main.cf переносить нельзя! иначе получится кольцо, когда второй сервер, обязанный принять отфильтрованную почту, будет ее опять отправлять на фильтр. Это — первая часть схемы.
Следующая строчка описывает сам транспорт. Вторая часть схемы.
Далее описывается принимающий от фильтра демон. Как видим у него убраны все ограничения по отправителю и получателю, разрешен только прием сообщений с локалхоста. Это — третья часть схемы.

Собственно фильтр — amavis

Теперь остается только установить сам фильтр. Выбор есть, но я остановился на amavis. Благо что он есть в дебиановском пакете и достаточно стабилен плюс широко распространен и. как следствие, хорошо документирован.
В дебиане его установка проста: ставим пакет amavisd-new. Сам по себе амавис ничего не фильтрует, он использует внешние фильтры. Поэтому для фильтрации спама ставим spamassassin, для проверки на вирусы — clamav. После установки spamassassin в файле /etc/default/spamassassin выставляем в единицу значение ENABLED. Более ничего не трогаем. Можно поставить также пакеты, рекомендуемые самим spamassassin.
sudo invoke-rc.d spamassassin restart
Все, спамфильтр готов к работе. Из комплекта clamav нам нужен clamav-daemon и clamav-freshclam. Первый — антивирусный демон, второй — автоматическая обновлялка антивирусных баз. Все ставится и запускается автоматом, ничего править и запускать дополнительно не нужно. Единственное что нужно сделать это прописать пользователя clamav в группу amavis и наоборот дабы они могли обмениваться файлами.
Конфигурация самого amavis лежит в каталоге /etc/amavis/conf.d. Правим файл 15-content_filter_mode — раскомментариваем проверку спама и антивирус. Всю остальную конфигурацию выносим в 50-user, а именно:
$inet_socket_bind = undef;
@inet_acl = qw(127/8 192.168/16);
$inet_socket_port = 10024;
$final_banned_destiny     = D_PASS;

Первая строчка — разрешение привязаться ко всем адресам-интерфейсам. Вторая — ограничение доступа только локальным хостом и внутренними сетями. Далее определяется порт и разрешение прохождения сообщений с битыми, по мнению spamassassin, заголовками, содержащими во вложениях "запрещенные" файлы и подобное.
sudo invoke-rc.d amavis restart

Запуск

Вроде все готово. Перезапускаем postfix и бежим глядеть в лог что у него не получилось.
sudo invoke-rc.d postfix restart
Должно заработать сразу, без значительных плясок. Для пущей надежности в main.cf можно указать параметр soft_bounce = yes. Это позволит не потерять почту, если что то пойдет неправильно.

Аутентификация SASL

Теперь фильтрация спама и антивирус есть, из внутренних сетей все отправляется. Нужно сделать чтобы можно было отправлять почту из интернет через наш сервер, посему необходима аутентификация клиентов SMTP. В Postfix это реализуется через SASL.

Сам SASL

Для SASL нам нужно установить sasl2-bin. После установки идем в /etc/default/saslauthd и выставляем START=yes и раскомментариваем строчку OPTIONS (последняя, в ней заранее прописаны параметры для постфикса). В параметр MECHANISMS вписываем sasldb.
sudo invoke-rc.d saslauthd restart
Добавлять пользователей и пароли в базу нужно командой saslpasswd2. Посмотреть кто уже есть в базе — sasldblistusers2.

Включение аутентификации в Postfix

Для включения механизма аутентификации для smtpd в /etc/postfix/sasl кладем файл smtpd.conf следующего содержания:
pwcheck_method: saslauthd
mech_list: plain login

Конечно хочется чтоб из механизмов были еще и digest-md5 с cram-md5, но слету не получилось и ходят слухи что SASL этого не умеет. Поэтому и не прописываем сии механизмы, чтобы не обещать того, что реально не умеем. В main.cf прописываем следующее:
# SASL related staff
enable_sasl_authentication = yes
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, permit_auth_destination, reject
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = 

Означает сие вот что: сначала включаем аутентификацию через SASL, далее включаем ее для демона smtpd, прописываем разрешение аутентифицированным отправлять через нас почту, запрещаем анонимов и прописываем пустую строку как локальный домен в избежание странностей. Постфикс тупо добавляет содержимое этого параметра к аутентификационному имени, поэтому если клиент уже указал домен (а-ля vasya@pupkin.ru) то добавление локального домена приведет к полной ерунде vasya@pupkin.ru@localdomain.
Не забываем добавить пользователя postfix в группу sasl, иначе постфикс не сможет достучаться до saslauthd — permission denied.
sudo invoke-rc.d postfix reload
и бежим в лог смотреть что обломилось.

Создано: baron последнее изменение: Friday 26 September 2008 [12:20:44 UTC] автор baron