Решил поделиться своим небольшим опытом работы с данным МТА. В данном документе, как и следует из его названия, я приведу наиболее часто задаваемые вопросы, а также пути их решения. Так же приведу некоторые полезные команды, которые облегчат вам рабоу с postfix. Все замечания и предложения насчет данного F.A.Q. присылайте мне по адресу [email protected]
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 # [email protected] FILTER altermime:
# # /etc/postfix/sender_access # [email protected] 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=<[email protected]> Oct 8 16:48:30 centos5 postfix/qmgr[16189]: 529151E888A: from=<[email protected]>, 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=<[email protected]>, 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]: <[email protected]>: Sender address triggers FILTER altermime:; from=<[email protected]> to=<[email protected]> 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=<[email protected]> Oct 8 16:50:43 centos5 postfix/qmgr[16189]: F16B01E888A: from=<[email protected]>, 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=<[email protected]> Oct 8 16:50:43 centos5 postfix/cleanup[16215]: 293401E8892: message-id=<[email protected]> Oct 8 16:50:43 centos5 postfix/qmgr[16189]: 293401E8892: from=<[email protected]>, size=936, nrcpt=1 (queue active) Oct 8 16:50:43 centos5 postfix/pipe[16216]: F16B01E888A: to=<[email protected]>, 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=<[email protected]>, 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, который удалил вложения и далее отправлено адресату
Как правило сообщение появляется если вы явно не задали значение параметра 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:<[email protected]> 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=<[email protected]> 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
Классы адресов это способ группировки адресов получателей по способу доставки их писем. Всего существует 5 встроенных классов адресов:
Каждый из предопределенных классов адресов определяет следующие три вещи:
Для решения данной задачи достаточно пречислить необходимых пользователей в файле и указать ссылку на него в параметре 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:<[email protected]> 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=<[email protected]> 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=<[email protected]>, 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:<[email protected]> 550 5.1.1 <[email protected]>: 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 <[email protected]>: Recipient address rejected: User unknown in local recipient table; from=<> to=<[email protected]> proto=SMTP helo=<localhost> Sep 28 17:20:10 centos5 postfix/smtpd[1304]: disconnect from localhost.localdomain[127.0.0.1]
Итак у нас 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
Указываем, где хранить и в каком формате почту для пользователя [email protected]
# cat /etc/postfix/virtual_mailbox [email protected] vmware.local/[email protected]/
Настройки минимальные, только чтобы описать суть проблемы. Как видно из вывода наш домен - vmware.local указан в $mydestination с помощью параметра $mydomain, а также он указан в $virtual_mailbox_domains. Т.е. мы указали один и тот же домен сразу в двух классах адресов - локальных и виртуальных. Чего не стоит никогда делать.
Теперь давайте отправим почту пользователю [email protected] (в системе существует системный пользователь 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:<[email protected]> 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=<[email protected]> 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=<[email protected]>, 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:<[email protected]> 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=<[email protected]> 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=<[email protected]>, 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 [email protected] 1310D5FAE6* 56037 Wed Aug 22 17:33:33 [email protected] [email protected] -- 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
#/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 <[email protected]>: Sender address rejected: MX in loopback network; from=<[email protected]> to=<[email protected]> 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 # Заблокировать пользователя с любого домена [email protected] 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=<[email protected]> 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=<[email protected]> to=<[email protected]> 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
Особенности работы данной функции:
Чтобы узнать значение по умолчанию, необходимо выполнить следующую команду
# postconf -d local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps
Для включения данной возможности необходимо задать параметр delay_warning_time
#/etc/postfix/main.cf delay_warning_time = 3h
При такой настройке, уведомление будет отправляться через 3 часа
Существует два способа решения этой задачи: внесения изменений в 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 ]
Для этого достаточно заменить строку в 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
Для этого достаточно выполнить следующую команду и после приветствия обязательно ввести 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.
Также из данного вывода мы можем получить следующую интересную информацию:
Для этого достаточно выполнить следующую команду
# 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)
#/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 [email protected]
# postmap /etc/postfix/sender_bcc_maps # postfix reload postfix/postfix-script: refreshing the Postfix mail system
При такой настройке копии всех исходящих писем будут дублироваться на ящик [email protected]
/etc/postfix/main.cf recipient_bcc_maps = hash:$config_directory/recipient_bcc_maps
$config_directory/recipient_bcc_maps @sys-adm.org.ua [email protected]
# postmap /etc/postfix/recipient_bcc_maps # postfix reload postfix/postfix-script: refreshing the Postfix mail system
При такой настройке копии всех входящих писем будут дублироваться на ящик [email protected]
#/etc/postfix/main.cf always_bcc = [email protected]
При такой настройке копии всех писем будут дублироваться на ящик [email protected]