Введение
Зомби-блокировщик Postscreen — это первый уровень защиты. Он находится перед smtpd и, тестируя и анализируя поведение SMTP-клиента, решает, кого допустить к прямому соединению, а кого — нет
ВАЖНО! Postscreen не может сосуществовать на одном порту с MUA! Необходимо перенести MUA на другой порт (например 587) или другой интерфейс. Postscreen доступен в Postfix с версии 2.8 и выше, а некоторые функции (например «cache sharing») — с версии 2.9
Зомби-спам-боты создают самую серьезную нагрузку на почтовые сервера. Особенно усердны боты, которые не принимают отказ, а продолжают бесконечные подключения, вынуждая почтовый сервер каждый раз отвлекать свои ресурсы на постоянные соединения с ними. Для того чтобы разгрузить smtpd, используется postscreen. Postscreen проводит ряд тестов SMTP-клиента, и если он выявляет признаки «зомби», то удерживает его на эмуляции SMTP-сессии, не давая подключиться к основному демону — smtpd. При этом Postscreen поддерживает временный белый список для клиентов, к которым эти тесты не применяются. Postscreen никогда не проверяет контент, поскольку он не является достаточно надежным источником данных для анализа. Postscreen ищет в первую очередь нарушения, которые допускает зомби-клиент в стандартах SMTP-протокола.
Postscren проводит ряд тестов в том порядке, в котором они описаны ниже.
Postfix lists versus tables
Most Postfix lookup tables are used to look up information.
Examples are address rewriting (the lookup string is the old address,
and the result is the new address) or access control (the lookup
string is the client, sender or recipient, and the result is an
action such as «reject»).
With some tables, however, Postfix needs to know only if the
lookup key exists. Any non-empty lookup result value may be used
here: the lookup result is not used. Examples
are the that determine what local recipients
Postfix accepts in mail from the network, the parameter
that specifies what domains Postfix delivers locally, or the
parameter that specifies the IP addresses of trusted
clients or client networks. Technically, these are lists, not
tables. Despite the difference, Postfix lists are described here
because they use the same underlying infrastructure as Postfix
lookup tables.
Tests To MTA’s To See Max Size And Log Events
This can be useful to test if your server is configured right or if it’s another server that is rejecting messages because of max. size. Let’s say you get a bounce message, something like:
tried to deliver your message, but it was rejected by the server for the recipient domain domainA.com by emailgateway.domainA.com . The error that the other server returned was: 552 5.3.4 Error: message file too big from
$ telnet zcsmta.example.com 25 Trying zcsmta.example.com... Connected to zcsmta.example.com Escape character is '^]'. 220 service is ready. helo host.example.com 250 host.example.com ehlo host.example.com 250-example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XXXXXXXA 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM:<admin@example.com> SIZE=99999999 552 5.3.4 Message size exceeds fixed limit MAIL FROM:<admin@example.com> SIZE=10240000 250 2.1.0 Ok quit 221 2.0.0 Bye
The test above where I send the message I would be sending exceeded the ‘250-SIZE 10240000″ will also be logged on the Zimbra mta’s /var/log/zimbra.log :
Apr 24 09:05:06 zcsmta postfix/smtpd: NOQUEUE: reject: MAIL from host.example.com: 552 5.3.4 Message size exceeds fixed limit; proto=ESMTP helo=<example.com>
If you attempt to send from an external client a message that exceeds the limits on your Zimbra server, you’ll see the following log event in /var/log/zimbra.log :
Apr 24 08:33:26 zcsmta postfix/smtpd: warning: 7A735345A: queue file size limit exceeded
The 71735345A is the postfix queue id of the message in question.
In summary, a good starting point to see log events around exceeding message size is:
# grep postfix /var/log/zimbra.log | egrep 'reject|exceed|limit|warn' Apr 24 07:46:43 zcsmta postfix/smtpd: NOQUEUE: reject: MAIL from host.example.com: 552 5.3.4 Message size exceeds fixed limit; proto=ESMTP helo=<host.example.com> Apr 24 07:47:19 zcsmta postfix/smtpd: NOQUEUE: reject: MAIL from host.example.com: 552 5.3.4 Message size exceeds fixed limit; proto=ESMTP helo=<host.example.com> Apr 24 08:33:26 zcsmta postfix/smtpd: warning: 7A735345A: queue file size limit exceeded Apr 24 09:05:06 zcsmta postfix/smtpd: NOQUEUE: reject: MAIL from host.example.com: 552 5.3.4 Message size exceeds fixed limit; proto=ESMTP helo=<host.example.com>
References:
- To also see this max message size issues via reports you can run, see:
Команды
Проверка синтаксиса | postfix -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf check |
Состояние очереди | postqueue -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -p |
Обработка очереди немедленно | postqueue -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -f |
Очистка очереди | postsuper -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -d ALL |
Тест адресации | postmap -q address@domail.ru ldap:/etc/postfix/ldap-users.cf |
Работа с несколькими экземплярами
При решении некоторых задач можно воспользоваться возможностью работы с несколькими экземплярами (instance) сервера.
Для работы нужно добавить такие строки:/etc/postfix/main.cf
multi_instance_enable = yes
multi_instance_wrapper = ${command_directory}/postmulti -p -g ИМЯ_ГРУППЫ reload
multi_instance_directories = /etc/postfix-mx /etc/postfix-1 /etc/postfix-n
1 |
multi_instance_enable=yes multi_instance_wrapper=${command_directory}postmulti-p-gИМЯ_ГРУППЫreload multi_instance_directories=etcpostfix-mxetcpostfix-1etcpostfix-n |
в переменной
multi_instance_directories указывается экземпляры программы, в примере использованы следующие:
- etcpostfix-mx
- etcpostfix-1
- etcpostfix-n
Для того, чтобы при запуске/останове и перезапуске Postfix и по команде
service postfix …
1 | service postfix… |
нужно параметре
multi_instance_wrapper нужно указать имя группы (
ИМЯ_ГРУППЫ) в куда входя нужные экземпляров программы.
Также для того, чтобы разрешить работу с несколькими экземплярами можно использовать команду
postmulti -e init
1 | postmulti-einit |
Для управления служит программа
postmulti.
Примеры:
Создание | postmulti -I ИМЯ_ЭКЗЕМПЛЯРА -G ИМЯ_ГРУППЫ -e create |
Активация | postmulti -i ИМЯ_ЭКЗЕМПЛЯРА -e enable |
Управление экземпляром | postmulti -i ИМЯ_ЭКЗЕМПЛЯРА -p КОМАНДА |
Безопасность
mynetworks | список подсетей с которых разрешена отправка через этот сервер |
disable_vrfy_command=yes | Клиент, подключившийся к серверу, может командой vrfy user@domain.ru определить, существует ли заданный адрес в системе |
show_user_unknown_table_name=no | При попытке клиента отправить письмо несуществующему пользователю по умолчанию сервер выдаст 550(reject) с сообщением user unknown inlocal recipient table (или другой таблице). Отключаем, пусть сервер сообщает user unknown |
smtpd_helo_required=yes | Требуем от клиента приветствия (HELO/EHLO). Все, кто подключается, должны представляться |
smtpd_helo_restrictions= permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname | Ограничения для этапа HELOEHLO. Применяются к имени хоста, его IP-адресу и приветствию HELOEHLO:Разрешаем доверенные сетиРазрешаем тем, кто прошёл аутентификациюОтбрасываем неправильное (несуществующее) имя хостаОтбрасываем не полностью определённое доменное имя хостаОтбрасываем, если хост по HELO/EHLO не имеет А или МХ записи |
smtpd_sender_restrictions= reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unlisted_sender, permit_mynetworks, permit_sasl_authenticated | Ограничения для этапа MAIL FROM. Применяется ко всему предыдущему + имя отправителя:Отбрасываем не полностью определённое имя отправителяОтбрасываем отправителя с несуществующего доменаОтбрасываем несуществующих отправителейПроверяем отправителя. Если с нашего домена, то проверим, находится ли он в доверенной сети или прошёл аутентификациюРазрешаем отправлять с доверенных сетейРазрешаем отправлять прошедшим аутентификацию |
smtpd_recipient_restrictions= reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination reject_invalid_hostname | Ограничения для этапа RCPT TO. Применяется к предыдущему + имя получателя:reject, если получатель отсутствует в списке нашего домена или списке пересылки. Чтобы сервер не стал открытым relay |
smtpd_data_restrictions= reject_unauth_pipelining, reject_multi_recipient_bounce | Ограничения для этапа DATA:Отвергаем запрос, когда клиент посылает команды SMTP раньше времениreject клиента с пустым именем отправителя, который отправляет сразу нескольким получателям |
smtpd_etrn_restrictions= permit_mynetworks, permit_sasl_authenticated, reject | Ограничиваем клиентов, которые могут запрашивать очистку очереди сообщений |
Explanation of /etc/postfix/main.cf
Only the non-debconf lines are explained. For much more, run man 5 postconf or visit http://www.postfix.com/documentation.html.
smtp_tls_loglevel=1
Basic logging of connections to smtp.gmail.com.
smtp_tls_security_level=encrypt
Require an encrypted TLS connection to smtp.gmail.com. It would be preferable to use the verify level.
smtp_sasl_auth_enable=yes
Enable SMTP authentication.
smtp_sasl_password_maps=hash:/etc/postfix/sasl/passwd
Where the SMTP authentication data is to be found.
smtp_sasl_security_options = noanonymous
This one is a bit obscure: by specifying noanonymous, one allows plaintext passwords to be sent (I think noplaintext is the next level «up» from noanonymous). Gmail’s SMTP server apparently accepts plaintext authentication only.
smtp_generic_maps=hash:/etc/postfix/generic
Where the generic mapping data is to be found.
relayhost=:587
Address and port number for SMTP connections. Putting the hostname in square brackets means it is interpreted as a hostname, rather than a mail name (as I understand it, Postfix uses «normal» DNS records rather than MX records when square brackets are used).
How to fix Exchange error: 452 4.3.1 Insufficient system resources?
The 452 4.3.1 Insufficient system resources happen mainly when the server runs out of disk space or free memory. The solution to fix this error would be to:
- Increase the amount of free space on the Microsoft Exchange server drive
- Reduce the amount of memory being used by all processes
As we discussed earlier when the disk space threshold set for the volume used by the Exchange exceeds, it can trigger this error. However, the effects of this error vary depending on the threshold set.
The XML file, EdgeTransport.exe.config in the location \Exchange Server\Bin\ has many configuration options for transport servers in it.
To get Exchange transport to resume message submissions, we can adjust any of the settings below from the EdgeTransport.exe.config file.
- Disable BackPressure: Although Microsoft does not recommend it, it does provide a way to Disable Back Pressure
- Tweak BackPressure thresholds: Adjust the BackPressure parameters if it does not go with your resource usage or server configurations.
- Move the queue database to another volume: Move the queue database to another volume with ample free space.
Move the queue database to another volume
To move the queue database to another volume with ample free space, follow the steps below:
- Add the following key in the <AppSettings> section in EdgeTransport.exe.config. <add key=“QueueDatabasePath” value=”D:\Queue\QueueDB” />
- Save the file and restart the Microsoft Exchange Transport service from the Services console or by using the Restart-Service cmdlet (Restart-Service MSExchangeTransport).
Alternatively, we could fix this issue by bringing the disk usage below the threshold limits. Moving mailboxes, clearing logs from the disk, clearing trash, or deleting non-useful files from the drive can help with this.
Быстрые тесты
Быстрые тесты перед всеми остальными призваны в первую очередь определить клиентов, которые не нуждаются в тестировании.
- — Постоянные черные/белые списки
- — Временный белый список
- — MX-политика для тестов
Постоянные черные/белые списки
Параметр postscreen_access_list (значение по умолчанию = permit_mynetworks) указывает список постоянно разрешенных IP клиентов. Обычно в нем сначала указывают разрешение для допустимых сетей, а после — CIDR-таблицу белых/черных списков.
Формат CIDR интересен тем, что не требует никаких манипуляций или перечитывания, после добавления строк.
Пример
postscreen_access_list = permit_mynetworks, cidr:/etc/postfix/postscreen_access.cidr
Соответственно
# Rules are evaluated in the order as specified. # Blacklist 192.168.* except 192.168.0.1. 192.168.0.1 permit 192.168.0.0/16 reject
Очередность строк в CIDR-файле важна при обработке, т.к. поиск идет до первого совпадения.
После того, как адрес SMTP-клиента совпадет со строкой для которой указано значение «permit», произойдет логгирование адреса клиента и порта: .
События белого списка не контролируются в настройках — происходит немедленная передача клиентского соединения процессу Postfix SMTP (smtpd).
После того, как адрес SMTP-клиента совпадет со строкой для которой указано значение «reject», произойдет логгирование адреса клиента и порта: .
Параметр postscreen_blacklist_action указывает следующее событие. См. .
Временный белый список
Postscreen вносит IP-адрес SMTP-клиента, прошедшего все тесты, во временный белый список. Параметр postscreen_cache_map указывает его расположение. Временный белый список не используется для клиентских адресов присутствующих в постоянном белом списке.
Обычно это . По умолчанию $data_directory = /var/lib/postfix
ПРИМЕЧАНИЕ: Для того, чтобы использовать общий кэш для нескольких Postscreen экземпляров под мастер-демоном, надо использовать:
, отключив очистку кэша (), во всех Postscreen экземплярах, за исключением одного, ответственного за эту очистку.
Общий кэш доступен в Postfix версии 2.9 и выше; ранее proxymap не поддерживал очистку кэша. В качестве альтернативы можно использовать для общего кэша memcache_table.
Когда адрес SMTP-клиента появляется во временном белом списке, происходит логгирование адреса клиента и порта: . Это событие не контролируется в настройках, — происходит немедленная передача клиентского соединения процессу Postfix SMTP (smtpd). Клиент избавляется от дальнейших тестов до тех пор, пока его время пребывания во временном белом списке не истечет, что контролируется параметром postscreen_*_ttl parameters и без упоминаний продлевается когда допустимо.
MX-политика для тестов
Когда удаленный SMTP-клиент не найден в постоянном списке доступа или во временном белом списке, Postscreen проводит ряд тестов в отношение белого списка перед добавлением во временный список и предоставлением доступа к Postfix SMTP.
Когда Postscreen настроен для мониторинга всех основных и резервных MX, он может отказать клиентам белого списка, которые подключаются только к резервному MX (старый трюк спамеров — использовать резервный MX с более слабой анти-спам политикой) .
ПРИМЕЧАНИЕ: Следующие решения предназначены для малых сайтов. Большие сайты должны иметь общий кэш у основных и резервных MTA, чтобы использовать единую точку отказа.
- Во-первых, нужно настроить хост для прослушивания основного и резервного адреса MX. Настройте соответствующим образом сетевые интерфейсы локальной операционной системы. Во-вторых, нужно настроить Postfix на прослушивание нового IP-адреса (этот шаг необходим, после настройки inet_interfaces в «main.cf»).
- Затем настройте Postscreen, на отказ в обслуживании временного белого списка для резервных MX, например так:
postscreen_whitelist_interfaces = !IP.IP.IP.IP static:all
Расшифровка: разрешить клиентам проверяться во временном белом списке для всех серверов, за исключением , который является резервным MX.
Когда клиент, не присутствующий в белом списке коннектится к резервному MX, происходит логгирование адреса клиента и порта:
CONNECT from :port to :25
WHITELIST VETO :port
Расшифровка: клиент :port подключался к резервному MX , до того как был проверен через белый список. Клиент не будет внесен во временный белый список, даже если он пройдет все последующие тесты{этот перевод требует перепроверки}.
Potential Postfix problems
Cannot find password
If you get an error message like this:
<jane.doe@gmail.com>: delivery via smtp.gmail.com:587: host smtp.gmail.com said: 530 5.5.1 Authentication Required c24sm1773006ika (in reply to MAIL FROM command)
then Postfix cannot figure out what password to send gmail; make sure that the smtp_sasl_password_maps entry in /etc/postfix/main.cf is correct, that /etc/postfix/sasl/passwd is correct, and that you’ve created /etc/postfix/sasl/passwd.db.
No mechanism available
If you get an error message like this:
SASL authentication failed; cannot authenticate to server smtp.gmail.com: no mechanism available
you have probably forgotten the smtp_sasl_security_options line in /etc/postfix/main.cf.
Configuring Fetchmail
The setup presented here configures the system-wide fetchmail service, which is by default always running; for this use /etc/fetchmailrc is the configuration file. If you want to run fetchmail as your normal user you should use ~/.fetchmailrc; that case is not further discussed here.
Unlike the Postfix setup above, the fetchmail configuration presented here will verify the Gmail POP3 server’s certificate.
Service more SMTP clients at the same time
This section and the ones that follow discuss permanent measures
against mail server overload.
One measure to avoid the «all server processes busy» condition
is to service more SMTP clients simultaneously. For this you need
to increase the number of Postfix SMTP server processes. This will
improve the
responsiveness for remote SMTP clients, as long as the server machine
has enough hardware and software resources to run the additional
processes, and as long as the file system can keep up with the
additional load.
-
You increase the number of SMTP server processes either
by increasing the in main.cf (line 3 below),
or by increasing the SMTP server’s «maxproc» field in master.cf
(line 10 below). Either way, you need to issue a «postfix reload»
command to make the change effective. -
Process limits above 1000 require Postfix version 2.4 or
later, and an operating system that supports kernel-based event
filters (BSD kqueue(2), Linux epoll(4), or Solaris /dev/poll). -
More processes use more memory. You can reduce the Postfix
memory footprint by using cdb:
lookup tables instead of Berkeley DB’s : or : tables.1 /etc/postfix/main.cf: 2 # Raise the global process limit, 100 since Postfix 2.0. 3 = 200 4 5 /etc/postfix/master.cf: 6 # ============================================================= 7 # service type private unpriv chroot wakeup maxproc command 8 # ============================================================= 9 # Raise the SMTP service process limit only. 10 smtp inet n - n - 200 smtpd
-
NOTE: older versions of the SMTPD_POLICY_README document
contain a mistake: they configure a fixed number of policy daemon
processes. When you raise the SMTP server’s «maxproc» field in
master.cf, SMTP server processes will report problems when connecting
to policy server processes, because there aren’t enough of them.
Examples of errors are «connection refused» or «operation timed
out».To fix, edit master.cf and specify a zero «maxproc» field
in all policy server entries; see line 6 in the example below.
Issue a «postfix reload» command to make the change effective.1 /etc/postfix/master.cf: 2 # ============================================================= 3 # service type private unpriv chroot wakeup maxproc command 4 # ============================================================= 5 # Disable the policy service process limit. 6 policy unix - n n - 0 spawn 7 user=nobody argv=/some/where/policy-server
Пример
Пример для вставки в файл
main.cf
disable_vrfy_command = yes
show_user_unknown_table_name = no
smtpd_helo_required = yes
smtpd_helo_restrictions=
check_helo_access hash:/etc/postfix/helo_restrictions
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_invalid_helo_hostname,
reject_unknown_helo_hostname
smtpd_sender_restrictions=
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unlisted_sender,
permit_mynetworks,
permit_sasl_authenticated
smtpd_recipient_restrictions=
check_sender_access hash:/etc/postfix/sender_access
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unlisted_recipient,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
reject_invalid_hostname
smtpd_data_restrictions=
reject_unauth_pipelining,
reject_multi_recipient_bounce
smtpd_etrn_restrictions=
permit_mynetworks,
permit_sasl_authenticated,
reject
message_size_limit = 51200000
1 |
disable_vrfy_command=yes show_user_unknown_table_name=no smtpd_helo_required=yes smtpd_helo_restrictions= check_helo_access hashetcpostfixhelo_restrictions permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname,
reject_unknown_helo_hostname smtpd_sender_restrictions= reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unlisted_sender, permit_mynetworks,
permit_sasl_authenticated smtpd_recipient_restrictions= check_sender_access hashetcpostfixsender_access reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
reject_invalid_hostname smtpd_data_restrictions= reject_unauth_pipelining,
reject_multi_recipient_bounce smtpd_etrn_restrictions= permit_mynetworks, permit_sasl_authenticated, reject message_size_limit=51200000 |
Таблицы:/etc/postfix/helo_restrictions
80.84.114.82 OK
mail.aqmh.ru OK
aqmh.ru OK
aqmhdc.aqmh.com OK
mailpn.ru REJECT
stmails.ru REJECT
5.63.152.144 REJECT
1 |
80.84.114.82OK mail.aqmh.ru OK aqmh.ru OK aqmhdc.aqmh.com OK mailpn.ru REJECT stmails.ru REJECT 5.63.152.144REJECT |
/etc/postfix/sender_access
80.84.114.82 OK
mail.aqmh.ru OK
aqmh.ru OK
aqmhdc.aqmh.com OK
mailpn.ru REJECT
stmails.ru REJECT
5.63.152.144 REJECT
@mailpn.ru REJECT
1 |
80.84.114.82OK mail.aqmh.ru OK aqmh.ru OK aqmhdc.aqmh.com OK mailpn.ru REJECT stmails.ru REJECT 5.63.152.144REJECT @mailpn.ru REJECT |
Скрипт для компиляции таблиц:/etc/postfix/!update_db.sh
<em>#!/bin/bash</em>
postmap helo_restrictions sender_access transport
1 |
<em>#!/bin/bash</em> postmap helo_restrictions sender_access transport |
Когда все тесты пройдены успешно
Когда новый SMTP-клиент успешно проходит все тесты (т.е. он не внесен в какой-либо белый список), Postscreen логгирует это так: , где :port — IP-адрес клиента и порт. Затем Postscreen создает запись во временном белом списке, избавляя IP-адрес от дальнейших тестирований, на время пока время допустимого присутствия этой записи в белом списке не истечет, что регулируется параметрами postscreen_*_ttl parameters.
Если глубокое тестирование протокола не задействовано, Posctscreen немедленно передает соединение Postfix SMTP. Клиент не будет ощущать присутствие Postscreen (за исключением задержки, указанной в postscreen_greet_wait).
Если глубокое тестирование протокола включено, Postscreen не отдаст соединение для прямого коннекта с Postfix SMTP в середине своей сессии (т.е. здесь может быть либо «мягкий отказ», либо «полный отказ», либо пропуск теста по причине присутствия клиента в постоянном/временном белом списке). Вместо этого Postscreen задерживает доставку почты, выдавая предупреждение с 4XX статусом, логгирует информацию «helo»/»sender»/»recipient», и ожидает отключения клиента. В следующем подключении клиент будет допущен к прямому соединению с Postfix SMTP. Postscreen компенсирует последствия такого неудобного поведения длительным сроком допуска для клиентов прошедших глубокое тестирование. Это регулируется параметром (по умолчанию — 7 дней){информация требует проверки и уточнения}.
/etc/postfix/main.cf
When you install Postfix you will be prompted to make configurative choices. You can choose «No configuration»; in this case no configuration file will be created, and you can use the contents below. The configuration choices used to create it are listed in the Appendix.
This is the Postfix configuration file /etc/postfix/main.cf:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. myhostname = localhost alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = localhost, localhost.localdomain mynetworks = 127.0.0.0/8 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = loopback-only inet_protocols = all ########################################## ##### non debconf entries start here ##### ##### client TLS parameters ##### smtp_tls_loglevel=1 smtp_tls_security_level=encrypt smtp_sasl_auth_enable=yes smtp_sasl_password_maps=hash:/etc/postfix/sasl/passwd smtp_sasl_security_options = noanonymous ##### map jane@localhost to jane.doe@gmail.com ##### smtp_generic_maps=hash:/etc/postfix/generic relayhost=:587
An explanation of each non-standard line (following the comment «non debconf entries start here») is given in the Appendix.
SSL
Пример настройки работы по порту 587, с использованием сертификатов Let’s Encrypt:/etc/postfix/main.cf
smtpd_tls_cert_file=/etc/letsencrypt/live/domain.ru/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/domain.ru/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
1 |
smtpd_tls_cert_file=etcletsencryptlivedomain.rufullchain.pem smtpd_tls_key_file=etcletsencryptlivedomain.ruprivkey.pem smtpd_use_tls=yes smtpd_tls_session_cache_database=btree${data_directory}smtpd_scache
smtp_tls_session_cache_database=btree${data_directory}smtp_scache smtpd_sasl_type=dovecot smtpd_sasl_path=privateauth smtpd_sasl_local_domain= smtpd_sasl_security_options=noanonymous broken_sasl_auth_clients=yes smtpd_sasl_auth_enable=yes smtp_tls_security_level=may smtpd_tls_security_level=may smtp_tls_note_starttls_offer=yes smtpd_tls_loglevel=1 smtpd_tls_received_header=yes |
The Postfix lookup table model
Postfix uses lookup tables to store and look up information
for access control, address rewriting and even for content filtering.
All Postfix lookup tables are specified as «type:table», where
«type» is one of the database types described under «» at the end of this
document, and where «table» is the lookup table name. The Postfix
documentation uses the terms «database» and «lookup table» for the
same thing.
Examples of lookup tables that appear often in the Postfix
documentation:
All Postfix lookup tables store information as (key, value)
pairs. This interface may seem simplistic at first, but it turns
out to be very powerful. The (key, value) query interface completely
hides the complexities of LDAP or SQL from Postfix. This is a good
example of connecting complex systems with simple interfaces.
Benefits of the Postfix (key, value) query interface:
-
You can implement Postfix lookup tables first with local
Berkeley DB files and then switch to LDAP or MySQL without any
impact on the Postfix configuration itself, as described under «»
below. -
You can use Berkeley DB files with fixed lookup strings for
simple address rewriting operations and you can use regular expression
tables for the more complicated work. In other words, you don’t
have to put everything into the same table.
The size of the zimbraMailContentMaxSize controls the overall message size
su - zimbra zmprov ms `zmhostname` zimbraMailContentMaxSize 20000000 zmprov modifyConfig zimbraMailContentMaxSize 20000000
<attr id="807" name="zimbraMailContentMaxSize" type="long" cardinality="single" optionalIn="globalConfig,server" flags="serverInherited" since="6.0.0_BETA1"> <globalConfigValue>10240000</globalConfigValue> <desc>Maximum size in bytes for the <content > element in SOAP. Mail content larger than this limit will be truncated.</desc> </attr>
Here is an example to set the max message size to 42MB zmprov ms `zmhostname` zimbraFileUploadMaxSize 44040192 zmprov ms `zmhostname` zimbraMailContentMaxSize 44040192 zmprov mcf zimbraMtaMaxMessageSize 44040192 postfix reload one thing to watch for is to use a conversion tool to calculate the value in bytes otherwise it won't be accepted
- Clarify and update attrs.xml about necessary restarts for mta/file size variables
Introducing the qshape tool
When mail is draining slowly or the queue is unexpectedly large,
run qshape(1) as the super-user (root) to help zero in on the problem.
The qshape(1) program displays a tabular view of the Postfix queue
contents.
-
On the horizontal axis, it displays the queue age with
fine granularity for recent messages and (geometrically) less fine
granularity for older messages. -
The vertical axis displays the destination (or with the
«-s» switch the sender) domain. Domains with the most messages are
listed first.
For example, in the output below we see the top 10 lines of
the (mostly forged) sender domain distribution for captured spam
in the «:
-
The «T» column shows the total (in this case sender) count
for each domain. The columns with numbers above them, show counts
for messages aged fewer than that many minutes, but not younger
than the age limit for the previous column. The row labeled «TOTAL»
shows the total count for all domains. -
In this example, there are 14 messages allegedly from
yahoo.com, 1 between 10 and 20 minutes old, 1 between 320 and 640
minutes old and 12 older than 1280 minutes (1440 minutes in a day).
When the output is a terminal intermediate results showing the top 20
domains (-n option) are displayed after every 1000 messages (-N option)
and the final output also shows only the top 20 domains. This makes
qshape useful even when the is very large and it may
otherwise take prohibitively long to read the entire .
By default, qshape shows statistics for the union of both the
and which are the most relevant queues to
look at when analyzing performance.
One can request an alternate list of queues:
this will show the age distribution of the or
the union of the incoming active and .
Command line options control the number of display «buckets»,
the age limit for the smallest bucket, display of parent domain
counts and so on. The «-h» option outputs a summary of the available
switches.
Настройка брандмауэра
Перед тем, как мы начнем настройку, убедимся, что для почтового сервера у нас открыты необходимые порты в брандмауэре. В зависимости от используемой системы управления netfilter команды будут отличаться.
Для Iptables
Как правило, Iptables используется для систем на базе Debian.
Для того, чтобы открыть нужные нам порты, вводим:
iptables -I INPUT 1 -p tcp —match multiport —dports 25,465,587 -j ACCEPT
iptables -I INPUT 1 -p tcp —match multiport —dports 110,143,993,995 -j ACCEPT
* где мы откроем следующие порты:
- 25 — стандартный SMTP через STARTTLS;
- 110 — стандартный POP3 через STARTTLS;
- 143 — стандартный IMAP через STARTTLS;
- 465 — защищенный SMTP через SSL/TLS;
- 587 — защищенный SMTP через STARTTLS;
- 993 — защищенный IMAP через SSL/TLS;
- 995 — защищенный POP3 через SSL/TLS.
Для сохранения правил установим пакет:
apt-get install iptables-persistent
И выполняем команду:
netfilter-persistent save
Firewalld
Firewalld, в основном, используется в системах на базе Red Hat.
Для открытия нужных нам портов вводим команды:
firewall-cmd —permanent —add-port=25/tcp —add-port=465/tcp —add-port=587/tcp
firewall-cmd —permanent —add-port=110/tcp —add-port=143/tcp —add-port=993/tcp —add-port=995/tcp
И применяем настройки:
firewall-cmd —reload
* где мы откроем следующие порты:
- 25 — стандартный SMTP через STARTTLS;
- 110 — стандартный POP3 через STARTTLS;
- 143 — стандартный IMAP через STARTTLS;
- 465 — защищенный SMTP через SSL/TLS;
- 587 — защищенный SMTP через STARTTLS;
- 993 — защищенный IMAP через SSL/TLS;
- 995 — защищенный POP3 через SSL/TLS.