Решение проблемы Sendmail с IPv6 при использовании SmartHost

Ваш Sendmail упорно пытается отправить почту через IPv6-адрес вашего же сервера, игнорируя IPv4 smarthost? Такая петля возникает из-за тонкостей DNS-резолвинга и legacy-настроек, которые когда-то казались безобидными. Расскажу, как это исправить, даже если вы уже перепробовали CLIENT_OPTIONS и ручное прописывание IP в /etc/hosts.

Почему Sendmail выбирает IPv6 вместо IPv4?

Сначала разберёмся, как Sendmail определяет адрес smarthost. По умолчанию, он следует политике DNS вашей системы. Если в записях домена есть и IPv4 (A), и IPv6 (AAAA), некоторые конфигурации могут отдавать приоритет IPv6 – особенно если в ядре ОС включена поддержка IPv6. Но проблема часто кроется глубже:

  • CNAME-перенаправления. Например, запись вида *.example.com CNAME www.example.com может заставить резолвер вернуть IPv6-адрес вашего веб-сервера вместо IPv4 smarthost – даже если у smarthost нет IPv6!
  • Настройки /etc/gai.conf. Этот файл управляет приоритетом IP-версий в Linux. Если в нём указано предпочтение IPv6, Sendmail будет следовать этому правилу.
  • Устаревшие DNS-записи. Кэшированные или неактуальные записи типа AAAA (даже если их нет в текущей зоне) могут влиять на результат.

Кстати, проверьте, что smarthost действительно не имеет IPv6:

host -t AAAA smarthost.example.com

Если вывод пуст, проблема явно в локальной конфигурации.

Пошаговое решение

1. Убедитесь, что CNAME не создаёт конфликт. Запустите:

dig smarthost.example.com CNAME

Если в ответе есть CNAME, ведущий на ваш домен (например, smarthost.example.com CNAME www.example.com), это и есть причина. Удалите или замените запись на прямой A-запись.

2. Проверьте приоритет IP в системе. В файле /etc/gai.conf раскомментируйте строку:

precedence ::ffff:0:0/96  100

Это даст IPv4 более высокий приоритет при наличии обеих версий.

3. Настройте Sendmail на принудительное использование IPv4. В sendmail.mc добавьте:

define(`CLIENT_OPTIONS', `Family=inet')

После этого пересоберите конфиг командой make -C /etc/mail и перезапустите службу.

4. Если проблема остаётся, проверьте /etc/hosts и /etc/resolv.conf. Иногда статичные записи или опции вроде options inet6 в resolv.conf переопределяют поведение.

Важно! После правки DNS-зон подождите, пока изменения распространятся (TTL). Используйте dig +trace, чтобы убедиться, что старые записи не кэшированы на вашем сервере.

А если CNAME нельзя удалить? Альтернативные варианты

Бывает, что CNAME критичен для работы сайта. В таком случае:

  • Создайте отдельную A-запись для smarthost (например, smtp.example.com A 192.0.2.1), а в Sendmail укажите этот хост.
  • Используйте FEATURE(`nocanonify’) в sendmail.mc, чтобы отключить автоматическое преобразование имён – но это может сломать другие части конфигурации.
  • Пропишите IP smarthost напрямую в Sendmail через DS (например, define(`SMART_HOST', `smtp:[192.0.2.1]')).

Одна из частых ошибок – пропуск квадратных скобок вокруг IP в smtp:[192.0.2.1]. Без них Sendmail попытается разрешить адрес как доменное имя, что снова приведёт к петле.

P.S. Если после всех правок Sendmail всё равно «не видит» изменения, попробуйте очистить кэш DNS демона (например, перезапустить systemd-resolved или nscd). И да, иногда стоит проверить, не забыли ли вы сохранить sendmail.mc перед пересборкой.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное