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
Отключение 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
Утилиты
- mailq – программа, позволяющая смотреть список писем, находящихся в почтовых очередях. На самом деле эта программа является всего лишь интерфейсом к демону showq, который вызывается через команду sendmail -bp.
- postsuper – предназначена для обслуживания почтовых очередей. Одним из применений является удаление какого-либо сообщения или повторная установка его в очередь на доставку. В то же время не стоит забывать об утилите postqueue, которая также создана для управления очередями. Единственное различие в них это то, что для работы c postsuper требуются права root, а для postqueue таких широких полномочий не нужно, хотя за счет этого теряется часть функционала.
- postalias – используется для создания баз псевдонимов или выполнения запросов к этим базам. Для совместимости с sendmail существует команда newaliases, делающая то же самое, что и postalias.
- postconf – показывает состояние конфигурационных переменных Postfix.
- postlog – команда, которую можно использовать для записи данных в протоколы работы Postfix. Полезна для использования в своих собственных скриптах.
- postcat – данная утилита, позволяющая посмотреть содержимое файла почтовой очереди.
- postmap – используется для выполнения запросов к вспомогательным таблицам или для создания таких таблиц из текстовых файлов. Перевод данных из текстовой формы в табличную довольно сильно ускоряет процедуру выполнения запросов.
- postlock – позволяет работать с блокировками, установленными Postfix на файлы. Обычно применяется для написания скриптов.
- postkick – предназначена для отправки сигналов по каналам межпроцессового обмена внутри Postfix. Удобна для организации взаимодействия между внутренними процессами Postfix и самописными скриптами.
- spawn – демон, позволяющий подключить внешнюю систему фильтрации содержимого сообщений. На данный момент находится в стадии активной разработки, и хотя работает достаточно надежно, но в силу особенностей реализации создает слишком большую нагрузку на систему. Скорее всего в следующих версиях Postfix будет заменен на что-то лучшее.
- 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://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

