После обновления Mailcow до версии 2025-05 я столкнулся с ситуацией, когда один из контейнеров начал потреблять неприлично много CPU, создав повышенную нагрузку на сервер. Конечно, причины у такого поведения могут быть разные, но в моем случае проблема была в цикличном перезапуске контейнера netfilter-mailcow
. В этой заметке немного о симптомах этой проблемы и как ее исправить.
Симптомы
Основной симптом – это большая загрузка CPU одним из контейнеров. Проверить можно командой:
sudo docker stats
Контейнер mailcowdockerized-netfilter-mailcow-1 может показывать 90–100% CPU.
Внутри контейнера работает процесс (он же виден через top
или htop
):
python -u /app/main.py nfta
В логах контейнера повторяются строки:
MAILCOW target is in position [какое-то число] in the ip forward table, restarting container to fix it...
Высокие значения %iowait
и %steal
в mpstat
/top
.

Заметил я все это безобразие не сразу, а только через четыре дня, когда сработало предупреждение о высокой (более 90%) загрузке CPU, т.к. непосредственно после обновления ничего не выходило за рамки обычного. На графике хорошо виден рост с 20% до 90% и момент когда проблема была устранена.
Причина
Контейнер netfilter-mailcow автоматически создаёт собственную цепочку MAILCOW в iptables/nftables. При этом он проверяет, находится ли эта цепочка в нужной позиции в таблице FORWARD. Если позиция не совпадает с ожидаемой — контейнер перезапускается, считая конфигурацию некорректной.
Из-за особенностей iptables-nft и сетевых цепочек Docker, MAILCOW может оказываться вне ожидаемой и контейнер зацикливается, пытаясь «починить» ситуацию.
Решение
В Интернете можно найти обсуждение высокой загрузки CPU контейнером netfilter-mailcow на официальном форуме от 2020 года, суть которого сводится к тому что, проблема исправлена и нужно просто обновить MAILCOW до последней версии. Видимо, проблема не до конца исправлена и все еще может возникать при каких-то условиях.
Мне помогло это решение, найденное в обсуждении проблем MAILCOW на github, которое заключается в последовательной очистке всех правил ip6tables и iptables. Ниже его небольшая адаптация:
sudo docker compose down
sudo systemctl stop docker.socket
sudo systemctl stop docker.service
sudo systemctl stop docker
sudo ip6tables -X
sudo ip6tables -F
sudo ip6tables -X
sudo iptables -F
sudo iptables -X
sudo systemctl start docker
sudo ip6tables -L --line-numbers # just to make sure that the tables are clear
sudo iptables -L --line-numbers # same as above
sudo docker compose up -d
После выполнения этого набора команд нагрузка кратно снизилась и с тех пор проблем с netfilter-mailcow не наблюдается.