Инструменты пользователя

Инструменты сайта


mail:postfix-faq

Postfix: FAQ

Решил поделиться своим небольшим опытом работы с данным МТА. В данном документе, как и следует из его названия, я приведу наиболее часто задаваемые вопросы, а также пути их решения. Так же приведу некоторые полезные команды, которые облегчат вам рабоу с postfix. Все замечания и предложения насчет данного F.A.Q. присылайте мне по адресу alex_hha@mail.ru

Postfix – это агент передачи сообщений (MTA, message transport agent или mail transfer agent), который занимается пересылкой по протоколу SMTP сообщений от пользовательского почтового агента (MUA, mail user agent), называемого также почтовым клиентом, к удаленному почтовому серверу. MTA также принимает сообщения от удаленных почтовых серверов и пересылает их другим MTA или доставляет в локальные почтовые ящики. Переслав или доставив сообщение, Postfix заканчивает свою работу.

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


Как мне вырезать все вложения при отправке писем во внешний мир?

Реализовать данную задачу можно с помощью программы altermime.

В данном примере использовалась следующая версия altermime

# altermime --version
alterMIME v0.3.10 (November-2008) by Paul L Daniels - http://www.pldaniels.com/altermime

Для начала пишем небольшой скрипт.

#!/bin/bash

ALTERMIME=/usr/bin/altermime
SENDMAIL=/usr/sbin/sendmail
ALTERMIME_DIR=/tmp

# Ожидается, что коды завершения команд, вызываемых Postfix,
# будут придерживаться правил, определенных в .
TEMPFAIL=75
UNAVAILABLE=69

# Перейти в рабочий каталог и уведомить Postfix в случае неудачи 'cd'.
cd $ALTERMIME_DIR || { echo $ALTERMIME_DIR does not exist; exit $TEMPFAIL; }

# Очистка по завершении или прерывании работы.
trap "rm -f in.$$" 0 1 2 3 15

# Запись почты во временный файл. Уведомление Postfix в случае неудачи.
cat >in.$$ || { echo Cannot write to $RIPMIME_DIR; exit $TEMPFAIL; }

# Вызываем alterMIME, передаем ей сообщение и говорим, что необходимо удалить все вложения
$ALTERMIME --input=in.$$ --removeall  || { echo Message content rejected; exit $UNAVAILABLE; }

# Вызов sendmail для возврата сообщения обратно в Postfix
$SENDMAIL "$@" <in.$$

# Используем код завершения sendmail, чтобы сообщить Postfix, как все прошло.
exit $?

Сохраняем его например под таким именем /etc/postfix/filter/remove_attachments.sh

И выставляем права на запуск

# chmox +x /etc/postfix/filter/remove_attachments.sh

Теперь нам необходимо описать сам транспорт для фильтрации в файле /etc/postfix/master.cf

altermime       unix    -       n       n       -       -       pipe
    flags=DRh user=virtual null_sender= argv=/etc/postfix/filter/remove_attachments.sh -f ${sender} -- ${recipient}

Теперь описываем политики фильтрации в файле /etc/postfix/main.cf

#
# /etc/postfix/main.cf
#

# Описываем пользовательский класс ограничений
smtpd_restriction_classes = no_attachments
 
# Описываем политику проверок для данного класса
no_attachments = 
# В данном файле указываем получателей/домены для которых вложения не будут удаляться
 check_recipient_access hash:/etc/postfix/local_domain
# В этом файле указываем отправителей для которых мы хотим включить данную политику
 check_sender_access hash:/etc/postfix/restrict_sender
 
# В данном файле применяем пользовательский класс no_attachments к определенным отправителям
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access
 
# Для избежания образования петель
altermime_destination_recipient_limit = 1
#
# /etc/postfix/local_domain
#

vmware.local OK
#
# /etc/postfix/restrict_sender
#

alex@vmware.local FILTER altermime:
#
# /etc/postfix/sender_access
#

alex@vmware.local no_attachments

Создаем соответствующие карты просмотра

# postmap sender_access restrict_sender local_domain

Отправляем внутри домена письмо с вложением

Oct  8 16:48:30 centos5 postfix/smtpd[16193]: connect from alex.vmware.local[192.168.1.100]
Oct  8 16:48:30 centos5 postfix/smtpd[16193]: 529151E888A: client=alex.vmware.local[192.168.1.100]
Oct  8 16:48:30 centos5 postfix/cleanup[16196]: 529151E888A: message-id=<1585498302.20091008164826@vmware.local>
Oct  8 16:48:30 centos5 postfix/qmgr[16189]: 529151E888A: from=<alex@vmware.local>, size=86185, nrcpt=1 (queue active)
Oct  8 16:48:30 centos5 postfix/smtpd[16193]: disconnect from alex.vmware.local[192.168.1.100]
Oct  8 16:48:30 centos5 postfix/virtual[16197]: 529151E888A: to=<root@vmware.local>, relay=virtual, delay=0.05, delays=0.03/0.01/0/0.01, 
dsn=2.0.0, status=sent (delivered to maildir)
Oct  8 16:48:30 centos5 postfix/qmgr[16189]: 529151E888A: removed

Теперь попробуем отправить письмо с вложением в мир

Отправляем внутри домена письмо с вложением

Oct  8 16:50:42 centos5 postfix/smtpd[16212]: connect from alex.vmware.local[192.168.1.100]
Oct  8 16:50:42 centos5 postfix/smtpd[16212]: NOQUEUE: filter: RCPT from alex.vmware.local[192.168.1.100]: <alex@vmware.local>: Sender address triggers FILTER altermime:; 
from=<alex@vmware.local> to=<alex@sys-adm.org.ua> proto=ESMTP helo=<alex.vmware.local>
Oct  8 16:50:42 centos5 postfix/smtpd[16212]: F16B01E888A: client=alex.vmware.local[192.168.1.100]
Oct  8 16:50:42 centos5 postfix/cleanup[16215]: F16B01E888A: message-id=<1805851929.20091008165039@vmware.local>
Oct  8 16:50:43 centos5 postfix/qmgr[16189]: F16B01E888A: from=<alex@vmware.local>, size=403011, nrcpt=1 (queue active)
Oct  8 16:50:43 centos5 postfix/smtpd[16212]: disconnect from alex.vmware.local[192.168.1.100]
Oct  8 16:50:43 centos5 postfix/pickup[16190]: 293401E8892: uid=1981 from=<alex@vmware.local>
Oct  8 16:50:43 centos5 postfix/cleanup[16215]: 293401E8892: message-id=<1805851929.20091008165039@vmware.local>
Oct  8 16:50:43 centos5 postfix/qmgr[16189]: 293401E8892: from=<alex@vmware.local>, size=936, nrcpt=1 (queue active)
Oct  8 16:50:43 centos5 postfix/pipe[16216]: F16B01E888A: to=<alex@sys-adm.org.ua>, relay=altermime, delay=0.21, delays=0.04/0.01/0/0.16, 
dsn=2.0.0, status=sent (delivered via altermime service)
Oct  8 16:50:43 centos5 postfix/qmgr[16189]: F16B01E888A: removed
Oct  8 16:50:44 centos5 postfix/smtp[16222]: 293401E8892: to=<alex@sys-adm.org.ua>, relay=mail.domain.com.ua[xxx.xxx.xxx.xxx]:25, delay=0.99,
delays=0.01/0.01/0.44/0.52, dsn=2.0.0, status=sent (250 ok 1255009844 qp 10831)
Oct  8 16:50:44 centos5 postfix/qmgr[16189]: 293401E8892: removed

Как видно из log-файла письмо было передано фильтру altermime, который удалил вложения и далее отправлено адресату


Как избавиться от сообщений вида - warning: dict_nis_init: NIS domain name not set - NIS lookups disabled

Как правило сообщение появляется если вы явно не задали значение параметра alias_maps и у вас на сервере не настроена NIS (Network Information Service)

# postconf -d alias_maps
alias_maps = hash:/etc/aliases, nis:mail.aliases

Как видно из вывода значение по умолчанию содержит ссылку на карту типа nis. Чтобы решить данную проблему достаточно указать следующее значение

#/etc/postfix/main.cf

alias_maps = hash:/etc/aliases

И дать команду postfix перечитать конфигурационный файл

# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

Как мне отвергать соединения, в которых представляются именем моего сервера?

Для этого необходимо сделать соответствующую проверку в smtpd_helo_restrictions

#/etc/postfix/main.cf

smtpd_helo_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 check_helo_access hash:$config_directory/hello_access
...
...

В данный список вносим имя нашего сервера

#/etc/postfix/hello_access

mail.sys-adm.org.ua REJECT Don't use my server name

Создаем карту hello_access.db и даем команду postfix перечитать конфигурационный файл

# postmap /etc/postfix/hello_access
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

А теперь тестируем наше ограничение

# telnet mail.sys-adm.org.ua 25
Trying 213.85.107.157...
Connected to mail.sys-adm.org.ua (213.85.107.157).
Escape character is '^]'.
220 mail.sys-adm.org.ua ESMTP
helo mail.sys-adm.org.ua
250 mail.sys-adm.org.ua
mail from:<>
250 2.1.0 Ok
rcpt to:<alex@sys-adm.org.ua>
554 5.7.1 <mail.sys-adm.org.ua>: Helo command rejected: Don't use my server name
quit
221 2.0.0 Bye
Connection closed by foreign host.

Смотрим log-файл

Sep 29 19:45:46 mail postfix/smtpd[25432]: connect from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]
Sep 29 19:46:08 mail postfix/smtpd[25432]: NOQUEUE: reject: RCPT from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]: 554 5.7.1 <mail.sys-adm.org.ua>: 
Helo command rejected: Don't use my server name; from=<> to=<alex@sys-adm.org.ua> proto=SMTP helo=<mail.sys-adm.org.ua>
Sep 29 19:46:13 mail postfix/smtpd[25432]: disconnect from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]

Как мне сделать квотирование почтовых ящиков?

Вообще то это не функция MTA, по этому по умолчанию postfix не поддерживает данный функционал. Если вам необходимы квоты, то вы можете использовать vda (virtual delivery agent) с патчем. Либо использовать альтернативные агенты доставки, например maildrop/dovecot delivery agent


Что такое классы адресов в postfix и для чего они нужны?

Классы адресов это способ группировки адресов получателей по способу доставки их писем. Всего существует 5 встроенных классов адресов:

  • класс локальных доменов [local domain class]
  • класс виртуальных алиасов [virtual alias domain class]
  • класс виртуальных доменов [virtual mailbox domain class]
  • класс доменов ретрансляции (пересылки) [relay domain class]
  • класс домена по умолчанию [default domain class]

Каждый из предопределенных классов адресов определяет следующие три вещи:

  • Список доменов, которые являются членами данного класса: например, все локальные домены или все домены ретрансляции.
  • Транспорт доставки по умолчанию. Например, local/virtual/relay/maildrop (транспорты доставки описаны в файле master.cf). Это позволяет добиться легкости в настройке postfix, так как отпадает необходимость явно указывать роутинг в таблице транспортов
  • Список допустимых получателей для данного класса адресов. SMTP сервер postfix отвергает несуществующих получателей с сообщением «User unknown in [local/virtual/relay] table». Данная возможность позволяет избежать забивания очереди сообщениями о недоставки MAILER-DAEMON

У меня в системе 3 ящика, пользователи системные. Как мне принимать почту только для этих ящиков?

Для решения данной задачи достаточно пречислить необходимых пользователей в файле и указать ссылку на него в параметре local_recipient_maps

# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
inet_interfaces = all
local_recipient_maps = hash:/etc/postfix/local_mailbox, $alias_maps
mydestination = $mydomain, localhost.$mydomain, localhost
mydomain = vmware.local
myhostname = centos5.vmware.local
mynetworks = 127.0.0.0/8
myorigin = $mydomain
unknown_local_recipient_reject_code = 550
# cat /etc/postfix/local_mailbox
alex OK
root OK
info OK
# postmap /etc/postfix/local_mailbox
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5.vmware.local ESMTP Postfix
helo localhost
250 centos5.vmware.local
mail from:<>
250 2.1.0 Ok
rcpt to:<alex@vmware.local>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Hello world
.
250 2.0.0 Ok: queued as 181F61804A3
quit
221 2.0.0 Bye
Connection closed by foreign host.

# cat /var/log/maillog | grep 181F61804A3
Sep 28 17:14:31 centos5 postfix/smtpd[1187]: 181F61804A3: client=localhost.localdomain[127.0.0.1]
Sep 28 17:14:38 centos5 postfix/cleanup[1189]: 181F61804A3: message-id=<20090928141431.181F61804A3@centos5.vmware.local>
Sep 28 17:14:38 centos5 postfix/qmgr[1183]: 181F61804A3: from=<>, size=364, nrcpt=1 (queue active)
Sep 28 17:14:38 centos5 postfix/local[1191]: 181F61804A3: to=<alex@vmware.local>, relay=local, delay=12, delays=12/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Sep 28 17:14:38 centos5 postfix/qmgr[1183]: 181F61804A3: removed

Теперь отправим письмо системному пользователю alexander, но который не указан в /etc/postfix/local_mailbox

# id alexander
uid=1983(alexander) gid=1983(alexander) groups=1983(alexander)
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5.vmware.local ESMTP Postfix
helo localhost
250 centos5.vmware.local
mail from:<>
250 2.1.0 Ok
rcpt to:<alexander@vmware.local>
550 5.1.1 <alexander@vmware.local>: Recipient address rejected: User unknown in local recipient table
quit
221 2.0.0 Bye
Connection closed by foreign host.

Как мы видим postfix еще на этапе SMTP сессии сообщил о том, что такого пользователя нет.

Sep 28 17:19:47 centos5 postfix/smtpd[1304]: connect from localhost.localdomain[127.0.0.1]
Sep 28 17:20:06 centos5 postfix/smtpd[1304]: NOQUEUE: reject: RCPT from localhost.localdomain[127.0.0.1]: 550 5.1.1 <alexander@vmware.local>:
Recipient address rejected: User unknown in local recipient table; from=<> to=<alexander@vmware.local> proto=SMTP helo=<localhost>
Sep 28 17:20:10 centos5 postfix/smtpd[1304]: disconnect from localhost.localdomain[127.0.0.1]

Как бороться с ошибкой warning: do not list domain domain.ua in BOTH mydestination and virtual_mailbox_domains?

Итак у нас postfix со следующей конфигурацией

# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
inet_interfaces = all
local_recipient_maps = unix:passwd.byname $alias_maps
mail_owner = postfix
mydestination = $mydomain, localhost.$mydomain, localhost
mydomain = vmware.local
myhostname = centos5.vmware.local
mynetworks = 127.0.0.0/8
myorigin = $mydomain
unknown_local_recipient_reject_code = 550
virtual_gid_maps = static:1981
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_domains = vmware.local
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_minimum_uid = 1000
virtual_uid_maps = static:1981

Указываем, где хранить и в каком формате почту для пользователя alex@vmware.local

# cat /etc/postfix/virtual_mailbox
alex@vmware.local vmware.local/alex@vmware.local/

Настройки минимальные, только чтобы описать суть проблемы. Как видно из вывода наш домен - vmware.local указан в $mydestination с помощью параметра $mydomain, а также он указан в $virtual_mailbox_domains. Т.е. мы указали один и тот же домен сразу в двух классах адресов - локальных и виртуальных. Чего не стоит никогда делать.

Теперь давайте отправим почту пользователю alex@vmware.local (в системе существует системный пользователь alex, также он описан в virtual_mailbox_maps, см. выше)

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5.vmware.local ESMTP Postfix
helo localhost
250 centos5.vmware.local
mail from:<>
250 2.1.0 Ok
rcpt to:<alex@vmware.local>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hello world
.
250 2.0.0 Ok: queued as 37B5A18051A
quit
221 2.0.0 Bye
Connection closed by foreign host.

Теперь смотрим log-файл

Sep 28 16:02:02 centos5 postfix/smtpd[531]: connect from localhost.localdomain[127.0.0.1]
Sep 28 16:02:23 centos5 postfix/trivial-rewrite[532]: warning: do not list domain vmware.local in BOTH mydestination and virtual_mailbox_domains
Sep 28 16:02:23 centos5 postfix/smtpd[531]: 37B5A18051A: client=localhost.localdomain[127.0.0.1]
Sep 28 16:02:28 centos5 postfix/cleanup[533]: 37B5A18051A: message-id=<20090928130223.37B5A18051A@centos5.vmware.local>
Sep 28 16:02:28 centos5 postfix/qmgr[424]: 37B5A18051A: from=<>, size=364, nrcpt=1 (queue active)
Sep 28 16:02:28 centos5 postfix/local[535]: 37B5A18051A: to=<alex@vmware.local>, relay=local, delay=16, delays=16/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Sep 28 16:02:28 centos5 postfix/qmgr[424]: 37B5A18051A: removed
Sep 28 16:02:29 centos5 postfix/smtpd[531]: disconnect from localhost.localdomain[127.0.0.1]

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

Самое просто решение данной проблемы - это исколючить домен vmware.local из $mydestination

# postconf mydestination
mydestination = localhost.$mydomain, localhost

Еще раз отправляем сообщение и смотрим log-файл

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5.vmware.local ESMTP Postfix
helo localhost
250 centos5.vmware.local
mail from:<>
250 2.1.0 Ok
rcpt to:<alex@vmware.local>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hello world
.
250 2.0.0 Ok: queued as 6FB701804A3
quit
221 2.0.0 Bye
Connection closed by foreign host.
Sep 28 16:45:47 centos5 postfix/smtpd[828]: connect from localhost.localdomain[127.0.0.1]
Sep 28 16:46:03 centos5 postfix/smtpd[828]: 6FB701804A3: client=localhost.localdomain[127.0.0.1]
Sep 28 16:46:09 centos5 postfix/cleanup[836]: 6FB701804A3: message-id=<20090928134603.6FB701804A3@centos5.vmware.local>
Sep 28 16:46:09 centos5 postfix/qmgr[825]: 6FB701804A3: from=<>, size=364, nrcpt=1 (queue active)
Sep 28 16:46:09 centos5 postfix/virtual[837]: 6FB701804A3: to=<alex@vmware.local>, relay=virtual, delay=14, delays=14/0.01/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)
Sep 28 16:46:09 centos5 postfix/qmgr[825]: 6FB701804A3: removed
Sep 28 16:46:10 centos5 postfix/smtpd[828]: disconnect from localhost.localdomain[127.0.0.1]

Как видно из сообщения письмо доставлено виртуальному пользователю alex, о чем свидетельствует строка relay=virtual, а также формат ящика - delivered to maildir


Некторые полезные команды

Вывод значения по умолчанию определенного параметра

# postconf -d smtpd_sasl_auth_enable
smtpd_sasl_auth_enable = no

Вывод текущего значения параметра

# postconf smtpd_sasl_auth_enable
smtpd_sasl_auth_enable = yes

Вывод версии postfix

# postconf | grep ^mail_version
mail_version = 2.6.2

Просмотр текущей очереди сообщений

# postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
6CE545FD1D* 1372355 Wed Aug 22 17:33:05  MAILER-DAEMON
                                         design@sys-adm.org.ua

1310D5FAE6*   56037 Wed Aug 22 17:33:33  gluck@mail.subscribe.ru
                                         alex@sys-adm.org.ua

-- 1395 Kbytes in 2 Requests.

Удаление всех писем из очереди

# postsuper -d ALL
postsuper: Deleted: 5 messages

Повторная отправка сообщений, которые находятся в очереди

# postqueue -f

Как мне реализовать «умный» грейлистинг?

Под словом «умный» я подразумеваю избирательный метод по определенным критериям. Например, дальше в примере, мы будем «награждать» грейлистингом хосты у которых отсутствует запись в обратной зоне или они используют т.н. литеральную форму, т.е. в helo подставляют ip адрес заключенный в квадратные скобки.

#/etc/postfix/main.cf

smtpd_recipient_restrictions =
...
 check_helo_access pcre:/etc/postfix/ip_literal.pcre
 check_client_access pcre:/etc/postfix/no_ptr.pcre
 
# Определяем пользовательский класс для грейлистинга
greylisting =
 check_sender_access hash:/etc/postfix/greylisting_skip_senders
 check_client_access cidr:/etc/postfix/greylisting_skip_hosts
 check_policy_service inet:127.0.0.1:2525

В данном примере в качестве грейлистинга я использовал - gld, который слушает входящие соединения на порту 2525. Вы можете использовать любой грейлистинг на ваш выбор.

В данном файле мы описываем отправителей, которых мы хотим исключить из грейлистинга

#/etc/postfix/greylisting_skip_senders

<> OK
postmaster OK

В данном файле мы описываем хосты, которые мы хотим исключить из грейлистинга

#/etc/postfix/greylisting_skip_hosts

# yahooGroups:
69.147.64.0/23 OK
69.147.102.0/23 OK
66.94.237.0/24 OK
66.163.168.0/23 OK
66.218.66.0/23 OK
209.73.160.0/24 OK
209.73.164.0/24 OK
209.131.38.0/24 OK
98.136.45.0/24 OK
67.195.134.0/24 OK

# rambler.ru:
81.19.66.0/23 OK
81.19.88.0/24 OK

# mail.ru:
194.67.23.0/24 OK
194.67.57.0/24 OK

# yandex.ru:
77.88.32.0/24 OK
87.250.248.0/24 OK
213.180.200.0/24 OK
213.180.223.0/24 OK
77.88.47.0/24 OK
77.88.60.0/23 OK

# pochta.ru:
81.211.64.0/24 OK
82.204.219.0/24 OK

# aha.ru/go.ru:
195.2.83.0/24 OK

# kyivstar.net:
193.41.60.22 OK

# Hotmail:
65.54.246.0/24 OK

# Google:
209.85.132.130/32 OK
209.85.132.184/29 OK
209.85.132.241/32 OK
209.85.132.244/32 OK
209.85.132.250/32 OK
212.159.30.228/32 OK
64.233.162.176/28 OK
64.233.162.224/27 OK
64.233.182.167/32 OK
64.233.184.130/32 OK
64.233.184.224/27 OK
66.249.82.224/28 OK
66.249.92.171/32 OK
66.249.93.114/32 OK
66.249.93.27/32 OK
216.239.32.0/19 OK
64.233.160.0/19 OK
66.249.80.0/20 OK
72.14.192.0/18 OK
209.85.128.0/17 OK
66.102.0.0/20 OK
74.125.0.0/16 OK
64.18.0.0/20 OK
207.126.144.0/20 OK

В данном файле мы описываем собственно саму политику - при отсутствии записи в обратной зоне, клиент будет награжден грейлистингом. greylisting - это пользоватлеьский класс, который определяется в файле main.cf.

#/etc/postfix/no_ptr.pcre

/^unknown$/ greylisting

В данном файле мы описываем политику - при использовании литеральной формы, клиент будет награжден грейлистингом.

#/etc/postfix/ip_literal.pcre

/^\[[[:digit:]\.]*\]$/ greylisting
# postmap /etc/postfix/greylisting_skip_senders
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

Как мне отклонять соединения от клиентов, когда mx отправителя резолвится в адрес из частной сети?
#/etc/postfix/main.cf

smtpd_sender_restrictions = 
...
 check_sender_mx_access cidr:/etc/postfix/sender_mx_access
...
#/etc/postfix/sender_mx_access

255.255.255.255 550 MX in world broadcast address
0.0.0.0/8       550 MX in block that refer to source hosts on "this" network
10.0.0.0/8      550 MX in RFC 1918 private network
127.0.0.0/8     550 MX in loopback network
169.254.0.0/16  550 MX in link local network
172.16.0.0/12   550 MX in RFC 1918 private network
192.0.2.0/24    550 MX in TEST-NET network
192.168.0.0/16  550 MX in RFC 1918 private network
198.18.0.0/15   550 MX in allocated for use in benchmark tests. RFC 2554
224.0.0.0/4     550 MX in class D multicast network
240.0.0.0/5     550 MX in class E reserved network
248.0.0.0/5     550 MX in reserved network

Тогда при попытке отправить отправить вам письмо в лог-файле будет следующее

Sep 27 11:31:44 mail postfix/smtpd[66465]: NOQUEUE: reject: RCPT from aft50.internetdsl.tpnet.pl[83.16.149.50]: 
550 5.7.1 <123@hal.com>: Sender address rejected: MX in loopback network; from=<123@hal.com> to=<iamjustsendingthisleter@sys-adm.org.ua> 
proto=SMTP helo=<aft50.internetdsl.tpnet.pl>

А теперь давайте посмотрим что же не понравилось postfix в этом клиенте

# host -t mx hal.com
hal.com mail is handled by 10 localhost.hal.com.

# host localhost.hal.com
localhost.hal.com has address 127.0.0.1

Теперь думаю все стало понятно, врядли стоит принимать почту от клиентов у которых MX запись указывает на 127.0.0.1


Как мне запретить прием почты от определенного домена/пользователя?
#/etc/postfix/main.cf

smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access
#/etc/postfix/sender_access

domain.ua   REJECT   # Заблокировать всю почту с домена и поддоменов
spamer@     REJECT   # Заблокировать пользователя с любого домена
spamer@domain.ua   REJECT NO SPAM   # Заблокировать email.
# postmap /etc/postfix/sender_access
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

Как мне запретить прием писем с определенными вложениями?
#/etc/postfix/main.cf

header_checks = pcre:/etc/postfix/header_checks
#/etc/postfix/header_checks

/^(.*)name=\"(.*)\.(exe|bat|cmd|mp3)\"$/ REJECT Attachment type not allowed. File "$2" has unacceptable extension: "$3"

Тогда при попытке отправить письмо с вложением exe/bat/cmd/mp3 в лог-файле будет следующее

Sep 27 18:27:31 centos5 postfix/cleanup[2473]: 5F60118058D: message-id=<123842027.20090927184358@sys-adm.org.ua>
Sep 27 18:27:31 centos5 postfix/cleanup[2473]: 5F60118058D: reject: header Content-Type: APPLICATION/X-MSDOWNLOAD;? name="test.exe" from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]; 
from=<alex@sys-adm.org.ua> to=<root@sys-adm.org.ua> proto=ESMTP helo=<alex.sys-adm.org.ua>: 5.7.1 Attachment type not allowed. File "test.exe" has unacceptable extension: "exe"

Как избежать дублирования писем при использовании алиасов?

Например у нас есть следующий алиас

# /etc/aliases

info:     user1, user2

Если человек отправит письмо на info и user1, то user1 получит две копии письма. К сожалению архитектура postfix на данный момент не позволяет избежать данной проблемы


Как мне получать всю почту для не существующих ящиков?

Для этого достаточно задать следующие параметры в main.cf

#/etc/postfix/main.cf

luser_relay = info
local_recipient_maps =

При такой настройке вся почта для не существующих пользователей будет перенаправляться пользователю info

Особенности работы данной функции:

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

Чтобы узнать значение по умолчанию, необходимо выполнить следующую команду

# postconf -d local_recipient_maps
local_recipient_maps = proxy:unix:passwd.byname $alias_maps

Как заставить postfix уведомлять отправителя о том, что письмо не доставлено получателю и находится в очереди?

Для включения данной возможности необходимо задать параметр delay_warning_time

#/etc/postfix/main.cf

delay_warning_time = 3h

При такой настройке, уведомление будет отправляться через 3 часа


У меня в системе несколько интерфейсов, как мне указать postfix слушать только определенные?

Существует два способа решения этой задачи: внесения изменений в main.cf или master.cf

#/etc/postfix/main.cf

inet_interfaces = xxx.xxx.xxx.xxx, 127.0.0.1
#/etc/postfix/master.cf

xxx.xxx.xxx.xxx:smtp      inet  n       -       n       -       -       smtpd

127.0.0.1:smtp      inet  n       -       n       -       -       smtpd
# service postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]

Как указать postfix слушать порт отличный от 25го?

Для этого достаточно заменить строку в master.cf

smtp      inet  n       -       n       -       -       smtpd

на следующую

2525      inet  n       -       n       -       -       smtpd

И перезапустить postfix. После этого можно проверить изменения

# netstat -an | grep 2525
tcp        0      0 0.0.0.0:2525                0.0.0.0:*                   LISTEN

Как узнать поддерживает ли postfix аутентификацию, и если поддерживает, то какие методы?

Для этого достаточно выполнить следующую команду и после приветствия обязательно ввести ESMTP команду ehlo <host_name>

# telnet mail.sys-adm.org.ua 25
Trying 213.85.107.157...
Connected to mail.sys-adm.org.ua (213.85.107.157).
Escape character is '^]'.
220 mail.sys-adm.org.ua ESMTP
ehlo mail.sys-adm.org.ua
250-mail.sys-adm.org.ua
250-PIPELINING
250-SIZE 5242880
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

Строка 250-AUTH PLAIN LOGIN говорит о том, что данный сервер поддерживает два метода аутентификации - PLAIN и LOGIN.

Также из данного вывода мы можем получить следующую интересную информацию:

  • 250-SIZE 5242880 - максимальный размер письма ~5 Mb.
  • 250 DSN - данный сервер поддерживает DSN (Delivery Status Notifications)
  • 250-STARTTLS - включена поддержка SSL/TLS для передачи писем с помощью шифрования

Как узнать поддерживает ли postfix MySQL, LDAP, SQLite, PCRE, …

Для этого достаточно выполнить следующую команду

# postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix

Как видно из вывода данная сборка postfix не поддерживает MySQL. Так же можно проверить с какими внешними библиотеками собран сам postfix

# ldd /usr/libexec/postfix/master
        linux-gate.so.1 =>  (0x006f1000)
        libldap-2.3.so.0 => /usr/lib/libldap-2.3.so.0 (0x00c9b000)
        liblber-2.3.so.0 => /usr/lib/liblber-2.3.so.0 (0x007b5000)
        libpcre.so.0 => /lib/libpcre.so.0 (0x005b4000)
        libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x001a6000)
        libssl.so.6 => /lib/libssl.so.6 (0x0062f000)
        libcrypto.so.6 => /lib/libcrypto.so.6 (0x001ce000)
        libdl.so.2 => /lib/libdl.so.2 (0x00731000)
        libz.so.1 => /usr/lib/libz.so.1 (0x00110000)
        libdb-4.3.so => /lib/libdb-4.3.so (0x0030e000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x00d4b000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x00da9000)
        libc.so.6 => /lib/libc.so.6 (0x0042b000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00123000)
        libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00155000)
        libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x007c3000)
        libcom_err.so.2 => /lib/libcom_err.so.2 (0x00183000)
        libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x0056f000)
        /lib/ld-linux.so.2 (0x0040f000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00a33000)
        libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00186000)
        libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x0018f000)
        libselinux.so.1 => /lib/libselinux.so.1 (0x00595000)
        libsepol.so.1 => /lib/libsepol.so.1 (0x005d1000)

У меня на сервере 2 интерфейса и нужно, чтобы при соединении на 1й интерфейс выдавался один банер, а при соединении на 2й интерфейс второй. Как это можно реализовать?
#/etc/postfix/main.cf

banner_if1 = mx1.sys-adm.org.ua ESMTP
banner_if2 = mx2.sys-adm.org.ua ESMTP
#/etc/postfix/master.cf

xxx.xxx.xxx.xxx:smtp      inet  n       -       n       -       -       smtpd
    -o smtpd_banner=$banner_if1

yyy.yyy.yyy.yyy:smtp      inet  n       -       n       -       -       smtpd
    -o smtpd_banner=$banner_if2

Где xxx.xxx.xxx.xxx и yyy.yyy.yyy.yyy ip адрес первого и второго интерфейса соотвественно. Переменные banner_if1 и banner_if2 мы определяли в файле main.cf специально, так как в файле master.cf не допускаются пробелы в значениях параметров

Проверяем

# telnet xxx.xxx.xxx.xxx 25
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
Escape character is '^]'.
220 mx1.sys-adm.org.ua ESMTP
quit
221 2.0.0 Bye
Connection closed by foreign host.
# telnet yyy.yyy.yyy.yyy 25
Trying yyy.yyy.yyy.yyy...
Connected to yyy.yyy.yyy.yyy (yyy.yyy.yyy.yyy).
Escape character is '^]'.
220 mx2.sys-adm.org.ua ESMTP
quit
221 2.0.0 Bye
Connection closed by foreign host.

Как мне сохранить копии всех исходящих писем?
#/etc/postfix/main.cf

sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps
#/etc/postfix/sender_bcc_maps

@sys-adm.org.ua sender_bcc@sys-adm.org.ua
# postmap /etc/postfix/sender_bcc_maps
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

При такой настройке копии всех исходящих писем будут дублироваться на ящик sender_bcc@sys-adm.org.ua


Как мне сохранить копии всех входящих писем?
/etc/postfix/main.cf
recipient_bcc_maps = hash:$config_directory/recipient_bcc_maps
$config_directory/recipient_bcc_maps
@sys-adm.org.ua recipient_bcc@sys-adm.org.ua
# postmap /etc/postfix/recipient_bcc_maps
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

При такой настройке копии всех входящих писем будут дублироваться на ящик recipient_bcc@sys-adm.org.ua


Как мне сохранить копии всех писем?
#/etc/postfix/main.cf

always_bcc = all@sys-adm.org.ua

При такой настройке копии всех писем будут дублироваться на ящик all@sys-adm.org.ua

mail/postfix-faq.txt · Последние изменения: 2016/02/18 11:22 — root