04 - Postfix Устанавливаем недостающие пакеты
- Код: выделить все
dnf install postfix-mysql dovecot-mysql
Все основные компоненты почтовой системы будут оперировать с файлами в /var/vmail под отдельным пользователем:
- Код: выделить все
groupadd -g 1010 vmail
useradd -d /var/vmail/ -g 1010 -u 1010 vmail
chown vmail:vmail /var/vmail
Сделаем самоподписанные SSL сертификаты:
- Код: выделить все
mkdir /etc/postfix/certs
cd /etc/postfix/ssl/
openssl req -x509 -nodes -newkey rsa:1024 -days $((365*5)) -keyout free-adm2.ru.key -out free-adm2.ru.crt -subj /C=RU/ST=MOSCOW/L=BALASHICHA/O=HOME/OU=ENG/CN=free-adm.ru/emailAddress=sav@mail.ru
Просмотреть информацию о сертификате (*.crt)
- Код: выделить все
openssl x509 -noout -text -in free-adm2.ru.crt
Убеждаем Postfix работать с базой данных- Код: выделить все
mkdir /etc/postfix/mysql
cat /etc/postfix/mysql/relay_domains.cf
- Код: выделить все
hosts = localhost
user = postfix
password = 123456
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
cat /etc/postfix/mysql/virtual_alias_domain_maps.cf
- Код: выделить все
hosts = localhost
user = postfix
password = 123456
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1
cat /etc/postfix/mysql/virtual_alias_maps.cf
- Код: выделить все
hosts = localhost
user = postfix
password = 123456
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
cat /etc/postfix/mysql/virtual_mailbox_domains.cf
- Код: выделить все
hosts = localhost
user = postfix
password = 123456
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
cat /etc/postfix/mysql/virtual_mailbox_maps.cf
- Код: выделить все
hosts = localhost
user = postfix
password = 123456
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
Редактируем файл /etc/postfix/main.cf, обучая Postfix работать с базой по свежесозданным файлам:
- Код: выделить все
# ============================================================
# MySQL mappings
# ============================================================
relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
в /etc/postfix/master.cf редактируем секцию, отвечающую за submission:
- Код: выделить все
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_wrappermode=no
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
-o milter_macro_daemon_name=ORIGINATING
[!] Обязательно обращаем внимание на пробелы перед -o ключами — без них конфигурация не будет правильной.
Пока отложим в сторону master.cf, к нему мы вернёмся позднее, и продолжим с /etc/postfix/main.cf
- Код: выделить все
soft_bounce = no
myhostname = mail.domain.tld
mydomain = domain.tld
myorigin = $myhostname
# Убираем $myhostname и $mydomain из локального класса
# Чтобы не было do not list domain in BOTH mydestination and virtual_mailbox_domains
mydestination = localhost.$mydomain, localhost
## Вписываем свои сетки
## Обязательно отредактировать и сузить до максимально узкого диапазона
## Лучше вообще не использовать и не позволять отправку почты без авторизации
mynetworks = 195.0.1.0/24, 127.0.0.0/8
## Убираем nis:/ чтобы избежать спама в лог
## dict_nis_init: NIS domain name not set - NIS lookups disabled
alias_maps = hash:/etc/aliases
smtpd_banner = $myhostname ESMTP $mail_name
debug_peer_level = 2
debug_peer_list = 127.0.0.1
Это были изменения строк по умолчанию. А теперь добавим несколько секций наших настроек. Проверьте на дубликаты, убирая их из родной конфигурации, если они там встречаются. Я предлагаю свои настройки вписывать структурированными блоками в нижней части файла /etc/postfix/main.cf:
- Код: выделить все
# ============================================================
# RESTRICTIONS
#
# Uncomment reject_rbl_client if necessary
# More information at: http://help.ubuntu.ru/wiki/фильтрация_спама_на_уровне_smtp_протокола
# ============================================================
smtpd_discard_ehlo_keywords = etrn, silent-discard
smtpd_forbidden_commands = CONNECT GET POST
broken_sasl_auth_clients = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
disable_vrfy_command = yes
smtpd_helo_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_helo_hostname,
reject_invalid_helo_hostname
smtpd_data_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_pipelining,
reject_multi_recipient_bounce,
smtpd_sender_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_recipient_restrictions = reject_non_fqdn_recipient,
# reject_unknown_recipient_domain,
reject_multi_recipient_bounce,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
#check_policy_service unix:/var/spool/postfix/postgrey/socket,
#reject_rbl_client zen.spamhaus.org,
#reject_rbl_client bl.spamcop.net,
#reject_rbl_client dnsbl.sorbs.net,
reject_invalid_hostname
# ============================================================
# TLS
# ============================================================
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
smtpd_tls_key_file = /etc/postfix/certs/key.pem
smtpd_tls_cert_file = /etc/postfix/certs/cert.pem
tls_random_source = dev:/dev/urandom
# ============================================================
# LIMITS
# ============================================================
message_size_limit = 51200000
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 15
smtpd_error_sleep_time = 20
anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 20
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 30
smtpd_client_event_limit_exceptions = $mynetworks
smtpd_client_connection_limit_exceptions = $mynetworks
# ============================================================
# QUEUE
# ============================================================
maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d
Использовать или не использовать чёрные списки — ваш выбор. Я закомментировал соответствующие директивы reject_rbl_client, чтобы не плодить холивары. Грейлистинга зачастую хватает, а Spamhaus и иже с ним исповедуют неоднозначную политику, но на практике оказалось, что «честных ребят», в чёрные списки просто так не заносит и ложных срабатываний у нас не было. Повезло, наверное. Поэтому — дело вкуса включать директивы RBL или нет. Считайте, что я их указал в информационных целях.