Настраиваем почтовый шлюз на базе CentOS 7 и Postfix с использованием SpamAssassin, ClamAV, OpenDKIM, SPF и DMARC
Шлюз будет функционировать следующим образом:
входящие сообщения с внешних почтовых серверов будет приходить на порт 25 и проверяться с помощью SpamAssassin и ClamAV
исходящие сообщения с внутреннего почтового сервера будут поступать на порт 10025 и подписываться посредством OpenDKIM
Будем считать, что IP-адрес внутреннего почтового сервера - 192.168.100.100, а внешний IP-адрес почтового шлюза - 198.51.100.1
Базовая конфигурация
устанавливаем Postfix
yum install postfix
вносим изменения в файл /etc/postfix/main.cf
inet_interfaces = all
inet_protocols = ipv4
myhostname = mail.example.com
mydestination =
relay_domains = example.com
relay_transport = smtp:[192.168.100.100]
relay_recipient_maps = hash:/etc/postfix/recipients
mynetworks = 192.168.100.100/32
local_transport = error:local mail delivery is disabled
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/postfix/public.cer
smtpd_tls_key_file = /etc/postfix/private.key
smtpd_tls_loglevel = 1
редактируем файл /etc/postfix/master.cf
10025 inet n - n - - smtpd
#local unix - n n - - local
создаем файл /etc/postfix/recipients со списком разрешенных получателей
создаем хэш-таблицу /etc/postfix/recipients.db со списком разрешенных получателей
postmap hash:/etc/postfix/recipients
создаем закрытый ключ и сертификат сервера (как это сделать, рассказывается здесь и здесь) и сохраняем их в файлах /etc/postfix/private.key и /etc/postfix/public.cer соответственно
настраиваем владельцев закрытого ключа и права доступа к нему
chmod 600 /etc/postfix/private.key
перезапускаем Postfix
systemctl restart postfix
SpamAssassin
устанавливаем репозиторий EPEL
yum install epel-release
устанавливаем SpamAssassin
yum install spamassassin
заменяем содержимое файла /etc/mail/spamassassin/local.cf
report_hostname mail.example.com
report_safe 0
запускаем SpamAssassin
systemctl start spamassassin
устанавливаем мильтр для интеграции SpamAssassin и Postfix
yum install spamass-milter
создаем группу для совместного доступа Postfix и spamass-milter к файлу сокета
groupadd sa-milt-sock
gpasswd -M sa-milt,postfix sa-milt-sock
добавляем в файл /etc/sysconfig/spamass-milter параметры запуска службы
SOCKET_OPTIONS="-g sa-milt-sock"
запускаем мильтр
systemctl start spamass-milter
добавляем в файл /etc/postfix/main.cf
milter_connect_macros = j {daemon_name} v _
замечание 1: в противном случае в журнал будут добавляться сообщения 'Could not retrieve sendmail macro "_" …'
замечание 2: также в журнале могут появляться сообщения 'Could not retrieve sendmail macro "!" …', но их можно игнорировать
редактируем файл /etc/postfix/master.cf
smtp inet n - n - - smtpd
-o smtpd_milters=unix:/run/spamass-milter/spamass-milter.sock
перезапускаем Postfix
systemctl restart postfix
ClamAV
устанавливаем ClamAV
yum install clamd
заменяем содержимое файла /etc/clamd.d/scan.conf
LogSyslog yes
User clamscan
LocalSocket /run/clamd.scan/clamd.sock
LocalSocketGroup virusgroup
LocalSocketMode 660
обновляем базу данных ClamAV
freshclam
запускаем ClamAV
systemctl start clamd@scan
устанавливаем мильтр для интеграции ClamAV и Postfix
yum install clamav-milter
создаем файл /etc/tmpfiles.d/clamav-milter.conf
d /run/clamav-milter 0711 clamilt clamilt
создаем группу для совместного доступа Postfix и clamav-milter к файлу сокета
groupadd clamilt-sock
gpasswd -M clamilt,postfix clamilt-sock
заменяем содержимое файла /etc/mail/clamav-milter.conf
User clamilt
ClamdSocket unix:/run/clamd.scan/clamd.sock
MilterSocket unix:/run/clamav-milter/clamav-milter.sock
MilterSocketGroup clamilt-sock
MilterSocketMode 660
AddHeader Replace
ReportHostname mail.example.com
OnInfected Accept
LogSyslog yes
LogFacility LOG_MAIL
LogClean Basic
LogInfected Basic
запускаем мильтр
systemctl start clamav-milter
редактируем файл /etc/postfix/master.cf
smtp inet n - n - - smtpd
-o smtpd_milters=unix:/run/spamass-milter/spamass-milter.sock,unix:/run/clamav-milter/clamav-milter.sock
перезапускаем Postfix
systemctl restart postfix
OpenDKIM
устанавливаем OpenDKIM
yum install opendkim
генерируем закрытый ключ и TXT-запись DNS
opendkim-genkey -b 1024 -d example.com -a -s mail
замечание: в результате выполнения команды будет создано два файла - mail.private и mail.txt
копируем закрытый ключ в папку /etc/opendkim/keys
cp mail.private /etc/opendkim/keys/opendkim.key
настраиваем владельцев закрытого ключа и права доступа к нему
chown opendkim:opendkim /etc/opendkim/keys/opendkim.key
chmod 640 /etc/opendkim/keys/opendkim.key
добавляем в DNS-зону TXT-запись, сохраненную в файле mail.txt
заменяем содержимое файла /etc/opendkim.conf
Socket local:/run/opendkim/opendkim.sock
Umask 007
Mode s
Canonicalization relaxed/relaxed
Domain example.com
Selector mail
InternalHosts 192.168.100.100
KeyFile /etc/opendkim/keys/opendkim.key
Syslog yes
SyslogSuccess yes
редактируем файл /etc/tmpfiles.d/opendkim.conf
D /run/opendkim 0711 opendkim opendkim -
удаляем и заново создаем папку /run/opendkim
systemd-tmpfiles --remove --create /etc/tmpfiles.d/opendkim.conf
создаем группу для совместного доступа Postfix и OpenDKIM к файлу сокета
groupadd dkimgroup
gpasswd dkimgroup -M opendkim,postfix
копируем unit-файл /usr/lib/systemd/system/opendkim.service в папку /etc/systemd/system
cp /usr/lib/systemd/system/opendkim.service /etc/systemd/system/opendkim.service
замечание: в результате unit-файл /etc/systemd/system/opendkim.service будет переопределять unit-файл /usr/lib/systemd/system/opendkim.service
редактируем файл /etc/systemd/system/opendkim.service
Group=dkimgroup
обновляем конфигурацию systemd
systemctl daemon-reload
запускаем OpenDKIM
systemctl start opendkim
редактируем файл /etc/postfix/master.cf
10025 inet n - n - - smtpd
-o smtpd_milters=unix:/run/opendkim/opendkim.sock
перезапускаем Postfix
systemctl restart postfix
SPF
добавляем в DNS-зону следующую запись:
хост - @
тип - TXT
значение - v=spf1 +ip4:198.51.100.1/32 -all
DMARC
добавляем в DNS-зону следующую запись:
хост - _dmarc
тип - TXT
значение - v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]; aspf=s; adkim=s; fo=1; pct=100