Настройка почтового сервера для массовой рассылки сообщений
Содержание:
Настройка OpenDKIM и Postfix
OpenDKIM
Переносим старый конфигурационный файл opendkim и создаем новый.
FreeBSD:
mv /usr/local/etc/mail/opendkim.conf /usr/local/etc/mail/backup.opendkim.conf
ee /usr/local/etc/mail/opendkim.conf
Linux:
mv /etc/opendkim.conf /etc/backup.opendkim.conf
vi /etc/opendkim.conf
И приводим его к следующему виду:
AutoRestart Yes
AutoRestartRate 10/1h
Umask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12301@localhost
* все параметры можно оставить, как в данном примере, за исключением Socket — можно указать любой другой порт, вместо 12301.
Создаем файл доверенных узлов. В него пока войдут имя локального хоста (localhost) и его IP-адрес, которые будут приняты, как доверенные и подписаны:
vi /etc/opendkim/TrustedHosts
И вносим следующее:
127.0.0.1
localhost
* в данный файл мы заносим все IP-адреса и сети почтовых серверов, которые могут использовать наш сервер как почтовый релей. Таким образом, если в вашей системе используется подобная конфигурация, в файл TrustedHosts мы должны добавить адреса данных почтовых серверов.
Открываем файл /etc/default/opendkim:
vi /etc/default/opendkim
… его либо не должно быть, либо он должен быть пустой, либо проверяем строку с настройкой SOCKET и приводим ее к виду:
SOCKET=inet:12301@localhost
Запускаем службу opendkim.
На FreeBSD:
Сначала добавляем демона в rc.conf:
echo ‘milteropendkim_enable=»YES»‘ >> /etc/rc.conf
echo ‘milteropendkim_uid=»opendkim»‘ >> /etc/rc.conf
* первая команда разрешает запуск демона, вторая — принудительно заставляет его запускаться от пользователя opendkim.
И запускаем его:
service milter-opendkim start
На Linux:
systemctl enable opendkim
systemctl start opendkim
Postfix
Открываем конфигурационный файл.
FreeBSD:
ee /usr/local/etc/postfix/main.cf
Linux:
vi /etc/postfix/main.cf
Добавляем или редактируем:
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
* если smtpd_milters и non_smtpd_milters присутствуют в конфигурационном файле, то приведенные в данном примере значения нужно дописать к имеющимся.
** 12301 — порт работы opendkim, который был задан в opendkim.conf.
Перезапускаем Postfix:
service postfix restart
или:
systemctl restart postfix
Шаг 2 — Настройка Postfix
На этом шаге мы настроим Postfix для отправки и приема электронных писем только с сервера, на котором он запущен, т. е. с .
Для этого нужно настроить Postfix для прослушивания только интерфейса loopback, интерфейса виртуальной сети, который сервер использует для внутренней связи. Для внесения изменений потребуется отредактировать главный файл конфигурации Postfix с именем , хранящийся в каталоге .
Откройте его для редактирования в предпочитаемом текстовом редакторе:
Найдите следующие строки:
/etc/postfix/main.cf
Задайте для параметра значение :
/etc/postfix/main.cf
Также вам потребуется изменить директиву , используемую для указания списка доменов, доставляемых через транспорт доставки почты . По умолчанию значения выглядят примерно так:
/etc/postfix/main.cf
Измените строку, чтобы она выглядела следующим образом:
/etc/postfix/main.cf
Если ваш домен фактически является субдоменом, и вы хотите, чтобы сообщения электронной почты выглядели, как если бы они были отправлены с главного домена, вы можете добавить следующую строку в конец файла :
/etc/postfix/main.cf
Необязательный параметр указывает, для каких доменов в адресе электронной почты будут урезаться субдомены.
После внесения изменений сохраните и закройте файл.
Примечание. В случае хостинга нескольких доменов на одном сервере другие домены также можно передать Postfix с помощью директивы .
Затем перезапустите Postfix, выполнив следующую команду:
Вы настроили Postfix только для отправки почты с вашего сервера. Теперь протестируем настройку, отправив тестовое сообщение на адрес электронной почты.
Настройка Dovecot
Открываем конфигурационный файл10-mail.conf:
vi /etc/dovecot/conf.d/10-mail.conf
Находим строку с mail_plugins и приводим ее к виду:
…
mail_plugins = $mail_plugins quota
…
* данная строка подключает к плагинам дополнительно плагин для управления квотами (quota). Если опция закомментирована, снимаем комментарий.
Открываем конфигурационный файл 20-imap.conf:
vi /etc/dovecot/conf.d/20-imap.conf
Находим опцию protocol imap и добавим в нее также возможность использования плагина с квотами:
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
* опция mail_plugins может быть закомментирована. Если это так, то коментарий снимаем.
Открываем конфигурационный файл 10-master.conf:
vi /etc/dovecot/conf.d/10-master.conf
Находим опцию service dict, в ней unix_listener dict и приводим ее к виду:
service dict {
unix_listener dict {
mode = 0660
user = vmail
group = vmail
}
}
Открываем файл 90-quota.conf:
vi /etc/dovecot/conf.d/90-quota.conf
Добавляем:
plugin {
quota = dict:User quota::proxy::quota
}
* или снимаем комментарий с соответствующей строки quota = dict:User quota::proxy::quota.
Открываем основной конфигурационный файл для dovecot:
vi /etc/dovecot/dovecot.conf
Находим раздел dict и снимаем комментарий или добавляем:
dict {
quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
Теперь создаем файл для настройки выгрузки квот:
vi /etc/dovecot/dovecot-dict-sql.conf.ext
connect = host=localhost dbname=postfix user=postfix password=postfix123
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
* где host — сервер mysql, к которому будем подключаться; dbname — имя базы данных, в которой находятся пользователи postfix; user — пользователь, под которым мы подключаемся к базе; password — пароль для подключения к базе. В данном примере мы подключимся к СУБД, которая находится на том же сервере (localhost) к базе postfix под пользователем postfix с паролем postfix123.
Откроем наш файл, в котором мы описываем настройки выборки данных по пользователям из базы данных:
vi /etc/dovecot/dovecot-sql.conf.ext
Находим запрос user_query и дописываем в SELECT CONCAT(‘*:bytes=’, quota) AS quota_rule — у меня в итоге получилось:
user_query = SELECT CONCAT(‘/home/mail/’,LCASE(`domain`),’/’,LCASE(`maildir`)), 1024 AS uid, 1024 AS gid, CONCAT(‘*:bytes=’, quota) AS quota_rule FROM mailbox WHERE username = ‘%u’
* если в нашем файле запросов есть несколько строк user_query, то необходимо дописать запрос для последней.
Проверяем конфигурационный файл dovecot:
doveconf
… и если команда не вернет ошибку, перезапускаем его:
systemctl restart dovecot
Настройка Spamassassin
В конфигурационном файле добавляем следующие строки:
vi /etc/mail/spamassassin/local.cf
include /usr/share/spamassassin/99_filter.cf
* в данном примере мы подгружаем файл 99_filter.cf, в котором будут наши ключевые фразы.
Создаем файл 99_filter.cf с ключевыми фразами:
vi /usr/share/spamassassin/99_filter.cf
body FILTER_CONTROL /Bad Phrase|Sale/Бомба/i
describe FILTER_CONTROL Bad Phrase description
score FILTER_CONTROL 0.001
* в данном примере мы задали настройку для двух фраз — Bad Phrase, Sale и бомба. Если в контенте письма попадутся данные фразы, им будет добавлен заголовок X-Spam-Status, в который попадет метка FILTER_CONTROL. Также мы задаем небольшой бал СПАМа, без него метка добавляться не будет (если необходимо, чтобы письмо попадало в СПАМ, задаем большой бал).
Перезапускаем spamassassin:
systemctl restart spamassassin
Отправляем письмо на ящик, который обслуживается нашим почтовым сервером. В теле письма пишем одно из ключевых фраз. Открываем заголовки письма — среди них мы должны увидеть что-то на подобие:
X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,FILTER_CONTROL
autolearn=no autolearn_force=no version=3.4.0
* как видим, в тексте есть наша метка FILTER_CONTROL.
Предварительные требования
Для выполнения заданий этого обучающего модуля вам потребуется доступ к пользователю без прав root с привилегиями . Для создания такого пользователя следуйте указаниям руководства «Начальная настройка сервера Ubuntu 18.04».
Для правильной настройки Postfix вам потребуется полностью квалифицированное доменное имя, указывающее на сервер Ubuntu 18.04. Полезную информацию по настройке доменного имени с помощью DigitalOcean можно найти в этом руководстве. Если вы планируете принимать почту, вам также потребуется запись MX, указывающая на ваш почтовый сервер.
Для целей этого обучающего модуля мы предположим, что вы настраиваете хост с FQDN .
Шаг 7 — Инициализация Maildir и тестирование клиента
Теперь мы можем протестировать клиент.
Самый простой способ создания структуры Maildir в домашнем каталоге — отправить себе электронное письмо. Для этого мы можем использовать команду Поскольку файл будет доступен только после создания Maildir, нам нужно отключить запись в него для нашего первого письма. Опция поможет нам в этом.
Для отправки письма добавьте строку в команду . Измените команду, чтобы сделать получателем вашего пользователя Linux:
Вы можете получить следующий ответ:
Это нормально, и такой ответ может появиться только при отправке первого сообщения. Мы можем еще раз проверить создание каталога, выполнив поиск нашего каталога :
Вы должны увидеть созданную структуру каталогов и новое сообщение в каталоге :
Похоже наше письмо доставлено.
Управление почтой с помощью клиента
Используйте клиент для проверки почты:
Вы должны увидеть новое сообщение:
Просто нажмите для вывода этого сообщения:
Вы можете веернуться к списку сообщений, введя и нажав :
Поскольку это сообщение не очень полезно, мы можем удалить его, введя и нажав :
Для выхода и возврата в терминал введите и нажмите :
Отправка писем с помощью клиента
Вы можете протестировать функцию отправки писем, набрав сообщение в текстовом редакторе:
Введите текст, которы вы хотите отправить по почте:
~/test_message
Мы можем использовать команду , чтобы направить сообщение в процесс . По умолчанию сообщение будет отправлено от имени вашего пользователя Linux. При желании вы можете изменить поле «From» с помощью атрибута :
Приведенные выше опции:
- : строка темы письма
- : изменение поля «From» письма. По умолчанию в этом поле указан текущий пользователь Linux. Опция позволяет задать другого отправителя.
- : учетная запись получателя письма. Измените этот адрес на адрес учетной записи, к которому у вас есть доступ .
Вы можете просмотреть отправленные сообщения в клиенте . Запустите интерактивный клиент еще раз с помощью следующей команды:
После этого откройте список отправленных сообщений с помощью следующей команды:
Вы можете управлять отправленными письмами с помощью тех же команд, которые используются для входящих писем.
Установка и предварительная настройка[править]
Для работы почтового сервера необходимо установить следующие пакеты:
# apt-get install postfix-dovecot postfix-ldap postfix-tls postfix dovecot
Проверим работу DNS:
# dig +short -t A dc.test.alt 10.10.105.1 # dig +short -t A mail.test.alt 10.10.105.2
Проверим доступ к LDAP-серверу:
# ldapsearch -h dc.test.alt -p 389 -W -D "ldapbind@test.alt" -b "cn=Users,dc=test,dc=alt"
Если подключения не произошло и появилась ошибка связанная с безопасностью подключения:
ldap_bind: Strong(er) authentication required (8) <br> additional info: BindSimple: Transport encryption required.
То необходимо добавить строчку в smb.conf:
ldap server require strong auth = No
Это команда должна выдать информацию о пользователях.
Все почтовые ящики пользователей будут хранится в директории /var/vmail и обрабатываться системным пользователем vmail c домашней директорией /var/vmail.
Создадим пользователя vmail и его домашнюю директорию:
# useradd -b /var -m -s /bin/false vmail
Настройка Postfix[править]
Настраиваем параметры postfix в файле /etc/postfix/main.cf:
# Использовать ipv4 и слушать на всех интерфейсах inet_protocols = ipv4 inet_interfaces = all # Следующие параметры оставляем без изменения queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix # Задаем полное имя сервера, которым postfix будет представляться при отправке/получении почты myhostname = mail.test.alt # Задаем имя нашего домена mydomain = test.alt # Имя от которого будут посылаться письма с локальной машины myorigin = mail.test.alt # Параметр указывает для каких доменов почта будет доставляться локально без пересылки на другие сервера mydestination = $myhostname, localhost.$mydomain, localhost # Указываем как доставляется локальная почта local_transport = virtual # Указываем как определять локальных пользователей local_recipient_maps = $virtual_mailbox_maps # Номер ошибки посылаемый оправителю при отказе unknown_local_recipient_reject_code = 550 # Задаем список виртуальных доменов virtual_mailbox_domains = test.alt virtual_mailbox_base = /var/mail/vhosts # Список разрешенных пользователей virtual_mailbox_maps = ldap:/etc/postfix/ldap/local_recipients.cf # Указываем сокет для доставки писем в dovecot virtual_transport = lmtp:unix:private/dovecot-lmtp # Указываем сертификаты, ключи SSL и включаем безопасные соединения и аутентификацию smtpd_tls_cert_file = /etc/postfix/smtp.test.alt.crt smtpd_tls_key_file = /etc/postfix/smtp.test.alt.key smtpd_use_tls = yes smtpd_tls_auth_only = yes # Настраиваем правила фильтрации писем smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, check_helo_access # Указываем опции SASL аутентификации через dovecot smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_local_domain = $myorigin
Для работы smtps раскоментируем следующие строки в файле /etc/postfix/master.cf:
smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
Далее создадим каталог ldap и добавим файлы с правилами, указанные выше:
# mkdir /etc/postfix/ldap
В этом каталоге создадим файл local_recipients.cf, который проверяет считать ли пользователя локальным:
debuglevel = 0 version = 3 server_host = dc.test.alt bind_dn = ldapbind@test.alt bind_pw = PaSSword search_base = dc=test,dc=alt search_scope = subtree query_filter = (&(|(userPrincipalName=%u@%d)(mail=%u@%d)(otherMailbox=%u@%d))(sAMAccountType=805306368)) result_attribute = userPrincipalName cache = no
Запускаем и добавляем в автозагрузку сервис postfix:
# systemctl enable postfix # systemctl start postfix
Tips and tricks
Blacklist incoming emails
user@example.com REJECT
Then use the command to create a database:
# postmap hash:blacklist_incoming
Add the following code before the first permit rule in :
smtpd_recipient_restrictions = check_sender_access hash:/etc/postfix/blacklist_incoming
Finally restart .
Hide the sender’s IP and user agent in the Received header
Add the following line to :
smtp_header_checks = regexp:/etc/postfix/smtp_header_checks
Create with this content:
/^Received: .*/ IGNORE /^User-Agent: .*/ IGNORE
Finally, restart .
Postfix in a chroot jail
First, go into the file in the directory and change all the chroot entries to ‘yes’ (y) except for the services , , , , and
Second, create two functions that will help us later with copying files over into the chroot jail (see last step)
CP="cp -p"
cond_copy() { # find files as per pattern in $1 # if any, copy to directory $2 dir=`dirname "$1"` pat=`basename "$1"` lr=`find "$dir" -maxdepth 1 -name "$pat"` if test ! -d "$2" ; then exit 1 ; fi if test "x$lr" != "x" ; then $CP $1 "$2" ; fi }
Next, make the new directories for the jail:
set -e umask 022
POSTFIX_DIR=${POSTFIX_DIR-/var/spool/postfix} cd ${POSTFIX_DIR}
mkdir -p etc lib usr/lib/zoneinfo test -d /lib64 && mkdir -p lib64
Find the localtime file
lt=/etc/localtime if test ! -f $lt ; then lt=/usr/lib/zoneinfo/localtime ; fi if test ! -f $lt ; then lt=/usr/share/zoneinfo/localtime ; fi if test ! -f $lt ; then echo "cannot find localtime" ; exit 1 ; fi rm -f etc/localtime
Copy localtime and some other system files into the chroot’s etc
$CP -f $lt /etc/services /etc/resolv.conf /etc/nsswitch.conf etc $CP -f /etc/host.conf /etc/hosts /etc/passwd etc ln -s -f /etc/localtime usr/lib/zoneinfo
Copy required libraries into the chroot using the previously created function
cond_copy '/usr/lib/libnss_*.so*' lib cond_copy '/usr/lib/libresolv.so*' lib cond_copy '/usr/lib/libdb.so*' lib
And don’t forget to reload Postfix.
Resource Record
DANE supports several types of records, however not all of them are suitable in Postfix.
Certificate usage 0 is unsupported, 1 is mapped to 3 and 2 is optional, thus it is recommendet to publish a «3» record.
More on .
Configuration
This article or section needs expansion.
Opportunistic DANE is configured this way:
/etc/postfix/main.cf
smtpd_use_tls = yes smtp_dns_support_level = dnssec smtp_tls_security_level = dane
/etc/postfix/master.cf
dane unix - - n - - smtp -o smtp_dns_support_level=dnssec -o smtp_tls_security_level=dane
To use per-domain policies, e.g. opportunistic DANE for example.org and mandatory DANE for example.com,
use something like this:
/etc/postfix/main.cf
indexed = ${default_database_type}:${config_directory}/ # Per-destination TLS policy # smtp_tls_policy_maps = ${indexed}tls_policy # default_transport = smtp, but some destinations are special: # transport_maps = ${indexed}transport
transport
example.com dane example.org dane
tls_policy
example.com dane-only
Note: For global mandatory DANE, change to . Be aware that this makes Postfix tempfail (respond with a error code) on all deliveries that do not use DANE at all!