Работа с почтовым сервером exim при блокировке почтового трафика

Если вы получили от нас письмо-уведомление о блокировке почтового трафика или сами заметили проблемы — воспользуйтесь этой инструкцией. 

Статья поможет снять блокировку всем, у кого exim установлен в панели ISPmanger. Для этого потребуется подключиться к вашему VDS по SSH и работать в консоли. Если у вас нет навыков системного администрирования — обратитесь в поддержку.

 

Прежде всего посмотрим размер почтовой очереди с помощью команды:

exim -bpc

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

Далее смотрим список id писем в почтовой очереди:

exim -bp

Можно увидеть, как давно последнее письмо было отправлено в почтовую очередь. Если писем в очереди очень много (больше 1000, например) команда будет выполняться долго (от 2 минут до 1 часа). Тогда дожидаться выполнения exim -bp не стоит, прервите её через некоторое время сочетанием клавиш Ctrl+C.

exim -bp также показывает e-mail адресата, но далеко не всегда, зависит от способа отправки. В качестве отправителя тоже может быть указан любой ящик, ему даже не обязательно быть созданным на этом сервере. Чаще указывают существующий e-mail, чтобы отвести подозрения, ведь отправку можно вести без доступа к этому ящику.
Далее можем выборочно посмотреть содержимое письма и его почтовые заголовки, выбирая для этого id. Например 1g*****, как на скриншоте выше.
 
Команды для просмотра содержимого письма:
exim -Mvb 1g*****
или
vi /var/spool/exim/input/1g*****-D


Внимание! Здесь и далее в данной статье: если у вас exim4, то в путях необходимо указывать exim4 вместо exim.
 
Команды для просмотра почтового заголовка письма:
exim -Mvh 1g*****
или
vi /var/spool/exim/input/1g*****-H
— вместо 1g****** указывайте конкретный ID письма из очереди в exim -bp
 
Зачастую в содержимом письма можно увидеть следующее содержание:

This message was created automatically by mail delivery software.

A message that you sent has not yet been delivered to one or more of its

recipients after more than 24 hours on the queue on


Это означает, что письмо было отправлено на несуществующий почтовый ящик — он указан в этом же письме ниже.
Обычно так поступают, когда отправляют письма с сайта или взломанного почтового ящика.


Изучение содержимого письма поможет узнать, что было отправлено, но об источнике этих отправок мы узнаем мало. Полезнее изучить почтовые заголовки, в первую очередь на наличие строчки X-PHP-Originating-Script. Она фиксирует имя скрипта, если письмо было отправлено php-скриптом с использованием функции mail(). Здесь есть два момента:

  • Если данной строчки нет, возможно в настройках PHP отключено ведение данного заголовка. Включить можно добавлением в файл php.ini следующей строки mail.add_x_header = On

  • После этого перезапускаем веб-сервер командой service apache2 restart или service httpd restart
    Теперь в почтовых заголовках писем, которые будут отправлены после этих изменений, данная строка будет присутствовать.
  • Если данная строчка есть, посмотрите на скрипты в заголовках. Если в этом письме вы видите один скрипт (например, 123.php), а в другом письме другой скрипт (например, 456.php) — имеет смысл собрать статистику командой
    grep -R ‘X-PHP-Originating’ /var/spool/exim/input/|awk ‘{print $3}’|grep php|awk -F : ‘{print $2}’|sort|uniq -c

После этого мы получим список скриптов и частоту их использования.


1. Если в списке есть скрипты с именем tools.php, php-mailer.php и иные адекватные названия, то письмо было отправлено через форму обратной связи или регистрации на вашем сайте. В этом случае проблема массовой рассылки может быть решена двумя способами:

  • Добавьте на формы обратной связи или регистрации сайта защиты от роботов, так называемые «капчи». В популярных CMS существуют специальные плагины для их добавления, в остальных случаях этот момент необходимо решать силами веб-разработчика.

  • Отключите функции mail в настройках PHP. В файле php.ini находим строку disable_functions — если там уже есть параметры, то лучше их не стирать, а дописать к этим параметрам mail через запятую.
    После этого перезапустить веб-сервер командой service apache2 restartили service httpd restart

Обратите внимание, что после отключения функции mail письма перестанут отправляться со всех сайтов на сервере (которые используют данную версию PHP).


2. Если в списке скрипты носят нечитаемые названия, например, http.81bc630525f0a7e424814f1216adeedd.php или gsdjkjhkll.php, то это явный признак вирусного заражения сайта. В этом случае оптимальный выход — провести комплексную проверку на вирусы и устранить уязвимости.

 


До этого мы просто смотрели, что накопилось после блокировки. Теперь изучим, продолжается ли почтовая активность: если нет — можно попросить разблокировать почтовые порты, если рассылка продолжается — нужно дальше искать источник несанкционированной отправки.


Наличие активной рассылки можно выявить через команду просмотра открытых файлов, которые используют почтовый протокол:

lsof | grep smtp
(lsof должен быть предварительно установлен)


В обычном виде, когда не ведется никакая отправка, должно быть показано только следующее:


exim 3356 exim 3u IPv6 1427431 0t0 TCP *:smtp (LISTEN)
exim 3356 exim 4u IPv4 1427432 0t0 TCP *:smtp (LISTEN)


Если запущена легальная отправка, строчек будет больше, но во всех будет фигурировать exim и сервер-адресат. Если при выводе этой команды будет фигурировать имя пользователя, отличное от exim или exim4, а также сервер-адресат будет незнаком — это явный признак наличия активной нелегальной отправки.

 


В завершение предложим вам ещё несколько простых команд для диагностики. Обычно их хватает, чтобы понять, идёт ли спам с вашего сервера. Но опираться в диагностике только на эти команды не стоит — они предназначены для других задач.


Наглядно посмотреть, идет ли почтовый трафик, можно командой:


tcpdump -n port 25
(tcpdump должен быть предварительно установлен)


Не нужно подробно изучать информацию, которую выдаёт эта команда. Достаточно проверить, пополняются ли новые записи: если пополняются — трафик идёт. 


Таким же способом можно отслеживать изменения в почтовых логах командой:
tail -f /var/log/exim/mainlog
или
tail -f /var/log/exim/main.log


— если в лог идёт много записей, это намекает на наличие трафика.


После всех работ по анализу почтовой очереди, если письма вам не нужны, то лучше их удалить. Сделать это можно командой:


exipick -i | xargs exim -Mrm — очистить все сообщения из очереди
exipick -zi | xargs exim -Mrm — очистить все замороженные сообщения из очереди


Замороженные письма в почтовой очереди выглядят так:

Письма переходят в статус «frozen» после нескольких неудачных попыток отправки. Это означает, что после разблокировки почтового трафика они не отправятся, а будут ждать ручной отправки командой:


exipick -i | xargs exim -Mt

 


Еще несколько полезных команд:


exiqgrep -i -o 86400 | xargs exim -Mrm — удалить письма старше определенного часа, например, 24 часов:


86400 означает 24 часа в секундах. Параметр в секундах можно изменить по своему усмотрению.


exiqgrep -i -f luser@example.tld | xargs exim -Mrm - удалить все письма от указанного отправителя


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