Налаштування Postfix на CentOS

Поширте інформацію:

Отже, ви орендуєте VPS, на якому виконується ваш сайт на PHP. На сайті є форма зворотного зв’язку для відвідувачів. Коли відвідувач відправить форму, його звернення треба переслати на електронну пошту.

Для того, щоб відправлене повідомлення прибуло до адресата, на сервері має бути правильно налаштоване ПЗ, що називається MTA (Mail Transfer Agent). Без правильних налаштувань поштові сервери отримувачів (зазвичай це популярні поштові служби як Gmail, Ukr.net, Yandex, Mail.ru тощо) будуть вважати ваш поштовий сервер якимось вар’ятом і погрожувати, що ще трохи – і внесуть його у чорні списки ))

Мова буде йти про популярний поштовий сервер Postfix під керування Centos 6. Налаштуємо його спершу для відправлення, зробимо підтвердження відправника за допомогою технології SPF (Sender Policy Framework), потім налаштуємо для прийому.

Для того, щоб навчитись налаштовувати Postfix, треба курити офіційну документацію, оскільки більшість інструкцій в неті написані сповідниками карго-культу, які переписують з інших джерел команди і налаштування, не розуміючи, що вони означають. Хіба що гостро бракує часу, тоді можете використовувати цю інструкцію ;) Я намагався зрозуміти і коротко пояснити.

1. Встановлюємо повне доменне ім’я (FQDN) сервера

Насамперед потрібно встановити повне доменне ім’я поштового сервера. Нехай ми налаштовуємо пошту для домену example.com, наш поштовий сервер в цьому домені назвемо mail, для нього виділено статичну IP-адресу 11.22.33.44. Прописуємо у файлі /etc/hosts/ (знак # означає, що команду в bash треба виконувати під sudo):

# vim /etc/hosts
11.22.33.44 mail.example.com mail

Перевіряємо:

$ hostname -f
mail.example.com

2. Встановлюємо PTR-запис (опціонально)

Бажано встановити ще так званий Reverse DNS (PTR) record. На відміну від прямих DNS-записів, які прив’язують доменне ім’я до IP-адреси, зворотний запис PTR прив’язує IP-адресу хоста до доменного імені. Використовується він поштовими серверами адресатів при перевірці справжності відправника (чи може даний хост відсилати пошту з такого-то домена). PTR-запис налаштовується хостером сервера (а не в DNS-налаштуваннях домену). Один IP можна прив’язати лише до одного домена. В Digital Ocean PTR-запис встановлюється автоматично при встановленні чи зміні назви дроплета. Перевірити, чи встановлений для IP PTR-запис можна так:

$ dig -x 11.22.33.44 PTR

У відповіді має бути приблизно таке:

;; ANSWER SECTION:
44.33.22.11.in-addr.arpa. 1800 IN   PTR mail.example.com.

(IP-адреса записана ззаду наперед).

3. Встановлюємо Postfix, якщо він раптом не встановлений (на CentOS має бути встановлений з коробки)

# yum -y install postfix

4. Правимо налаштування Postfix

Налаштування зберігаються в каталозі /etc/postfix. Доступ туди повинен мати тільки root. Два центрові файли — це main.cf і master.cf. У них з # починаються рядки коментарів, так само, як у bash. Перейменовуємо файл /etc/postfix/main.cf, створюємо чистий файл з такою назвою і пишемо в ньому

$ sudo vim /etc/postfix/main.cf

# Ім’я хоста
myhostname = mail.example.com

# Параметр mydomain, якщо не задається явно, то
# утворюється з myhostname відкиданням зліва частини по першу крапку

# Параметр myorigin визначає адресу відправника у випадку,
# якщо вказано тільки ім’я користувача (до "@").
# В даному прикладі задаємо, що якщо віправник просто user,
# то його повний email буде [email protected], а не [email protected]
myorigin = $mydomain

# Параметр mynetworks визначає, з яких мереж сервер буде приймати пошту для доставки.
# Можна це задавати також через mynetworks_style.
# Параметр relay_domains визначає, для яких доменів сервер
# буде діяти як relay, тобто транзитний сервер.
# В прикладі вказуємо приймати лише з локальної машини
# і нікому не дозволяти використовувати наш сервер для транзиту пошти
mynetworks_style = host
relay_domains =

Після збереження файлу потрібно активувати зміни:

$ sudo postfix reload

5. Налаштовуємо SPF-запис

Sender Policy Framework використовують поштові сервери адресатів для автентифікації відправника, визначення, чи має право даний хост відправляти пошту від імені користувачів даного домену. Щоб автентифікувати наш поштовий сервер, необхідно в DNS-зону домену додати запис TXT такого виду:

example.com. 1800 IN TXT v=spf1 ip4:11.22.33.44 ~all

Формат описується тут. В нашому прикладі

v=spf1 — вказуємо, що це запис SPF,

ip4: (те саме, що +ip4:) — вважати вказану IP-адресу дозволеною, може бути вказана підмережа (як 11.22.33.0/24),

~all — всі інші хости не вважати ні дозволеними, ні забороненими (softfail)

Щоб всі інші хости вважали забороненими, замість “тильди” треба написати “мінус”:

example.com. 1800 IN TXT v=spf1 ip4:11.22.33.44 -all 

Можна задати пошук і застосування правил з DNS-записів іншого домена за допомогою механізму include:

example.com. 1800 IN TXT v=spf1 include:example.net -all

Тобто враховувати правила, задані в SPF-записі для домена example.net.

Можна задати перевірку на основі PTR запису, який ми налаштовували в п.2

example.com. 1800 IN TXT v=spf1 ptr -all

6. Перевіряємо

Ми вже можемо відсилати пошту з нашого сервера. Для зручності можна встановити пакет mailx

# yum -y install mailx

Тепер можна писати прямо з консолі:

$ mail -s "Subject of test message" [email protected]
Hello, Peter...
...
EOT

(набір тексту повідомлення завершуємо комбінацією Ctrl-D). Так само можна вже використовувати PHP-функцію mail чи бібліотеку, наприклад, SwiftMail. Можна спостерігати за записом журналу в режимі реального часу, відкривши іншу термінальну сесію і написавши там

$ sudo tail -f /var/log/maillog

7. Налаштовуємо шифрування повідомлень

Природно, ми не хочемо, щоб наші повідомлення можна було читати на будь-якому з поштових вузлів у ланцюжку до адресата. Щоб уникнути цього, використовується шифрування TLS — Transport Layer Security, наступник SSL.

Для використання TLS сервер потребує сертифікат і приватний ключ. Обидва мусять бути у форматі “PEM”. Приватний ключ мусить бути некриптованим, тобто доступним без пароля.

TLS/SSL сертифікат, завірений одним із всесвітньо відомих центрів сертифікації можна отримати в провайдерів таких послуг. Втім, якщо ми хочемо просто шифрувати пошту, то можемо згенерувати самопідписаний сертифікат. Наступний приклад показує, як згенерувати RSA-ключ довжиною 2048 біт та самопідписаний сертифікат, дійсний протягом 10 років.

# mkdir /etc/postfix/ssl && cd /etc/postfix/ssl
# (umask 077; openssl genrsa -out smtpd-key.pem 2048)
# openssl req -new -key smtpd-key.pem -x509 -subj "/CN=mail.example.com" -days 3650 -out smtpd-cert.pem

В каталозі /etc/postfix/ssl отримуємо 2 файли — ключ і сертифікат.

Прописуємо у файлі /etc/postfix/main.cf

# TLS-налаштування сервера

# Шлях до файлу з сертифікатом
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd-cert.pem
# Шлях до файлу з ключем
smtpd_tls_key_file = /etc/postfix/ssl/smtpd-key.pem
# Вмикаємо необв’язкове шифрування (нешифровані з’єднання приймаємо теж)
smtpd_tls_security_level = may
# Додавати до повідомлення заголовок Received:
# з інформацією про протокол, шифр, Common Name і т.ін.
smtpd_tls_received_header = yes
# Рівень деталізації записів про шифрування в журналі
smtpd_tls_loglevel = 1

# Для автентифікації віддалених серверів використовуємо
# системну збірку сертифікатів (це вирішує проблему записів у журналі
# certificate verification failed for gmail-smtp-in.l.google.com[209.85.232.27]:25:
# untrusted issuer /C=US/O=Equifax/OU=Equifax Secure Certificate Authority)
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# TLS-налаштування клієнта

# Пропонуємо віддаленому серверу шифрування
smtp_tls_security_level = may
# Рівень деталізації записів про шифрування в журналі
smtp_tls_loglevel = 1
# Шлях до кешу сеансів
smtp_tls_session_cache_database = btree:$data_directory/smtp_scache
# Шлях до генератора псевдовипадкових чисел
tls_random_source = dev:/dev/urandom

Не забуваємо застовувати зміни

$ sudo postfix reload

8. Прийом і переадресація пошти (аліаси)

Часто нам не потрібно організовувати повноцінний поштовий сервер, який приймає підключення програм-поштових клієнтів. Достатньо приймати пошту на кілька адрес домену і перенаправляти її, наприклад, на Gmail. Це зробити легко, а про налаштування повного поштового сервера буде в наступних дописах.

У файлі /etc/postfix/main.cf вказуємо домени, для яких наш поштовий сервер є “кінцевим пунктом призначення”:

# Приймати пошту для доменів
# Треба вказати всі можливі імена хосту, включаючи localhost
# для уникнення зациклення доставки
mydestination = $myhostname localhost.$mydomain localhost $mydomain

Не вказуйте у mydestination додаткові (віртуальні) домени, про які піде мова нижче

У файрволі потрібно відкрити порт 25

$ sudo iptables -A INPUT -p tcp -d 11.22.33.44 --dport 25 -j ACCEPT

В DNS-зоні домену прописуємо MX-запис (і A-запис, який прив’язує ім’я хоста mail до IP-адреси):

mail.example.com. 1800 IN A 11.22.33.44
example.com. 1800 IN MX 10 mail.example.com.

10 — пріоритет MX-сервера (домен може мати кілька MX-серверів). Тепер наш сервер буде приймати пошту для адрес [email protected], де user — ім’я облікового запису UNIX на сервері, або аліас. У файлі /etc/postfix/main.cf прописуємо

# Де знаходиться файл з аліасами
alias_maps = hash:/etc/aliases

У цьому файлі прописуються переадресації. Наприклад,

$ sudo vim /etc/aliases

# Повідомлення для info перенаправляються на postmaster
info:       postmaster
# Повідомлення для postmaster перенаправляються на root
postmaster: root
# Хто приймає повідомлення для root
root:       mmm
# Повідомлення для coder пересилаються на зовнішній email
mmm:        [email protected]

Після редагування цього файлу необхідно віддати команду

$ sudo newaliases

9. Віртуальні домени

Сервер може приймати/переадресовувати пошту для кількох доменів. Досі ми вели мову про канонічний (основний) домен, додаткові домени називаються віртуальними. Налаштувати прийом пошти на них нескладно. Наприклад, ми хочемо приймати (переадресовувати) пошту на деякі скриньки доменів example.net і example.org. Пишемо

$ sudo vim /etc/postfix/main.cf

virtual_alias_domains = example.net example.org
virtual_alias_maps = hash:/etc/postfix/virtual

Створюємо файл /etc/postfix/virtual, в якому прописуємо переадресації

$ sudo vim /etc/postfix/virtual

[email protected]      postmaster
[email protected]      postmaster
[email protected]            [email protected]

Після зміни цього файлу необхідно запустити команду

$ sudo postmap /etc/postfix/virtual

А після зміни main.cf — postfix reload, як завжди.

10. Проблема з SPF-автентифікацією для переадресацій та віртуальних доменів

Пам’ятаєте, в п. 5 ми налаштовували SPF-запис для автентифікації відправника?

Так от, якщо з якоїсь адреси [email protected] пишуть повідомлення нам на адресу [email protected], а наш сервер пересилає його на Gmail, то Gmail пробує знайти IP нашого сервера 11.22.33.44 в SPF-політиці домену початкового відправника (yahoo.com). Природно, що не знаходить і автентифікація провалюється

Received-SPF: softfail (google.com: domain of transitioning [email protected] does not designate 11.22.33.44 as permitted sender);

Для вирішення цієї проблеми використовується SRS – Sender Rewriting Scheme.

На блозі MIND IT пропонується встановити програму postsrsd від Timo Röhling.

Ця програма при виконанні Postfix’ом переадресації замінює адресу відправника [email protected] на адресу виду [email protected], таким чином перенаправлене повідомлення проходить SPF-автентифікацію. Крім того, адресат може дізнатися, хто оригінальний відправник.

Програми немає в репозиторіях, треба компілювати з сирців. Але залежностей вона не вимагає і компілюється дуже швидко. Тільки має бути встановлено пакет cmake.

$ cd ~
$ wget https://github.com/roehling/postsrsd/archive/master.zip
$ unzip master.zip
$ cd postsrsd-master/
$ sudo make
$ sudo make install

Правимо /etc/postfix/main.cf

# Перезапис заголовка Return-Path на значення, яке дає PostSRS
sender_canonical_maps = tcp:127.0.0.1:10001
sender_canonical_classes = envelope_sender
recipient_canonical_maps = tcp:127.0.0.1:10002
recipient_canonical_classes = envelope_recipient

Запускаємо демон PostSRS і перезапускаємо postfix

# chkconfig postsrsd on
# service postsrsd start
# postfix reload

Це працює на CentOS 7. І мало би працювати на CentOS 6, але Postfix, включений в дистрибутив CentOS 6, скомпільований без підтримки типу таблиць tcp. Тому цей стандартний Postfix з такими налаштуваннями видає помилку: “fatal: unsupported dictionary type: tcp”.

Щоб вирішити цю проблему, треба оновити Postfix, наприклад, з репозиторія http://repos.oostergo.net. Створюємо файл:

$ sudo vim /etc/yum.repos.d/postfix.repo
[postfixrepo]
name=EL-$releasever Postfix repo
baseurl=http://repos.oostergo.net/$releasever/postfix-2.11
enabled=1
gpgcheck=1

Імпортуємо ключ:

$ sudo rpm --import http://repos.oostergo.net/RPM-GPG-KEY

Забороняємо оновлення Postfix зі стандартних репозиторіїв.

$ sudo vim /etc/yum.repos.d/CentOS-Base.repo

В секціях [base] і [updates] дописуємо:

exclude=postfix-*

І оновлюємо Postfix

$ sudo yum update postfix

Тепер у нас Postfix версії 2.11 працює з PostSRS!

Інше рішення (див. відповідь Per Cederberg).

Отже, маємо поштовий сервер, здатний якісно виконувати певне коло задач.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.