rilpoint_mw113

Postfix

После любого изменения конфигов, перегенерации хэшей - запускать "postfix reload". Postfix в FreeBSD не имеет rc.d скрипта, управление осуществляется командой postfix {start|stop|reload}. В Centos/RedHat управление Postfix происходит через service (/sbin/service postfix {start|stop|reload|restart}).

Содержание

Centos MTA to Smarthost

Случай, когда нужно настроить Postfix MTA на Centos только для отправки почты, например если он стоит у вас дома или в локальной сети и не имеет своего доменного имени.

Отключение Sendmail

Убить SendMail во всех его проявлениях:

killall sendmail 
chkconfig --level 0123456 sendmail off
yum remove 'sendmail*'

Ставим Postfix

yum install postfix

Редактируем файл /etc/postfix/main.cf, правим там (вариант простой, если SMTP в локалке и принимает почту ото всех):

myhostname = host.domain.ru
mydomain = domain.ru
myorigin = $myhostname
mynetworks = 127.0.0.0/8
relayhost = smarthost.lan

Редактируем файл /etc/postfix/main.cf, правим там (вариант с авторизацией на SMTP смартхоста, если он в интернете):

myhostname = host.domain.ru
mydomain = domain.ru
myorigin = $myhostname
mynetworks = 127.0.0.0/8
relayhost = mail.smarthost.com
smtp_sasl_auth_enable = yes
# файл saslpass нужно сконвертировать в saslpass.db утилитой postmap
# [root@media postfix]# /usr/sbin/postmap saslpass
# Сам файл построчно:
# smtp.gmail.com username:password
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
# тут специально пустое значение. Нужно для Plain SMTP AUTH на Smarthost-е.
smtp_sasl_security_options =


Ставим переадресащию локальных и системных сообщений в /etc/aliases на внешний ящик:

root: admin@mypersonalserver.ru

Перекомпилируем базу алиасов:

cd /etc
newaliases

Запускаем Postfix:

service postfix start

Прописываем в автозапуск:

chkconfig --level 345 postfix on

FreeBSD MTA to Smarthost

Случай, когда нужно настроить Postfix MTA на FreeBSD только для отправки почты, например если он стоит у вас дома или в локальной сети и не имеет своего доменного имени.

Отключение Sendmail

Убить SendMail во всех его проявлениях:

killall sendmail

Убрать SendMail из автозапуска (добавить в /etc/rc.conf):

sendmail_enable="NONE"

ВНИМАНИЕ, если не отключить SendMail и продолжить установку Postfix могут быть неопределенные неизлечимые глюки и придется всё повторить заново.

Инсталляция почтового сервера

Компилируем Postfix, в опциях сразу добавить обе SASL и SSL/TLS, PCRE, MYSQL, OPENLDAP.

cd /usr/ports/mail/postfix
make install all
make replace

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

Файлы конфигурации находятся в /usr/local/etc/postfix

main.cf для конфигурации MTA:

queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix

mail_owner = postfix
default_privs = nobody
myhostname = mail.servername.ru
mydomain = servername.ru
mynetworks = 192.168.1.10/24, 127.0.0.0/8

relayhost = mail.RELAYservername.ru
smtp_sasl_auth_enable = yes
# файл saslpw нужно сконвертировать в saslpw.db утилитой postmap
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/saslpw
# тут специально пустое значение. Нужно для Plain SMTP AUTH на Smarthost-е.
smtp_sasl_security_options =

myorigin = $mydomain
inet_interfaces = 192.168.1.10, localhost
mydestination = $myhostname, localhost.$mydomain, $mydomain
default_transport = smtp
alias_database = hash:/etc/aliases
mailbox_command = /usr/local/bin/procmail

smtpd_banner = ESMTP READY
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
smtpd_sender_restrictions = permit_mynetworks, reject_unknown_address, reject_non_fqdn_sender, reject_invalid_hostname
smtpd_recipient_restrictions = permit_mynetworks, permit_mx_backup, reject_non_fqdn_sender, reject_non_fqdn_recipient,reject_unknown_sender_domain, check_relay_domains, reject_unknown_client, reject

local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
debug_peer_level = 2
debugger_command =
        PATH=/usr/bin:/usr/X11R6/bin
                  xxgdb $daemon_directory/$process_name $process_id & sleep 5
                  readme_directory = /usr/local/share/doc/postfix
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
html_directory = no
setgid_group = maildrop
manpage_directory = /usr/local/man
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
unknown_local_recipient_reject_code = 450

master.cf:

# /usr/local/etc/postfix/master.cf
#
#==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (50)
#
#==========================================================================
smtp      inet  n       -       y       -       -       smtpd
pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
smtp      unix  -       -       n       -       -       smtp
showq     unix  n       -       n       -       -       showq
local     unix  -       n       n       -       -       local
cyrus     unix  -       n       n       -       -       pipe
    flags=R user=cyrus argv=/cyrus/bin/deliver -e -q -m ${extension} ${user}
    uucp      unix  -       n       n       -       -       pipe
        flags=F user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)relay          unix  -       -       n       -       -
smtp
flush     unix  n       -       n       1000?   0       flush
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
proxymap  unix  -       -       n       -       -       proxymap
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache
discard   unix  -       -       n       -       -       discard
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
relay     unix  -       -       n       -       -       smtp

После чего в /etc/aliases прописываем алиас куда отправлять всю почту для локальных root и postmaster, туда будет отправляться всякие системные сообщения о работе системы и ошибках:

/etc/aliases:

root: info@servername.ru

# Basic system aliases -- these MUST be present
MAILER-DAEMON: postmaster
postmaster: root

# General redirections for pseudo accounts
_dhcp:  root
_pflogd: root
bin:    root
bind:   root
daemon: root
games:  root
kmem:   root
mailnull: postmaster
man:    root
news:   root
nobody: root
operator: root
pop:    root
proxy:  root
smmsp:  postmaster
sshd:   root
system: root
toor:   root
tty:    root
usenet: news
uucp:   root
nagios: root

# Well-known aliases -- these should be filled in!
# manager:
# dumper:

# BUSINESS-RELATED MAILBOX NAMES
# info:
# marketing:
# sales:
# support:

# NETWORK OPERATIONS MAILBOX NAMES
abuse:  root
# noc:          root
security:       root

# SUPPORT MAILBOX NAMES FOR SPECIFIC INTERNET SERVICES
ftp:            root
ftp-bugs:       root

Создаем файл с паролем для SMTP-авторизации на Uplink-Smarthost-е (% вместо @ согласно документации провайдера) /usr/local/etc/postfix/saslpw:

mail.RELAYservername.ru all%RELAYservername.ru:password

Создаём хэши для файлов алиасов и паролей:

postmap /usr/local/etc/postfix/saslpw
/usr/local/bin/newaliases

Запускаем Postfix нетривиальным скриптом /usr/local/etc/rc.d/postfix.sh:

#!/bin/sh
[ -x /usr/local/sbin/postfix ] && /usr/local/sbin/postfix start && echo -n ' postfix'

FreeBSD Gateway to Exchange

http://www.knowplace.org/pages/howtos/smtp_gateway_for_multiple_domains_with_postfix.php#relay_recipients

Отключение Sendmail

Убить SendMail во всех его проявлениях:

killall sendmail

Убрать SendMail из автозапуска (добавить в /etc/rc.conf):

sendmail_enable="NONE"
ВНИМАНИЕ, если не отключить SendMail и продолжить установку Postfix могут
быть неопределенные неизлечимые глюки и придется всё повторить заново.

Инсталляция

Компилируем Postfix, в опциях сразу добавить обе SASL и SSL/TLS.

cd /usr/ports/mail/postfix
make install all
make replace

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

Файлы конфигурации находятся в /usr/local/etc/postfix, для данной конфигурации подойдут и файлы конфигурации по умолчанию, где нужно поменять только имя хоста, интерфейсы и обслуживаемые сети.

после установки Postfix настраиваем транспорт почты для всех доменов на Exchange:

/usr/local/etc/postfix/main.cf

relay_domains = servername.ru,
     servername2.ru
# по хорошему relay_recipient_maps надо брать из LDAP ну да хрен с ним
# relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients
transport_maps = hash:/usr/local/etc/postfix/transport

/usr/local/etc/postfix/transport

defa.ru    smtp:exchange.servername.ru
mogol.ru    smtp:192.168.1.100

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

http://turbogaz.kharkov-ua.com/unix/mail/mail-howto-p2.php

проверка ip на присутствие в dnsbl списках: http://www.dnsstuff.com/

Фильтрация средствами Postfix

(добавить в конец) /usr/local/etc/postfix/main.cf:

# RESTRICTIONS
#
# client, helo, sender, recipient, data, end-of-data
#
# Отклонять запрос, если хост не имеет в DNS A или MX записи.
# Здесь может быть загвоздка, например если всетаки надо от нескольких
# хостов не имеющих имен принимать почту, можно прописать исключения например так:
# smtpd_helo_restrictions = permit_mynetworks, check_helo_access hash:/etc/otpraviteli,
# reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname
# где в /etc/otpraviteli имеет вид "fdqn.host.name [tab] OK"
smtpd_helo_restrictions = reject_unknown_hostname 

# Отклонять запрос, когда клиент посылает SMTP команду раньше времени.
smtpd_data_restrictions = reject_unauth_pipelining

# пропишем DNSBL блэклисты для фильтрации по ним входящих соединений
stmpd_client_restrictions = reject_maps_rbl
maps_rbl_domains = rbl-plus.mail-abuse.org,
                           bl.spamcop.net,
                           list.dsbl.org,
                           relays.ordb.org,
                           dnsbl.njabl.org,
                           dialups.mail-abuse.org,
                           dul.ru

# Отклонять команду ETRN
smtpd_etrn_restrictions = reject

# Заставляем отклонять почту с неизвестным адресом отправителя.
# Позволяет бороться с червями и некоторыми вирусами.
smtpd_reject_unlisted_sender = yes

# Отключает SMTP команду VRFY. В результате чего, невозможно определить
# существование определенного ящика. Данная техника (применение команды
# VRFY) используется спамерами для сбора имен почтовых ящиков.
disable_vrfy_command = yes

# Требуем, чтобы удаленный SMTP клиент представлял себя
# в начале SMTP сессии с помощью команды HELO или EHLO.
smtpd_helo_required = yes

# Всегда отправлять EHLO вначале SMTP сессии
smtp_always_send_ehlo = yes

# Максимальное количество ошибок, которое может сделать удаленный SMTP клиент.
# При превышение данного числа Postfix отсоединится.
smtpd_hard_error_limit = 8

# Интервал времени в течение которого SMTP сервер Postfix должен послать ответ,
# а удаленный SMTP клиент получить запрос
smtpd_timeout = 30s

# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду HELO или EHLO и получить ответ сервера.
smtp_helo_timeout = 15s

# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду RCPT TO и получить ответ сервера.
smtp_mail_timeout = 15s

# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду MAIL FROM и получить ответ сервера.
smtp_rcpt_timeout = 15s

# Ограничиваем максимальный размер письма до 10Мб
message_size_limit = 10485760

Внешний мульти-фильтр amavisd-new

main.cf:

# Интервал отправки из очереди
# подбирать чтобы она успевала быстрее обрабатываться чем накопляться :)
queue_run_delay = 90s
# Время жизни почты в очереди, которое posfix пытается ее доставить
maximal_queue_lifetime = 3d
# Перенаправляем всю почту amavisd-new. Если вы еще не настроили amavisd,
# то пока закомментируйте эту строку. Иначе почтовая система не будет работать.
content_filter=smtp-amavis:[127.0.0.1]:10024


строчка в main.cf "content_filter=smtp-amavis:[127.0.0.1]:10024" означает что все письма прошедшие внутренние проверки postfix будут направлены на анализ внешнему фильтру amavisd-у на IP 127.0.0.1 порт 10024. Amavis-new имеет как встроенные фильтры основанные на регулярных выражениях, так и внешние по отношению к нему (возможность использования сторонних программ для анализа содержимого почты), к внешним относятся ClamAV (бесплатный антивирус) и Spamassassin (набор фильтров и распределенных в интернет баз данных для проверки сообщения на спам). Подразумевается что ClamAV и Spamassassin уже установлены в системе (если нет, то их нужно сейчас установить, см. ниже). Добавляем в Postfix ответ на 10025 порту, туда amavisd будет возвращать проверенные письма. Обратите внимание на maxproc для smtp-amavis, 2 подразумевает что одновременно amavis запускается в двух процессах (за это отвечает переменная $max_servers = 2 в amavisd.conf), если поставить в постфиксе значение больше чем на самом деле, то письма будут долго висеть в очереди с тайм-аутами.

(добавить в конец) master.cf:

#amavisd-new
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp-amavis unix -      -       y       -       2  smtp
   -o smtp_data_done_timeout=1200
   -o smtp_send_xforward_command=yes
   -o disable_dns_lookups=yes
   -o max_use=20
127.0.0.1:10025 inet n  -       y       -       -  smtpd
   -o content_filter=
   -o local_recipient_maps=
   -o relay_recipient_maps=
   -o smtpd_restriction_classes=
   -o smtpd_delay_reject=no
   -o smtpd_client_restrictions=permit_mynetworks,reject
   -o smtpd_helo_restrictions=
   -o smtpd_sender_restrictions=
   -o smtpd_recipient_restrictions=permit_mynetworks,reject
   -o smtpd_data_restrictions=reject_unauth_pipelining
   -o smtpd_end_of_data_restrictions=
   -o mynetworks=127.0.0.0/8
   -o smtpd_error_sleep_time=0
   -o smtpd_soft_error_limit=1001
   -o smtpd_hard_error_limit=1000
   -o smtpd_client_connection_count_limit=0
   -o smtpd_client_connection_rate_limit=0
   -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

ClamAV

http://turbogaz.kharkov-ua.com/unix/mail/mail-howto-p2.php#clamav
http://www.clamav.net/ - оффициальная страница

SpamAssassin

http://turbogaz.kharkov-ua.com/unix/mail/mail-howto-p2.php#spam
http://www.linuxcenter.ru/lib/articles/soft/clamav_freebsd.phtml
http://spamassassin.apache.org/ - оффициальная страница
http://www.rulesemporium.com/ - настройка правил фильтров для SpamAssassin

Форматы таблиц поиска Postfix

Файл конфигурации у Postfix сделан настолько универсально, что для значений переменных конфигурации можно использовать как списки значений непосредственно в файле конфигурации (через запятую), так и хэши списков, вынесенные в отдельные файлы. Если значений очень много то можно сохранять их в базы данных Berkeley DB, MySQL, директорию LDAP (в частности Microsoft Active Directory), и ещё много куда. Также можно комбинировать разные источники.

http://www.elantech.ru/docs/postfix-docs-ru/DATABASE_README.html С помощью postconf -m можно увидеть, с какими типами баз данных умеет работать ваш экземпляр Postfix.

Hash

Если в файле конфигурации вы определили чтото как hash:/path/file, то из текстового файла списка нужно создать этот самый хэш (файл *.db) руками, например:

main.cf:

relay_recipients hash:/usr/local/etc/postfix/relay_recipients

комманда создания *.db файла с хэшем:

postmap /usr/local/etc/postfix/relay_recipients

MySQL

main.cf:

virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf

mysql_virtual_mailbox_maps.cf:

user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'

Создание MySQL таблицы (в MySQL)

CREATE TABLE mailbox (
# Адрес пользователя в формате "user@domain"
username varchar(255) NOT NULL default ,
# Пароль в plaintext для возможности использования courier'ом cram-md5 шифрования
password varchar(255) NOT NULL default ,
# Общая информация о пользователе.
name varchar(255) NOT NULL default ,
# Название почтового ящика в формате "user@domain/"
maildir varchar(255) NOT NULL default ,
create_date datetime NOT NULL default '0000-00-00 00:00:00',
change_date datetime NOT NULL default '0000-00-00 00:00:00',
# Квота. Может быть формата "<число>S" или "<числоC>" или "<число>S,<число>C",где S означает
# общий размер ящика, а C - кол-во писем (например "500000S" или "500000S,20000C")
quota tinytext NOT NULL default ,
# Поле активности, используется для разрешения или отказа в доступе к сервисам smtp и pop/imap
active tinyint(4) NOT NULL default '1',
PRIMARY KEY (username)
) TYPE=MyISAM 

Добавление данных в таблицу (в MySQL):

INSERT INTO mailbox (username,password,name,maildir,quota) VALUES
('user@servername.ru', 'test', 'Test user', 'test@servername.ru/', '500000S');

RegExp (комбинирование списка и RegExp)

main.cf:

smtpd_helo_restrictions =
check_helo_access regexp:/etc/postfix/helo_access,
reject_invalid_hostname,
reject_unknown_hostname,
reject_non_fqdn_hostname

/etc/postfix/helo_access (не забываем обрабатывать его postmap):

/^smtp\.whoisit\.com$/      OK

LDAP (AD)

Чтобы это работало, необходимо скомпилировать Postfix с поддержкой LDAP. Добавить в AD пользователя ldapquery@domain.tld с паролем Passwd123

main.cf

virtual_mailbox_domains = domain.tld
virtual_mailbox_maps = ldap:/etc/postfix/ldap.cf

ldap.cf

server_host = 192.168.1.10
server_port = 3268
search_base = dc=tld
timeout = 60
query_filter =
(&(proxyAddresses=smtp:%s)(|(objectClass=user)(objectClass=group)(objectClass=contact)))
domain = domain.tld
result_attribute = canonicalName
bind = yes
bind_dn = ldapquery@domain.tld
bind_pw = Passwd123
debuglevel = 0

Утилиты

  1. mailq – программа, позволяющая смотреть список писем, находящихся в почтовых очередях. На самом деле эта программа является всего лишь интерфейсом к демону showq, который вызывается через команду sendmail -bp.
  2. postsuper – предназначена для обслуживания почтовых очередей. Одним из применений является удаление какого-либо сообщения или повторная установка его в очередь на доставку. В то же время не стоит забывать об утилите postqueue, которая также создана для управления очередями. Единственное различие в них это то, что для работы c postsuper требуются права root, а для postqueue таких широких полномочий не нужно, хотя за счет этого теряется часть функционала.
  3. postalias – используется для создания баз псевдонимов или выполнения запросов к этим базам. Для совместимости с sendmail существует команда newaliases, делающая то же самое, что и postalias.
  4. postconf – показывает состояние конфигурационных переменных Postfix.
  5. postlog – команда, которую можно использовать для записи данных в протоколы работы Postfix. Полезна для использования в своих собственных скриптах.
  6. postcat – данная утилита, позволяющая посмотреть содержимое файла почтовой очереди.
  7. postmap – используется для выполнения запросов к вспомогательным таблицам или для создания таких таблиц из текстовых файлов. Перевод данных из текстовой формы в табличную довольно сильно ускоряет процедуру выполнения запросов.
  8. postlock – позволяет работать с блокировками, установленными Postfix на файлы. Обычно применяется для написания скриптов.
  9. postkick – предназначена для отправки сигналов по каналам межпроцессового обмена внутри Postfix. Удобна для организации взаимодействия между внутренними процессами Postfix и самописными скриптами.
  10. spawn – демон, позволяющий подключить внешнюю систему фильтрации содержимого сообщений. На данный момент находится в стадии активной разработки, и хотя работает достаточно надежно, но в силу особенностей реализации создает слишком большую нагрузку на систему. Скорее всего в следующих версиях Postfix будет заменен на что-то лучшее.
  11. proxymap – сервис, позволяющий централизованно выполнять запросы ко всем служебным таблицам вместо того, чтобы каждый из процессов выполнял их самостоятельно. Еще одним применением может быть предоставление Postfix доступа к файлам, находящимся за рамками ограничений, накладываемых chroot.

Администрирование

Посмотреть активные настройки Postfix:

postconf -d

Посмотреть сколько сообщений в очереди:

mailq | grep Requests

Посмотреть конкретно что в очереди:

mailq

Пнуть очередь на немедленную доставку:

postsuper -r ALL; postfix flush

Пнуть конкретное письмо по ID:

postsuper -r ID

Удалить письмо по ID:

postsuper -d ID

Удаление группы писем от определенного FROM (на примере MAILER-DAEMON):

FreeBSD:
mailq | grep 'MAILER-DAEMON' | awk '{print $1}' | xargs -I{} -n1 postsuper -d {}
Linux:
mailq | grep 'MAILER-DAEMON' | awk '{print $1}' | xargs -I{} -n1 /usr/sbin/postsuper -d {}

Удаление группы писем от определенного FROM в статусе REQUIRE:

mailq | grep 'MAILER-DAEMON' | awk '{print $1}' | tr -d '*' | xargs -I{} -n1 postsuper -d {}

Для серверов с несколькими IP

Иногда бывает нужно, чтобы Postfix отправлят почту от конкретного IP. Редактируем

/etc/postfix/master.cf:
 smtp      unix  -       -       n       -       -       smtp -o smtp_bind_address=11.22.33.44

Веб интерфейсы

http://www.postfix.org/addon.html

http://sourceforge.net/projects/postfixadmin/

http://rs3.slackware.ru/squirrelmail/

Внешние ссылки

http://www.elantech.ru/docs/postfix-docs-ru/

http://www.postfix.org/postconf.5.html - параметры main.cf

http://www.postfix.org/faq.html

http://www.freebsd.org.ru/how-to/mail/postfix.html

http://onix.opennet.ru/content/view/23/26/

http://www.postfix.org/postconf.5.html

http://www.redwall-firewall.com/documentation/index.php/Implementing_Upstream_SMTP_Authentication_for_Postfix

http://palmcoder.net/files/howtos/Postfix%20SSL/Postfix_SSL-HOWTO-4.html

http://www.epochta.ru/articles/020/ - коды SMTP

http://jimsun.linxnet.com/postfix_contrib.html - лог анализаторы

http://batleth.sapienti-sat.org/projects/mb2md/ - Конвертер MBox -> Maildir

Источник — «http://www.openwiki.ru/wiki/Postfix»