Решён
Как мы получаем IP почтового сервера из MX записи?

Изучаю как работает доставка почты. Понял что MX-запись указывает на hostname почтового сервера, а не напрямую на IP. Но чтобы установить TCP-соединение с сервером, нужен IP.

Схематично: отправляющий MTA делает DNS-запрос MX для домена получателя, получает приоритет + hostname. А дальше что? Делается второй запрос типа A/AAAA для этого hostname? Или есть какой то другой механизм?

И еще: MX-запись может указывать на CNAME? Читал что это плохая практика, но технически работает?

Решение
54
Эксперт • 4 ответа

Да, именно так. Два отдельных DNS-запроса:

  1. MX-запрос для домена получателя -> получаем список priority hostname, например 10 mail.example.com.
  2. A/AAAA-запрос для полученного hostname -> получаем IP.

Резольвер MTA делает это последовательно, автоматически. Некоторые DNS-серверы возвращают IP адрес прямо в additional section ответа на MX-запрос (so-called "glue records"), чтобы сэкономить один round trip, но это оптимизация, а не обязательное поведение.

Про CNAME в MX: RFC 2181 и RFC 5321 прямо запрещают это. MX-запись обязана указывать на A/AAAA-запись напрямую, без промежуточных CNAME. Де-факто многие серверы это переварят, но поведение непредсказуемо и некоторые строгие MTA откажутся принимать почту. Не делай так в проде.

Аватар Роман Почтовый

Спасибо, именно то что искал. Про additional section не знал - интересная деталь.

31
Эксперт • 2 ответа

Можешь сам посмотреть как это работает:

dig MX gmail.com
dig A gmail-smtp-in.l.google.com

Первая команда покажет MX-записи, вторая разрешит первый из полученных хостнеймов в IP. Именно эти два шага и делает любой MTA автоматически.

17
Эксперт • 1 ответ

Про CNAME в MX добавлю: запрет прописан в RFC 2181 секция 10.3. Там прямо сказано что MX, NS и SOA записи не должны указывать на псевдоним (CNAME). Причина техническая - рекурсивный поиск по цепочке CNAME в момент разрешения MX создает дополнительные точки отказа и усложняет кешировани.

9
Эксперт • 1 ответ

Если хочешь понять это не абстрактно а вживую - запусти Wireshark или tcpdump во время отправки письма через локальный Postfix и посмотри DNS-трафик. Увидишь оба запроса своими глазами. Самое лучшее обучение.

7
Участник • 1 ответ

Кстати, у MX-записей есть приоритет (preference value). Если их несколько - MTA сначала пробует тот у которого число меньше. Если не отвечает - переходит к следующему. Это механизм отказоустойчивости.

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.