Yandex «Пошта для домену» як поштовий шлюз для ваших серверів

щоразу піднімаючи новий сервер в хмарах, ви отримуєте випадковий IP-адресу. Не всі розуміють, що IP-адреса може потрапити до вас з "історією". Часто доводиться витрачати час на видалення IP з публічних чорних списків. У моєму випадку в останній раз це була дуже некваплива листування з mail.ru, яка ні до чого не привела. Після цього, створивши новий сервер, я замислився: як же зробити так, щоб не огребать проблем з такими IP-адресами?
Введення
Незважаючи на те, що сервери у мене можуть бути як постійні так і "на погратися", пошту на всіх них я не обслуговую, але дуже хочу отримувати сервісні листи від своїх скриптів і системних служб.
Очевидне рішення — зробити свій "порядна" поштовий шлюз і всі інші сервери налаштовувати на пересилання пошти через цей шлюз. Мінуси такого рішення очевидні:
  • Окремий сервер коштує грошей, навіть якщо це дешева VPSка
  • IP-адреса треба постійно відслідковувати в чорних списках
  • Настройка поштового шлюзу вимагає часу, який залежить від ваших скілів
З-за перерахованих вище причин я пішов шукати інше рішення, і, що характерно, знайшов.
Рішення
Я виявив можливість схалявить, скориставшись сервісом "Пошта для Домену" від Yandex. На той момент у мене було піднято 3 сервера DNS були такі А-записи:
Хост Тип
example.com A 123.123.123.120
server1.example.com A 123.123.123.121
server2.example.com A 123.123.123.122
server3.example.com A 123.123.123.123
Я зареєстрував свій технічний домен "Пошті для Домену" і створив аккаунт:
root@example.com
. Спробував відправити листи з одного з своїх серверів, використовуючи SMTP-аккаунт і отримав наступну помилку:
553 5.7.1 Sender address rejected: not owned by auth user.
envelope from address root@server1.example.com not accepted by the server

Yandex не дозволяє підставляти які потрапило дані
envelope-from
. Але як же бути, якщо хочеться розуміти, з якого сервера настав той чи інший лист, без додаткових хитрувань?
Щоб дотримати правила Yandex'a, потрібно виконати наступні кроки на стороні їх сервісу:
  1. Зареєструвати основний домен і його піддомени в pdd.yandex.ru. Найпростіше пройти підтвердження домену через додавання CNAME-записи:
    Хост Тип
    example.com А verification code
    server1.example.com А verification code
    server2.example.com А verification code
    server3.example.com А verification code
  2. Так само для кожного домену створюємо MX-запис:
    Хост Тип Пріоритет
    example.com MX 10 mx.yandex.ru
    server1.example.com MX 10 mx.yandex.ru
    server2.example.com MX 10 mx.yandex.ru
    server3.example.com MX 10 mx.yandex.ru
  3. У налаштуваннях основного домену вказати піддомени як аліаси цього домену.

  4. Створюємо поштовий акаунт
    root@example.com
    , якщо він ще не створений

  5. Обов'язково потрібно зайти в аккаунт через веб-інтерфейс і активувати його, інакше отримаєте помилку:
    535 5.7.8 Error: authentication failed: Please accept EULA first. https://mail.yandex.ru/for/example.com

Далі потрібна робота на нашій стороні — налаштовуємо сервера:
  1. Встановлюємо
    msmtp
    — мініатюрний SMTP-клієнт, який надає свою реалізацію
    sendmail
  2. Налаштовуємо його:
    defaults
    
    syslog LOG_MAIL
    
    tls_certcheck off
    tls on
    
    auto_from on
    # server hostname
    maildomain server1.example.com
    
    default account
    
    host smtp.yandex.ru
    port 25
    
    auth on
    user root@example.com
    password 123qwe

  3. Відправляємо тестове лист з налагодженням:
    echo -e "test message" | /usr/bin/msmtp --debug -t -i sugdyzhekov@plesk.com

    і дивимося результат:
    loaded system configuration file /etc/msmtprc
    ignoring user configuration file /root/.msmtprc: No such file or directory
    falling back to default account
    using default account from /etc/msmtprc
    host = smtp.yandex.ru
    port = 25
    proxy host = (not set)
    proxy port = 0
    timeout = off
    protocol = smtp
    domain = localhost
    auth = choose
    user = root@example.com
    password = *
    ntlmdomain = (not set)
    tls = on
    tls_starttls = on
    tls_trust_file = (not set)
    tls_crl_file = (not set)
    tls_fingerprint = (not set)
    tls_key_file = (not set)
    tls_cert_file = (not set)
    tls_certcheck = off
    tls_min_dh_prime_bits = (not set)
    tls_priorities = (not set)
    auto_from = on
    maildomain = server1.example.com
    from = root@server1.example.com
    add_missing_from_header = on
    add_missing_date_header = on
    remove_bcc_headers = on
    dsn_notify = (not set)
    dsn_return = (not set)
    logfile = (not set)
    syslog = LOG_MAIL
    aliases = (not set)
    reading recipients from the command line and the mail
    <-- 220 smtp3h.mail.yandex.net ESMTP (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru)
    --> EHLO localhost
    <-- 250-smtp3h.mail.yandex.net
    <-- 250-8BITMIME
    <-- 250-PIPELINING
    <-- 250-SIZE 42991616
    <-- 250-STARTTLS
    <-- 250-AUTH LOGIN PLAIN XOAUTH2
    <-- 250-DSN
    <-- 250 ENHANCEDSTATUSCODES
    --> STARTTLS
    <-- 220 Go ahead
    TLS certificate information:
    Owner:
    Common Name: smtp.yandex.ru
    Organization: Yandex LLC
    Organizational unit: ITO
    Locality: Moscow
    State or Province: Russian Federation
    Country: RU
    Issuer:
    Common Name: Yandex CA
    Organization: Yandex LLC
    Organizational unit: Yandex Certification Authority
    Country: RU
    Validity:
    Activation time: Mon Oct 12 2015 03:41:24 PM MSK
    Expiration time: Wed 11 Oct 2017 03:41:24 PM MSK
    Fingerprints:
    SHA1: B7:0E:62:55:E1:3A:C0:F3:08:12:35:B2:9D:4B:25:D0:B8:C1:C6:39
    MD5: BC:15:CE:B6:D4:FF:0D:95:4F:E5:1A:A7:3A:DF:DA:65
    --> EHLO localhost
    <-- 250-smtp3h.mail.yandex.net
    <-- 250-8BITMIME
    <-- 250-PIPELINING
    <-- 250-SIZE 42991616
    <-- 250-AUTH LOGIN PLAIN XOAUTH2
    <-- 250-DSN
    <-- 250 ENHANCEDSTATUSCODES
    --> AUTH PLAIN AhJvb3ARY29uzMlntS5ydQBXYw5VcMMlazk=
    <-- 235 2.7.0 Authentication successful.
    --> MAIL FROM:<root@server1.example.com>
    --> RCPT TO:<sugdyzhekov@plesk.com>
    --> DATA
    <-- 250 2.1.0 <root@server1.example.com> ok
    <-- 250 2.1.5 <sugdyzhekov@plesk.com> recipient ok
    <-- 354 Enter mail, end with "." on a line by itself
    --> From: root@server1.example.com
    --> Date: Mon, 06 Jun 2016 16:17:00 +0300
    --> test message
    --> .
    <-- 250 2.0.0 Ok: queued on smtp3h.mail.yandex.net as 1465219021-86hlZkGCpZ-H0J8ORE2
    --> QUIT
    <-- 221 2.0.0 Closing connection.

    Відмінно, успіх! Лист пішло, правда, ми знайдемо його в спамі, так як воно чомусь-то пусте. Давайте перевіримо більш звичним і "людським" способом:
    echo "test message" | mailx -s 'subject test' sugdyzhekov@plesk.com

    Ось, тепер в ящику нормальне лист. Здорово!

    DKIM & SPF
    А ще можна для кожного домену прописати запису DKIM і SPF. Якщо ви, як я, використовуєте свій DNS-хостинг, то просто скопіюйте відповідні значення «DNS редактора» в інтерфейсі Яндекса. Увага: для кожного домену і псевдонімів свій ключ!
    Хост Тип
    mail._domainkey.example.com TXT v=DKIM1; k=rsa; t=s; p=MIGf...
    mail._domainkey.server1.example.com TXT v=DKIM1; k=rsa; t=s; p=MIGf...
    mail._domainkey.server2.example.com TXT v=DKIM1; k=rsa; t=s; p=MIGf...
    mail._domainkey.server3.example.com TXT v=DKIM1; k=rsa; t=s; p=MIGf...
    Відсилаємо з сервера лист і дивимося в заголовки:
    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=mail; t=1467009762;
    bh=Pb6s/Xlf4...
    Authentication-Results: smtp14.mail.yandex.net; dkim=pass header.i=@example.com

    Лепота!
    У разі якщо відправка пошти для домену буде відбуватися тільки через сервера Яндекс і з заздалегідь відомих IP-адрес, то можна сміливо прописати SPF-запису, згідно з документацією, https://yandex.ru/support/pdd/troubleshooting/dns.xml#step2
    Хост Тип
    example.com TXT v=spf1 redirect=_spf.yandex.net
    server1.example.com TXT v=spf1 redirect=_spf.yandex.net
    server2.example.com TXT v=spf1 redirect=_spf.yandex.net
    server3.example.com TXT v=spf1 redirect=_spf.yandex.net
    Нюанси
    Швидше за все, ви молодці, і ваш додаток працює не з під root'а. Спроба послати лист з-під звичайного користувача знову призведе до знайомої помилку в балці msmtp:
    Jun 6 14:21:24 server1 msmtp: host=smtp.yandex.ru tls=on auth=on user=root@example.com from=app@server1.example.com recipients=sugdyzhekov@plesk.com smtpstatus=553 smtpmsg='553 5.7.1 Sender address rejected: not owned by auth user.' errormsg='envelope from address user@server1.example.com not accepted by the server' exitcode=EX_DATAERR

    Можна вирішити цю проблему по-різному. Наприклад, можна явно вказувати користувача, відключивши опцію
    auto_from off
    на
    msmtp
    . Але я вже вирішив, що мене це не влаштовує.
    Правильне рішення — додати користувача як аліас для нашого основного адреси:

    Локальний релей
    Якщо вам потрібно локальний SMTP-релей, то дана конфігурація вам теж підходить. Потрібно просто замінити msmtp на postfix або exim, налаштовані на використання серверів Яндекса як smart host'a (гуглити можна, наприклад, за ключовими словами exim smarthost).
    Резюме
    Тепер будь-сервер, який я піднімаю для своїх завдань, відразу ж отримує налаштований канал відправки пошти. В DNS і pdd.yandex.ru я заздалегідь прописав кілька піддоменів про запас. Так як сервера я розгортаю через SaltStack, то конфігурацію msmtp мої сервера отримують автоматично.
    Що я отримав в результаті:
    1. найголовніше — немає заморочок з чорними списками і IP-адрес серверів, так як листи йдуть через сервера Яндекса
    2. DKIM/SPF "з коробки" — листи не потрапляють у спам
    3. msmtp простий SMTP-клієнт, якому навіть в пам'яті сервера висіти не потрібно — запускається за необхідності
    4. msmtp — проста настройка на відміну від "дорослих" postfix, exim
    5. можна не турбуватися про PTR-записах для ваших IP-адрес з точки зору поштової системи.
    Сподіваюся ця інструкція кому-небудь знадобиться. Буду радий дізнатися з коментарів, хто і як вирішує цю проблему.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.