Вопрос или проблема
В течение последнего месяца я заметил ошибки в входящих электронных письмах на своем VPS, особенно с письмами, содержащими большие вложения (более 10 МБ).
Эта проблема, похоже, затрагивает нескольких пользователей почты, в результате чего письма застревают в почтовой очереди на длительное время. Я подозреваю, что проблема может быть связана с установленными правилами sieve.
# правило:[Sonstiges]
if header :contains "subject" ["hacker","hacking","Virus"]
{
fileinto "Junk";
}
Удаление этого правила и последующая перезагрузка doveadm позволило успешно доставить застрявшие письма. Папка “Junk” существует. Письма, которые застряли, не содержат ни одну из этих строк.
Файл mail.err содержит множество записей, подобных этой:
Oct 8 11:04:16 km30738-03 dovecot: lmtp([email protected])<1578877><mDQkD471BGd9FxgAPVEKtg>: Panic: Buffer write out of range (0 + 1)
Oct 8 11:04:16 km30738-03 dovecot: lmtp([email protected])<1578877><mDQkD471BGd9FxgAPVEKtg>: Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(backtrace_append+0x46) [0x7fa21a8fa0b6] -> /usr/lib/dovecot/libdovecot.so.0(backtrace_get+0x22) [0x7fa21a8fa1d2] -> /usr/lib/dovecot/libdovecot.so.0(+0x109fab) [0x7fa21a906fab] -> /usr/lib/dovecot/libdovecot.so.0(+0x10a047) [0x7fa21a907047] -> /usr/lib/dovecot/libdovecot.so.0(+0x5cfd3) [0x7fa21a859fd3] -> /usr/lib/dovecot/libdovecot.so.0(+0x5bec5) [0x7fa21a858ec5] -> /usr/lib/dovecot/libdovecot.so.0(buffer_write+0x22) [0x7fa21a8fc502] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_emit_integer+0x69) [0x7fa219e736c9] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_save+0x1fa) [0x7fa219e71d2a] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_file_update_resource_usage+0x115) [0x7fa219e733b5] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_close+0x7d) [0x7fa219e702bd] -> /usr/lib/dovecot/modules/lib90_sieve_plugin.so(+0x42b3) [0x7fa219f062b3] -> /usr/lib/dovecot/libdovecot-lda.so.0(mail_deliver+0x16e) [0x7fa21ab4b0fe] -> dovecot/lmtp(lmtp_local_default_deliver+0x1e8) [0x55a2aef1b408] -> dovecot/lmtp(lmtp_local_data+0x59a) [0x55a2aef1bb4a] -> dovecot/lmtp(client_default_cmd_data+0x191) [0x55a2aef1a4c1] -> dovecot/lmtp(cmd_data_continue+0x180) [0x55a2aef1a250] -> /usr/lib/dovecot/libdovecot.so.0(+0x7c6d6) [0x7fa21a8796d6] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x6d) [0x7fa21a91d25d] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x13a) [0x7fa21a91e95a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x54) [0x7fa21a91d304] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x40) [0x7fa21a91d4c0] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x17) [0x7fa21a88f727] -> dovecot/lmtp(main+0x225) [0x55a2aef18ec5] -> /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7fa21a5f6d90] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7fa21a5f6e40] -> dovecot/lmtp(_start+0x25) [0x55a2aef18fc5]
Oct 8 11:04:16 km30738-03 dovecot: lmtp([email protected])<1578877><mDQkD471BGd9FxgAPVEKtg>: Fatal: master: service(lmtp): child 1578877 killed with signal 6 (core dumped)
Oct 8 11:24:16 km30738-03 dovecot: lmtp([email protected])<1581353><ABWVEz76BGcpIRgAPVEKtg>: Panic: Buffer write out of range (0 + 1)
Oct 8 11:24:16 km30738-03 dovecot: lmtp([email protected])<1581353><ABWVEz76BGcpIRgAPVEKtg>: Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(backtrace_append+0x46) [0x7ff19a6ca0b6] -> /usr/lib/dovecot/libdovecot.so.0(backtrace_get+0x22) [0x7ff19a6ca1d2] -> /usr/lib/dovecot/libdovecot.so.0(+0x109fab) [0x7ff19a6d6fab] -> /usr/lib/dovecot/libdovecot.so.0(+0x10a047) [0x7ff19a6d7047] -> /usr/lib/dovecot/libdovecot.so.0(+0x5cfd3) [0x7ff19a629fd3] -> /usr/lib/dovecot/libdovecot.so.0(+0x5bec5) [0x7ff19a628ec5] -> /usr/lib/dovecot/libdovecot.so.0(buffer_write+0x22) [0x7ff19a6cc502] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_emit_integer+0x69) [0x7ff199c436c9] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_save+0x1fa) [0x7ff199c41d2a] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_file_update_resource_usage+0x115) [0x7ff199c433b5] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_close+0x7d) [0x7ff199c402bd] -> /usr/lib/dovecot/modules/lib90_sieve_plugin.so(+0x42b3) [0x7ff199cd62b3] -> /usr/lib/dovecot/libdovecot-lda.so.0(mail_deliver+0x16e) [0x7ff19a91b0fe] -> dovecot/lmtp(lmtp_local_default_deliver+0x1e8) [0x56553f845408] -> dovecot/lmtp(lmtp_local_data+0x59a) [0x56553f845b4a] -> dovecot/lmtp(client_default_cmd_data+0x191) [0x56553f8444c1] -> dovecot/lmtp(cmd_data_continue+0x180) [0x56553f844250] -> /usr/lib/dovecot/libdovecot.so.0(+0x7c6d6) [0x7ff19a6496d6] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x6d) [0x7ff19a6ed25d] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x13a) [0x7ff19a6ee95a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x54) [0x7ff19a6ed304] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x40) [0x7ff19a6ed4c0] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x17) [0x7ff19a65f727] -> dovecot/lmtp(main+0x225) [0x56553f842ec5] -> /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7ff19a3c6d90] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7ff19a3c6e40] -> dovecot/lmtp(_start+0x25) [0x56553f842fc5]
Oct 8 11:24:16 km30738-03 dovecot: lmtp([email protected])<1581353><ABWVEz76BGcpIRgAPVEKtg>: Fatal: master: service(lmtp): child 1581353 killed with signal 6 (core dumped)
Oct 8 11:29:36 km30738-03 dovecot: lmtp([email protected])<1581993><JOt4M377BGepIxgAPVEKtg>: Panic: Buffer write out of range (0 + 1)
Oct 8 11:29:36 km30738-03 dovecot: lmtp([email protected])<1581993><JOt4M377BGepIxgAPVEKtg>: Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(backtrace_append+0x46) [0x7f2655d310b6] -> /usr/lib/dovecot/libdovecot.so.0(backtrace_get+0x22) [0x7f2655d311d2] -> /usr/lib/dovecot/libdovecot.so.0(+0x109fab) [0x7f2655d3dfab] -> /usr/lib/dovecot/libdovecot.so.0(+0x10a047) [0x7f2655d3e047] -> /usr/lib/dovecot/libdovecot.so.0(+0x5cfd3) [0x7f2655c90fd3] -> /usr/lib/dovecot/libdovecot.so.0(+0x5bec5) [0x7f2655c8fec5] -> /usr/lib/dovecot/libdovecot.so.0(buffer_write+0x22) [0x7f2655d33502] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_emit_integer+0x69) [0x7f26552aa6c9] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_save+0x1fa) [0x7f26552a8d2a] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_file_update_resource_usage+0x115) [0x7f26552aa3b5] -> /usr/lib/dovecot/libdovecot-sieve.so.0(sieve_binary_close+0x7d) [0x7f26552a72bd] -> /usr/lib/dovecot/modules/lib90_sieve_plugin.so(+0x42b3) [0x7f265533d2b3] -> /usr/lib/dovecot/libdovecot-lda.so.0(mail_deliver+0x16e) [0x7f2655f820fe] -> dovecot/lmtp(lmtp_local_default_deliver+0x1e8) [0x561e7388b408] -> dovecot/lmtp(lmtp_local_data+0x59a) [0x561e7388bb4a] -> dovecot/lmtp(client_default_cmd_data+0x191) [0x561e7388a4c1] -> dovecot/lmtp(cmd_data_continue+0x180) [0x561e7388a250] -> /usr/lib/dovecot/libdovecot.so.0(+0x7c6d6) [0x7f2655cb06d6] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x6d) [0x7f2655d5425d] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x13a) [0x7f2655d5595a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x54) [0x7f2655d54304] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x40) [0x7f2655d544c0] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x17) [0x7f2655cc6727] -> dovecot/lmtp(main+0x225) [0x561e73888ec5] -> /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f2655a2dd90] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f2655a2de40] -> dovecot/lmtp(_start+0x25) [0x561e73888fc5]
Oct 8 11:29:36 km30738-03 dovecot: lmtp([email protected])<1581993><JOt4M377BGepIxgAPVEKtg>: Fatal: master: service(lmtp): child 1581993 killed with signal 6 (core dumped)
Это все, что мне известно. Но “Panic: Buffer write out of range” звучит плохо.
Кроме того, пользователи, испытывающие проблемы с доставкой электронной почты, похоже, имеют необычные файлы, хранящиеся в папке sieve.
/var/mail/vhosts/example.com/user/sieve/active.svbin
/var/mail/vhosts/example.com/user/sieve/active.svbin.server.example.com.145195.e85d1a9cf9d99deb
/var/mail/vhosts/example.com/user/sieve/active.svbin.server.example.com.145802.95e76b65ac2b54cf
(…)
/var/mail/vhosts/example.com/user/sieve/active.svbin.server.example.com.148819.a656ae666826efeb
Я использую dovecot версии 2.3.16 (7e2e900c1a) на Ubuntu 22.04. Несмотря на то, что провайдер утверждает, что нет проблем с конфигурацией с их стороны, меня просят исследовать проблемы с доставкой электронной почты.
Ответ или решение
Проблема с Dovecot LMTP, возникающая при обработке больших писем, действительно может быть связана с ошибками в правилах Sieve или в самой конфигурации Dovecot. Судя по предоставленным логам, ошибка "Panic: Buffer write out of range" указывает на потенциальные проблемы с обработкой данных в памяти, которые могут возникать при работе с большими вложениями.
Шаги для диагностики и решения проблемы:
-
Проверка версий:
Убедитесь, что версия Dovecot и плагинов (в том числе Sieve) обновлены до последних стабильных релизов. Ваша версия Dovecot (2.3.16) может быть устаревшей и может содержать известные ошибки, которые были исправлены в более поздних версиях.Обновить Dovecot можно с помощью команды:
sudo apt update sudo apt upgrade dovecot
-
Анализ изменений в конфигурации Sieve:
Поскольку удаление правила фильтрации Sieve позволило восстановить нормальную доставку, стоит исследовать, как именно работает Sieve с большими письмами. Пожалуйста, проверьте, не связаны ли другие правила с обработкой больших вложений. Возможно, стоит временно отключить все правила Sieve, чтобы определить, в чем именно проблема. -
Очистка и переустановка Sieve:
Если в папке Sieve имеются подозрительные файлы, можно попробовать их удалить или переместить в резервную копию и перезагрузить правила Sieve. Изучите файлы, которые могут оставаться после сбоев, и попытайтесь восстановить правило, чтобы оно подходило для обработки больших писем. -
Настройки лимитов:
Проверьте настройки лимитов на размер почты и вложений в конфигурации Dovecot. Возможно, что текущие лимиты настроены слишком низко и могут сбрасывать соединение при попытке обработки больших записей.
Для этого проверьте параметры:mail_max_size = 50M
Если таковые отсутствуют, добавьте или измените существующее правило.
-
Логирование:
Увеличьте уровень логирования Dovecot, чтобы получить больше информации о том, что именно происходит во время сбоя. Для этого добавьте в конфигурацию Dovecot:debug_log_level = debug
-
Тестирование:
После внесенных изменений проверьте отправку больших сообщений. Запросите пользователей протестировать доставку писем с разными размерами вложений, чтобы проследить, сохраняется ли проблема. -
Поиск в документации и форуме:
Изучите официальную документацию Dovecot и рекомендаций относительно Sieve. Также возможно стоит заглянуть на форумы и сообщества разработчиков, так как подобные проблемы могут обсуждаться другими пользователями.
Если описанные методы не помогают устранить проблему, может потребоваться более глубокий анализ или использование специализированных инструментов для диагностики. В крайних случаях, рассмотрите возможность обращения к службам поддержки Dovecot или профессиональным администратором для комплексного обследования проблемы.