Разберем примерный конфигурационный файл настройки postfix (на момент написания статьи это был postfix-2.6.3,1 на сервере под управлением FreeBSD 7.2-RELEASE), который стоит между internet и сервером MS Exchange 2007. На сервере, где стоит 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
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
//
Очень полезным бывает при тестировании нового ограничения почты, которое вы собираетесь применить, но в действии которого вы не уверены, указать перед ним warn_if_reject. Это позволит заменить действия posfix REJECT на замечания – warnings. Вместо отклонения команды клиента postfix зарегистрирует в своих логах, что он собирался отвергнуть. Например:
smtpd_sender_restrictions =
permit_mynetworks
warn_if_reject reject_sender_login_mismatch
Вот в принципе и все.