Настройка POSTFIX
Разберем примерный конфигурационный файл настройки postfix (на момент написания статьи это был postfix-2.6.3,1 на сервере под управлением FreeBSD 7.2-RELEASE), который стоит между internet и сервером MS Exchange 2007, обслуживающим почтовые адреса доменных пользователей организации. Т.е. все пользователи подключены через Outlook к серверу MS Exchange 2007 и локальная почта “ходит” через него. При адресации почты к внешним организациям, MS Exchange 2007 пересылает почту в internet через postfix. Таким образом, почтовые аккаунты хранятся в Active Directory домена нашего предприятия. На сервере, где стоит postfix почтовых ящиков нет. |
Конфигурационный файл postfix находится в /usr/local/etc/postfix/main.cf
. Или же выполните команду:
# postconf sample_directory
которая покажет вам путь к файлу конфигурации.
В первых закомментированных строках конфигурационного файле указано, что для выяснения полного синтаксиса конкретного параметра необходимо обратиться к man-странице командой man 5 postconf. Также много полезной для себя информации можно почерпнуть из файлов readme, которые при установке пакета помещаются в /usr/local/share/doc/postfix
. Если вы не обнаружите по данному пути документации выполните команду:
# postconf html_directory
или
# postconf readme_directory
которая выведет вам путь к файлам документации.
Так же вам рекомендуют менять за один раз не более 2-3 параметров и каждый раз проверять после этого корректную работу postfix. От себя – делайте бекапы, копируя конфигурационный файл в другое место, например в /var/backups. Итак, начнем.
# SOFT BOUNCE soft_bounce = no
При изменении этого параметра в “soft_bounce = yes” мы укажем posfix заменить действия с REJECT (отклонить) на DEFER (попытаться позже). Это позволит оставлять сообщения в очереди, которые в противном случае были бы возвращены отправителю, т.е. postfix заменит все коды ответов 5xx на 4xx. Бывает очень полезным при тестировании новых restrictions (ограничений на прием почты).
# LOCAL PATHNAME INFORMATION queue_directory = /var/spool/postfix command_directory = /usr/local/sbin daemon_directory = /usr/local/libexec/postfix data_directory = /var/db/postfix
Выше перечислены стандартные пути до места, где будет находится очередь postfix, где находятся все команды, относящиеся к postfix, где расположен демон программы postfix, путь где postfix создает свои различные служебные файлы (например, master.lock)
# QUEUE AND PROCESS OWNERSHIP mail_owner = postfix
рекомендованный “посвященный” пользователь, от имени которого будет работать postfix.
# INTERNET HOST AND DOMAIN NAMES #myhostname = host.domain.tld #myhostname = virtual.domain.tld #mydomain = domain.tld
В данных параметрах мы можем указать наш хостнейм и обслуживаемый нашим postfix домен. Но если команды:
postconf myhostname и postconf mydomain изначально выводят правильные и нужные нам значения – то указывать это тут не обязательно. Данные значения буду многократно использоваться самим postfix
# SENDING MAIL myorigin = $myhostname
Указывает полное доменное имя машины (fully-qualified domain name – FQDN), на которой функционирует Postfix. По умолчанию, myhostname устанавливается в имя локальной машины. Если имя вашей машины не указано в полной доменной форме (FQDN), или вы запускаете postfix на виртуальном интерфейсе, вам необходимо указать полное доменное имя (FQDN), которое должна использовать почтовая система. Альтернативно, если вы укажете значение mydomain, то postfix использует это значение, чтобы сгенерировать полное доменное имя машины (FQDN) для параметра myhostname.
По умолчанию, используется имя локальной машины – $myhostname.
# RECEIVING MAIL inet_interfaces = $myhostname, localhost
В данном параметре указаны сетевые интерфейсы, на которых работает postfix. По умолчанию, он работает на всех сетевых интерфейсах почтового сервера. Вы так же можете указать на каких именно он должен работать (принимать почту). Такая необходимость возникает, если у вас поднято несколько виртуальных адресов на одном из сетевых интерфейсах. Например:
inet_interfaces = 123.456.789.0, 127.0.0.1
в результате postfix будет “слушать” на 123.456.789.0 адресе и на локалхосте.
mydestination = $myhostname, localhost.$mydomain, localhost
В данном параметре указано, для каких доменов почта будет доставляться локально вместо пересылки на другой хост. По умолчанию postfix принимает почту только для локальной машины. Не указывайте тут свои виртуальные домены, для которых вы хотите принимать почту. Это делается в параметре virtual_mailbox_domains.
# REJECTING MAIL FOR UNKNOWN LOCAL USERS #local_recipient_maps = unknown_local_recipient_reject_code = 550
Данную секцию я оставляю не тронутой, т.к. все мои почтовые аккаунты хранятся в Active Directory.
И по умолчанию действие postfix на почту для не найденного в моей системе локального получателя – reject (отклонить). В процессе отладки и настройки получателей рекомендуют устанавливать данный параметр в 450 – попробовать позже.
# TRUST AND RELAY CONTROL #mynetworks_style = class #mynetworks_style = subnet #mynetworks_style = host mynetworks = 192.168.0.19/32, 127.0.0.0/8
Очень важная секция, в которой указываются авторизованные сети, от которых ваш postfix будет пересылать через себя почту.
Настоятельно рекомендую указать в данном параметре только нужные для вас сети, т.к. postfix по умолчанию является опен-релеем, т.е. позволяет всем слать через себя почту. В данном примере – 192.168.0.19/32 ip-адрес локального сервера (которому я доверяю), от которого разрешено пересылать почту. Он-же: сервер на котором стоит MS Exchange 2007.
#relay_domains = $mydestination relay_domains = your_domain.ru
В данном параметре перечислены домены, на которые разрешена пересылка корреспонденции от посторонних клиентов.
# REJECTING UNKNOWN RELAY USERS relay_recipient_maps = ldap:/usr/local/etc/postfix/ldap_relay_recipient_maps.cf
Как я уже писал в начале статьи, мой postfix является “мостом” для передачи почты из/в internet. В организации используется домен и почтовый сервер MS Exchange 2007, т.е. все пользователи заведены в Active Directory. В данном параметре указано, что получателей локальной почты postfix должен искать по ldap-протоколу в Active Directory домена. С помощью настроек, описанных в ldap_relay_recipient_maps.cf, postfix авторизуется в домене и вычисляет локальных пользователей.
Для этого вам необходимо завести в домене пользователя postfix, присвоить ему пароль и не переносить его из контейнера пользователей по умолчанию Users. В файле ldap_relay_recipient_maps.cf по пути, который выдает команда postconf sample_directory необходимо указать следующее:
server_host = 192.168.0.2 search_base = dc=your_domain, dc=ru version = 3 bind_dn = CN=postfix,CN=Users,DC=your_domain,DC=ru bind_pw = passwd query_filter = (proxyAddresses=smtp:%s) result_attribute = mail
где server_host – ip-адрес домен-контроллера;
bind_pw – пароль пользователя posfix в домене;
your_domain – ваш домен.
# ALIAS DATABASE alias_maps = hash:/etc/mail/aliases alias_database = hash:/etc/mail/aliases
Пусть к таблице локальных пользователей почты на сервере, где стоит posfix – aliases, на основе которой будет создана база aliases, когда вы дадите команду newaliases после правки таблицы aliases. А также тип и путь к самой базе.
# DEBUGGING CONTROL debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
Параметры, относящиеся для отладки работы postfix. Я их оставил без изменения.
# INSTALL-TIME CONFIGURATION INFORMATION sendmail_path = /usr/local/sbin/sendmail newaliases_path = /usr/local/bin/newaliases mailq_path = /usr/local/bin/mailq setgid_group = maildrop html_directory = /usr/local/share/doc/postfix manpage_directory = /usr/local/man sample_directory = /usr/local/etc/postfix readme_directory = /usr/local/share/doc/postfix
Название секции говорит само за себя. Тут прописаны пути для директорий, команд и файлов помощи postfix, куда они поместились в процессе установки пакета.
Далее начинается самое интересное. Пишем свои правила :)
Все взято из указанных в начале статьи документов и статьи, опубликованной на этом сайте.
Целью написания данных правил является отсечение огромного количества спама и вирусных сообщений, приходящего на почтовые адреса сотрудников организации. Гарантирую, что если вы таким (ну, или почти таким) образом настроите свой postfix, количество спама упадет в разы!
########################################## ############ my rules ################### ##########################################
content_filter=amavisfeed:[127.0.0.1]:10024
На моем сервере используется антивирус amavis. В данном параметре указано, на каком порту и какого типа у нас работает антивирус.
strict_rfc821_envelopes = yes
Запрет некорректного синтаксиса в командах MAIL FROM или RCPT TO. Отключено по умолчанию.
- запрещает использования синтаксиса адресов RFC 822;
- запрещает использования адресов, которые не заключены в угловые скобки <>.
relay_transport = smtp:192.168.0.19:25
Параметр указывает следующий сервер и порт для доставки почты к указанным в relay_domains доменам. В моем случае – это сервер, где работает MS Exchange 2007.
smtp_host_lookup = native
В данном параметре указывается механизм, с помощью которого postfix определяет ip адреса подключающихся к нему хостов.
message_size_limit = 52400000
Данный параметр ставит ограничение на максимальный размер пересылаемого письма в байтах.
mailbox_size_limit = 524000000
Данный параметр ставит ограничение на максимальный размер почтового ящика получателя почты в байтах. В моем случае этот параметр не актуален.
maximal_queue_lifetime = 10d
Этим параметром указывается сколько времени максимально (в данном случае – 10 дней) письмо может находится в очереди, пока не будет отослано назад отправителю с пометкой, что оно не может быть доставлено.
disable_vrfy_command = yes
Данной настройкой отключена команда SMTP VRFY. Таким образом мы отключили возможность некоторых способов сбора реально существующих в нашей системе почтовых адресов.
(Но существует вероятность, что почтовый сервер получателя проверяет нашу почту на реальность адрес нашего отправителя. При такой настройке, он не получит его подтверждения. Так что используйте эту настройку на свое усмотрение).
smtpd_reject_unlisted_sender = yes
Отклонение писем с несуществующим адресом отправителя. Эта форма фильтрации “на входе” может помочь в борьбе с “червями” и спамерами. Отключено по умолчанию. (См. предыдущий параметр. Используйте на свое усмотрение).
max_use = 500
В данном параметре мы указываем максимальное количество входящих подключений, обслуживаемых демоном postfix.
smtpd_delay_reject = yes
Данной настройкой мы даем команду postfix откладывать обработку списков ограничений до получения команды RCPT TO или ETRN. Таким образом мы сможем увидеть в логе postfix информацию о письме (от кого, кому и т.д.), чтобы при необходимости проанализировать причину, по которой письмо было отклонено.
smtpd_helo_required = yes
Требование к клиентам отсылать команду HELO или EHLO перед использованием команды MAIL FROM или ETRN. Ограничение отключено по умолчанию.
smtpd_recipient_limit = 10
Ограничиваем максимальное количество получателей на одно почтовое сообщение. По умолчанию – 1000. Многовато, да?
Далее последуют ограничения, которые мы хотим наложить на входящие соединения. Каждый список ограничений обрабатывается слева направо до тех пор, пока какое-либо ограничение не выдаст результат PERMIT (разрешить), REJECT (отклонить) или DEFER (отложить для последующей повторной попытки). Достижение конца списка эквивалентно получению результата PERMIT. Списки ограничений обрабатываются в следующем порядке: client, helo, etrn или client, helo, sender, recipient, data, end-of-data. Когда список ограничений (например, client) выдает результат REJECT или DEFER, обработка всех последующих списков helo, sender, и т.д. не выполняется.
Ограничения, накладываемые на клиента в момент установления соединения:
smtpd_client_restrictions = permit_mynetworks check_client_access hash:/usr/local/etc/postfix/sender_access reject_unknown_reverse_client_hostname reject_rbl_client bl.spamcop.net reject_rbl_client sbl.spamhaus.org reject_rbl_client zen.spamhaus.org reject_rbl_client dnsbl.ahbl.org reject_rbl_client dnsbl.njabl.org reject_rbl_client dnsbl.sorbs.net reject_rbl_client aspews.ext.sorbs.net reject_rbl_client cbl.anti-spam.org.cn reject_rbl_client cblplus.anti-spam.org.cn reject_rbl_client cblless.anti-spam.org.cn
- Разрешаем слать почту через себя только авторизованным сетям, указанным в параметре mynetworks.
- Указываем на список, где перечислены домены, которым мы доверяем, т.е. принимаем от них почту без проверки в данном ограничении. Таблица имеет вид:
# hosts, contains spamtraps spamcop.net OK listme.dsbl.org OK # good hosts forumcomp.ru OK maxblogs.ru OK
Не забывайте каждый раз после изменений, вносимых в данный файл, давать команду на перестроение базы по нему:
postmap /usr/local/etc/postfix/sender_access
в результате чего у вас появиться hash-база sender_access.db
Затем необходимо дать команду postfix, чтобы он перечитал свои конфигурационные файлы:
/usr/local/etc/rc.d/postfix reload
- Отклоняем почтовые сервера, которые не имеют обратной dns-записи. Но очень часто попадаются почтовые сервера, от которых нам надо принимать почту, но у которых нет обратной dns-записи. Такие сервера заносим в таблицу sender_access. Применяйте данное ограничение по вашему усмотрению.
- Далее идет список антиспам серверов. Почта от серверов, которые находятся в этих базах приниматься не будет. Полный список таких баз можно найти тут.
Ограничения, накладываемые на сообщения, на основании информации HELO/EHLO:
(В данных ограничениях происходят проверки на корректность HELO/EHLO)
smtpd_discard_ehlo_keywords = silent-discard dsn
smtpd_helo_restrictions = permit_mynetworks check_helo_access hash:/usr/local/etc/postfix/sender_access reject_invalid_helo_hostname reject_unknown_helo_hostname reject_non_fqdn_helo_hostname
Следующим ограничением мы запрещаем использование команды ETRN из-за пределов авторизованных сетей:
smtpd_etrn_restriction = permit_mynetworks reject
Ограничения, накладываемые на основании информации MAIL FROM:
smtpd_sender_restrictions = permit_mynetworks check_sender_access hash:/usr/local/etc/postfix/sender_access reject_non_fqdn_sender reject_unverified_sender reject_unknown_sender_domain
Ограничения, накладываемые на основании информации RCPT TO:
smtpd_recipient_restrictions = check_recipient_access hash:/usr/local/etc/postfix/recipient_access permit_mynetworks permit_auth_destination reject_unauth_destination
- Указываем на список, где перечислены домены, которым мы безоговорочно не доверяем, т.е. даже не собираемся слать туда почту, а также локальные почтовые адреса, на которые вы не хотите принимать почту из вне. Не разрешаем делать это даже авторизованным сетям. Таблица выглядит таким образом:
abuse@your_domain.ru OK postmaster@your_domain.ru OK maxblogs.ru OK все@your_domain.ru REJECT ВСЕ@your_domain.ru REJECT Все@your_domain.ru REJECT qmail.com REJECT
Не забывайте создавать на ее основе hash-базу.
- Разрешаем пересылать почту из авторизованных сетей, из обслуживаемого нами домена, а также принимаем почту, если письма адресованы именно нам.
- reject_unauth_destination запрещает стать нашему postfix открытым релеем почты!
virtual_alias_maps=hash:/usr/local/etc/postfix/relay_aliases
У меня возникла ситуация, когда стало необходимым пересылать почту, адресованную несуществующему на нашем AD пользователю в другое место.
Для этого была создана такая таблица и на ее основе hash-база:
vasya@your_domain.ru vasya@yandex.ru
Очень полезным бывает при тестировании нового ограничения почты, которое вы собираетесь применить, но в действии которого вы не уверены, указать перед ним warn_if_reject. Это позволит заменить действия posfix REJECT на замечания – warnings. Вместо отклонения команды клиента postfix зарегистрирует в своих логах, что он собирался отвергнуть. Например:
smtpd_sender_restrictions = permit_mynetworks warn_if_reject reject_sender_login_mismatch
Вот в принципе и все. В интернете вы найдете еще массу документации по настройке вашего почтового сервера в соответствии с вашими задачами.
При обращении на форумы бывает очень полезным выкладывать не этот конфиг, а вывод команды:
postconf -n
Она покажет все настройки, которые сделали вы сами.
Этот документ никаким образом не претендует быть книгой по настройке вашего postfix. Но, надеюсь, кое в чем поможет вам правильно настроить ваш почтовый сервер.
Удачи!
P.S. жду ваших замечаний и предложений по исправлению данного документа.
Не забывайте каждый раз после изменений, вносимых в данный файл, давать команду на перестроение базы по нему:
postconf /usr/local/etc/postfix/sender_access
Здесь ошибка. Вместо postconf нужно postmap.
Да, Дмитрий, Вы правы. Конечно postmap
Исправлю в основной статье.
Добрый день спасибо за ваш пост. Но я столкнулся с такой проблемой отправлять могу почту, а вот принимать не могу подскажите что мне нужно сделать, Человек который настраивал frebsd ушел и нечего мне не сказал вот сижу мучаюсь пытаюсь найти что где лежит.Подскажи что мне нужно сделать. Заранее благодарен
Добрый день!
Во-первых, огромное спасибо за статью! очень помогла при настройке postfix.
Есть вопрос:
Как быть, если Exchange серверов в организации несколько?
пример – @moscow.mydomain.net @spb.mydomain.net @somecity.mydomain.net.
При этом планируется всю внешнюю почту с данных трех серверов пропускать через наш шлюз на Postfix’e.
Как сделать маршрутизацию? так понимаю, что при Вашей схеме, вся почта будет ходить через тот exchange, который был указан в настройках, а уж потом расходиться на остальные.
Как объяснить Postfix’у “если moscow.mydomain.net, то exch0.moscow.mydomain.net…” и т.п.?
Заранее спасибо!
Статья хорошая, но приходится отключать JS, чтобы копипастить. Ваши “копирайты” в буфере обмена за$$$. Это новый бич интернета – копирайты в буфере обмена.
Антон, к сожалению, это необходимость, чтобы труды не пропали даром. Редко кто оставляет ссылки на первоисточник.
Очень толковый конфиг.
Пригодились некоторые нюансы!
Леонид, немножко поменять нужно будет конфиг:
relay_transports = relay
transport_maps = hash:/usr/local/etc/postfix/virtual_transport
файл virtual_transport выглядит так в вашем случае:
moscow.mydomain.net smtp:[exch0.moscow.mydomain.net]
spb.mydomain.net smtp:[exch0.spb.mydomain.net]
и т.д.
потом postmap /usr/local/etc/postfix/virtual_transport