Postfix и Dovecot отказываются получать IP-адреса при запуске (но позже получают)

Вопрос или проблема

Эта проблема на первый взгляд кажется тривиальной, но на самом деле это не так, и, вероятно, это не совсем специфично для Postfix/Dovecot. Было бы здорово, если кто-то мог бы дать мне подсказку…

Настройка следующая: у меня есть DNS-сервер (BIND) и комбинация Postfix/Dovecot, работающая на одной машине. У него есть 1 IPv4 адрес (их не хватает…) и несколько IPv6 адресов. Сначала все серверы работали на всех интерфейсах, т.е. слушали на 0.0.0.0 и [::], но потом я решил дать им отдельные IPv6 (“потому что мы можем…”). В IPv4 они остались на одном и том же IP.

Во время начальной настройки и тестирования все работало нормально. В конце я решил перезагрузить машину, чтобы убедиться, что нет устаревшей/временной конфигурации, и все работает так, как ожидалось, после чистой загрузки.

И затем произошло следующее (лог сокращен до актуальных частей):

...
30 Ноя 22:49:52 systemd[1]: Завершена работа networking.service - Поднятие сетевых интерфейсов.
30 Ноя 22:49:52 systemd[1]: Достигнута цель network.target - Сеть.
30 Ноя 22:49:52 systemd[1]: Достигнута цель network-online.target - Сеть в сети.
30 Ноя 22:49:52 systemd[1]: Запуск dovecot.service - почтового сервера Dovecot IMAP/POP3...
30 Ноя 22:49:52 systemd[1]: Запуск named.service - DNS-сервера BIND...
30 Ноя 22:49:52 systemd[1]: Запуск ssh.service - сервера OpenBSD Secure Shell...
30 Ноя 22:49:52 named[984]: Запуск BIND 9.20.2-1-Debian (Стабильный релиз) <id:>
30 Ноя 22:49:52 named[984]: работает на Linux x86_64 6.11.5-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.11.5-1 (2024-10-27)
...
30 Ноя 22:49:52 named[984]: слушает на IPv4 интерфейсе lo, 127.0.0.6#53
30 Ноя 22:49:52 named[984]: слушает на IPv4 интерфейсе enp5s0, 88.198.70.58#53
30 Ноя 22:49:52 named[984]: слушает на IPv6 интерфейсе enp5s0, 2a01:4f8:140:501a::b00d#53
...
30 Ноя 22:49:52 dovecot[983]: Ошибка: bind(2a01:4f8:140:501a::d19c, 587) не удалась: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:52 dovecot[983]: Ошибка: service(submission-login): listen(2a01:4f8:140:501a::d19c, 587) не удалась: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:52 dovecot[983]: Ошибка: bind(2a01:4f8:140:501a::d19c, 143) не удалась: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:52 dovecot[983]: Ошибка: service(imap-login): listen(2a01:4f8:140:501a::d19c, 143) не удалась: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:52 dovecot[983]: Ошибка: bind(2a01:4f8:140:501a::d19c, 993) не удалась: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:52 dovecot[983]: Ошибка: service(imap-login): listen(2a01:4f8:140:501a::d19c, 993) не удалась: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:52 dovecot[983]: Фатально: Не удалось запустить слушателей
30 Ноя 22:49:52 systemd[1]: dovecot.service: Основной процесс завершился, код=завершен, статус=89/n/a
30 Ноя 22:49:52 systemd[1]: dovecot.service: Завершено с результатом 'exit-code'.
30 Ноя 22:49:52 systemd[1]: Не удалось запустить dovecot.service - почтовый сервер Dovecot IMAP/POP3.
...
30 Ноя 22:49:52 systemd[1]: Запущен named.service - DNS-сервер BIND.
30 Ноя 22:49:52 systemd[1]: Достигнута цель nss-lookup.target - Поиск имен хостов и сетей.
30 Ноя 22:49:52 systemd[1]: Запуск [email protected] - Почтовый транспорный агент Postfix (инстанс -)...
30 Ноя 22:49:52 postmulti[1141]: postfix/postlog: запускаем почтовую систему Postfix
30 Ноя 22:49:52 postfix/master[1143]: фатально: bind 2a01:4f8:140:501a::d19c порт 25: Невозможно присвоить запрашиваемый адрес
30 Ноя 22:49:54 postmulti[1145]: postfix/postlog: фатально: запуск почтовой системы не удался
30 Ноя 22:49:55 systemd[1]: [email protected]: Контрольный процесс завершился, код=завершен, статус=1/НЕУСПЕХ
30 Ноя 22:49:55 systemd[1]: [email protected]: Не удалось с результатом 'exit-code'.
30 Ноя 22:49:55 systemd[1]: Не удалось запустить [email protected] - Почтовый транспорный агент Postfix (инстанс -).

Обратите внимание, что BIND успешно запускается на всех интерфейсах. Dovecot запускается параллельно и выдает ошибку при попытке слушать на отдельном IPv6. (В журнале ничего не говорится о IPv4 и localhost, поэтому это либо работает, либо ошибка IPv6 возникает первой.) Postfix сталкивается с той же ошибкой, пытаясь слушать на том же IPv6.

Теперь дело в том, что когда я запускаю эти службы вручную после загрузки через systemctl start, они обе запускаются без проблем. И они действительно работают на всех интерфейсах.

Поэтому моя первоначальная мысль заключалась в том, что во время процесса загрузки существует какая-то гонка, и не все интерфейсы IPv6 на самом деле поднимаются, прежде чем стартуют Dovecot/Postfix. Что не должно быть возможным, так как все они зависят от network-online.target, который, по данным systemd, полностью завершён до того, как BIND начнет загружаться.

Так что я переключил Dovecot на работу на том же IPv6 (:b00d), что и BIND, так как он успешно загружается на этом IP. Postfix все еще на оригинальном IP (:d19c). В то же время я также создал фиктивную “службу”, которая просто выводит конфигурацию сети во время загрузки, чтобы я мог видеть, что Dovecot и Postfix видят во время загрузки. Я заставил эту службу запуститься дважды – один раз до BIND/Postfix/Dovecot и один раз после.

Конечный результат:
a) Dovecot все еще выдает ошибку, даже используя тот же IP, что и BIND.
b) согласно ifconfig все IPv6 на самом деле сконфигурированы и работают до запуска служб (как и должно быть)

01 Дек 00:13:45 systemd[1]: Запущен named.service - DNS-сервер BIND.
01 Дек 00:13:45 systemd[1]: Достигнута цель nss-lookup.target - Поиск имен хостов и сетей.
01 Дек 00:13:45 systemd[1]: Запуск dovecot.service - почтового сервера Dovecot IMAP/POP3...
01 Дек 00:13:45 systemd[1]: Запуск test-networking.service - ###################### Тест сетевой конфигурации ###########################...
01 Дек 00:13:45 ifconfig[993]: enp5s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
01 Дек 00:13:45 ifconfig[993]:         inet 88.198.70.58  netmask 255.255.255.224  broadcast 88.198.70.63
01 Дек 00:13:45 ifconfig[993]:         inet6 2a01:4f8:140:501a::b00d  prefixlen 64  scopeid 0x0<global>
01 Дек 00:13:45 ifconfig[993]:         inet6 2a01:4f8:140:501a::d19c  prefixlen 64  scopeid 0x0<global>
01 Дек 00:13:45 ifconfig[993]:         inet6 2a01:4f8:140:501a::2  prefixlen 64  scopeid 0x0<global>
01 Дек 00:13:45 ifconfig[993]:         ether a8:a1:59:08:49:5d  txqueuelen 1000  (Ethernet)
01 Дек 00:13:45 ifconfig[993]:         RX пакеты 0  байты 0 (0.0 B)
01 Дек 00:13:45 ifconfig[993]:         RX ошибки 0  потеряно 0  переполнений 0  фрейма 0
01 Дек 00:13:45 ifconfig[993]:         TX пакеты 0  байты 0 (0.0 B)
01 Дек 00:13:45 ifconfig[993]:         TX ошибки 0  потеряно 3 переполнений 0  носителя 0  коллизий 0
01 Дек 00:13:45 systemd[1]: test-networking.service: успешно деактивирована.
01 Дек 00:13:45 systemd[1]: Завершена работа test-networking.service - ###################### Тест сетевой конфигурации ###########################.
01 Дек 00:13:45 dovecot[992]: Ошибка: bind(2a01:4f8:140:501a::b00d, 587) не удалась: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:45 dovecot[992]: Ошибка: service(submission-login): listen(2a01:4f8:140:501a::b00d, 587) не удалась: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:45 dovecot[992]: Ошибка: bind(2a01:4f8:140:501a::b00d, 143) не удалась: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:45 dovecot[992]: Ошибка: service(imap-login): listen(2a01:4f8:140:501a::b00d, 143) не удалась: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:45 dovecot[992]: Ошибка: bind(2a01:4f8:140:501a::b00d, 993) не удалась: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:45 dovecot[992]: Ошибка: service(imap-login): listen(2a01:4f8:140:501a::b00d, 993) не удалась: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:45 dovecot[992]: Фатально: Не удалось запустить слушателей
01 Дек 00:13:45 systemd[1]: dovecot.service: Основной процесс завершился, код=завершен, статус=89/n/a
01 Дек 00:13:45 systemd[1]: dovecot.service: Не удалось с результатом 'exit-code'.
01 Дек 00:13:45 systemd[1]: Не удалось запустить dovecot.service - почтовый сервер Dovecot IMAP/POP3.
01 Дек 00:13:45 systemd[1]: Достигнута цель multi-user.target - Мультопользовательская система.
01 Дек 00:13:45 systemd[1]: Достигнута цель graphical.target - Графический интерфейс.
01 Дек 00:13:45 systemd[1]: Запуск [email protected] - Почтовый транспорный агент Postfix (инстанс -)...
01 Дек 00:13:45 systemd[1]: Запуск test-networking2.service - ********************** Вторая тестовая сетевая конфигурация ****************************...
01 Дек 00:13:45 ifconfig[999]: enp5s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
01 Дек 00:13:45 ifconfig[999]:         inet 88.198.70.58  netmask 255.255.255.224  broadcast 88.198.70.63
01 Дек 00:13:45 ifconfig[999]:         inet6 2a01:4f8:140:501a::b00d  prefixlen 64  scopeid 0x0<global>
01 Дек 00:13:45 ifconfig[999]:         inet6 2a01:4f8:140:501a::d19c  prefixlen 64  scopeid 0x0<global>
01 Дек 00:13:45 ifconfig[999]:         inet6 2a01:4f8:140:501a::2  prefixlen 64  scopeid 0x0<global>
01 Дек 00:13:45 ifconfig[999]:         ether a8:a1:59:08:49:5d  txqueuelen 1000  (Ethernet)
01 Дек 00:13:45 ifconfig[999]:         RX пакеты 0  байты 0 (0.0 B)
01 Дек 00:13:45 ifconfig[999]:         RX ошибки 0  потеряно 0  переполнений 0  фрейма 0
01 Дек 00:13:45 ifconfig[999]:         TX пакеты 0  байты 0 (0.0 B)
01 Дек 00:13:45 ifconfig[999]:         TX ошибки 0  потеряно 3 переполнений 0  носителя 0  коллизий 0
01 Дек 00:13:45 systemd[1]: test-networking2.service: успешно деактивирована.
01 Дек 00:13:45 systemd[1]: Завершена работа test-networking2.service - ********************** Вторая тестовая сетевая конфигурация ****************************.
01 Дек 00:13:45 postmulti[1144]: postfix/postlog: запускаем почтовую систему Postfix
01 Дек 00:13:45 postfix/master[1146]: фатально: bind 2a01:4f8:140:501a::d19c порт 25: Невозможно присвоить запрашиваемый адрес
01 Дек 00:13:48 systemd[1]: [email protected]: Контрольный процесс завершился, код=завершен, статус=1/НЕУСПЕХ
01 Дек 00:13:48 systemd[1]: [email protected]: Не удалось с результатом 'exit-code'.
01 Дек 00:13:48 systemd[1]: Не удалось запустить [email protected] - Почтовый транспорный агент Postfix (инстанс -).
01 Дек 00:13:48 systemd[1]: Завершение загрузки заняло 3.395с (ядро) + 6.295с (пользовательское пространство) = 9.691с.

Снова, после загрузки я могу запустить обе службы вручную – без ошибок.

Кто-нибудь знает, что происходит?
Я нашел несколько похожих отчетов в интернете, но они все имеют причины, которые можно исключить в моем случае.

Спасибо за любую обратную связь!

Ответ или решение

Проблема с тем, что Postfix и Dovecot отказываются захватывать IP-адреса при запуске, но затем работают корректно при ручном запуске, достаточно распространена и, как вы уже заметили, может быть связана с конкурсами на старте. Давайте разберем возможные причины и решения этой проблемы более детально.

Суммирование проблемы:

На сервере установлены Postfix и Dovecot, которые должны использовать несколько IPv6-адресов при старте, однако во время загрузки происходит ошибка привязки (Cannot assign requested address). Все выглядит так, как будто службы пытаются привязаться к IP-адресам до того, как интерфейсы с этими адресами будут полностью готовы.

Возможные причины проблемы:

  1. Состояние сетевых интерфейсов:
    Хотя вы указали, что все интерфейсы активны, важно проверить, насколько они на самом деле готовы к выполнению сетевых операций в момент, когда начинают запускаться Postfix и Dovecot. Возможно, что из-за особенностей конфигурации сетевого менеджера или самого BIND некоторые интерфейсы могут быть в состоянии "UP", но не готовы к назначению IP.

  2. Состояние network-online.target:
    Даже если система достигает network-online.target, это не гарантирует, что все сетевые адреса настроены и готовы к использованию. Может наблюдаться временная задержка, когда network target активен, но некоторые сервисы еще не инициализированы, особенно если есть зависимости от других сетевых служб.

  3. Параллельный запуск:
    Системаd может начать запускать службы параллельно, что может вызвать состояние гонки, когда Dovecot и Postfix пытаются захватить адреса, пока BIND не завершил своей работу. Вы можете попробовать добавить зависимости для Dovecot и Postfix в его конфигурацию .service, чтобы убедиться, что они начинают работу только после завершения всех сетевых настроек.

Рекомендации по решению проблемы:

  1. Изменение конфигурации служб:
    Попробуйте добавить в конфигурационные файлы Postfix и Dovecot следующие директивы, которые укажут на необходимость ожидания завершения BIND:

    [Unit]
    After=network-online.target
    Wants=network-online.target

    Добавьте это в [Unit] секции файлов ваших системных служб.

  2. Использование ExecStartPre:
    Можете добавить временные задержки, чтобы сервисы запускались с небольшой задержкой, чтобы IP-адреса были полностью готовы:

    ExecStartPre=/bin/sleep 10
  3. Логирование и диагностика:
    Убедитесь, что ведете журнал запуска сетевых интерефейсов и служб. Это поможет вам диагностировать, действительно ли интерфейсы готовы в момент попытки привязки.

  4. Динамическое и статическое назначение IP:
    Если после всех изменений проблема сохраняется, стоит рассмотреть возможность статической конфигурации IP-адресов для Dovecot и Postfix так, чтобы они могли быть явно задействованы в фазе инициализации.

Заключение:

Эта ситуация требует комплексного подхода к диагностике и устранению проблемы, начиная с анализа зависимостей и заканчивая возможными временными решениями на основе состояния сети и служб. Понимание взаимосвязей между сетевыми интерфейсами и службами критично для успешного развертывания серверных решений. Разработав стратегию устранения проблем и потратив время на оптимизацию загрузки, вы сможете значительно повысить стабильность работы вашего почтового сервера.

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

Капча загружается...