Ваш 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 перед пересборкой.