Всякие полезности для exim

11 Feb 2010 | Автор: anchous |

Ниже приводится вольный перевод статьи, посвященной хитростям работы с SMTP сервером Exim v. 4.  Эта статья является более подробным изложением материала который я приводил  в моем предыдущем посте о работе с очередью Exim.  Какие то вводные могут пересекаться, но по сути это более подробная и развернутая инструкция.
Естественно, что использование этих команд не исключает необходимости познаний о работе сервисов SMTP, MTA и знакомства с шеллом UNIX.

Message-ID и spool файлы

Уникальные номера message-ID под которыми сервер Exim помещает письма в очередь, представляют собой набор буквено-циферных названий с вариацией регистра, и выглядят следующим образом: XXXXXX-YYYYYY-ZZ. Большинство команд изменения очереди используют эти уникальные message-id.

Каждому сообщению, в spool директории соответствуют три файла. Если вы хотите удалить напрямую файлы, не прибегая к командам работы с очередью, то вы должны быть уверены, что ваши изменения коснутся всех трех файлов, иначе Exim будет работать с остатками вытащенными из spool директории .

Файлы в папке /var/spool/exim/msglog содержат информацию о подключения для каждого сообщения и называются так же как и message-id письма.

Файлы в папке /var/spool/exim/input называются также как и message-id письма, в добавленным суффиксом после названия для различения информации содержащейся в файле: для заголовка (-H); для тела письма (-D).

Чаще всего эти директории содержат подпапки для удобства работы с большой очередью, поэтому не удивяйтесь если директории /var/spool/exim/input и /var/spool/exim/msglog будут заполнены алфавитными подпапками, поэтому все поиски и выборки, с помощью утилиты grep, должны быть производиться рекурсивно.

Основные команды

Вывод информации о количестве сообщений в очереди:

root@odminblog.ru#  exim -bpc

Листинг сообщений находящихся в очереди (время в очереди, размер, message-id, адресат и получатель):

root@odminblog.ru#  exim -bp

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

root@odminblog.ru#  exim -bp | exiqsumm

Вывод информации о том, чем в данный момент занимается сервер Exim:

root@odminblog.ru#  exiwhat

Трассировка алгоритма отправки по заданному адресу:

root@odminblog.ru#  exim -bt test@yahoo.com
test@yahoo.com
router = dnslookup, transport = remote_smtp
host g.mx.mail.yahoo.com [98.137.54.238]  MX=1
host f.mx.mail.yahoo.com [98.137.54.237]  MX=1
host a.mx.mail.yahoo.com [67.195.168.31]  MX=1
host a.mx.mail.yahoo.com [67.195.168.230] MX=1
host b.mx.mail.yahoo.com [74.6.136.65]    MX=1
host h.mx.mail.yahoo.com [66.94.236.34]   MX=1
host c.mx.mail.yahoo.com [206.190.54.127] MX=1
host d.mx.mail.yahoo.com [209.191.88.254] MX=1

Запуск “эмулятора” SMTP сессии из командной строки, таким образом словно он приходит на сервер с указанного IP адреса. Для данной отладки используются актуальные настройки сервера Exim, поэтому способ очень удобен для тестирования сервера, ACL и фильтров. Сообщение отправляется в эмулированной сессии, поэтому оно не будет доставлено.

root@odminblog.ru#  exim -bh 192.168.10.1
**** SMTP testing session as if from host 192.168.10.1
**** but without any ident (RFC 1413) callback.
**** This is not for real!

Вывод всех настроек сервера Exim:

root@odminblog.ru#  exim -bP

Поиск в очереди с помощью exiqgrep

К комплект Exim входит отличная утилита для выборки из почтовой очереди, именующаяся exiqgrep. С  инфа с офф.сайта об использовании утилиты настойчиво рекомендовано просмотреть, ибо знание возможных ключей способно значительно облегчить жизнь сисадмина. Тем более что различные флаги могут сочетаться, для более подробного поиска в почтовой очереди.

Флаг  -f  позволяет искать в очереди сообщение от определенного отправителя, как по имени пользователя или домену, так и по полному адресу:

root@odminblog.ru#  exiqgrep -f  user@search.dom

Флаг  -r позволяет искать в очереди письмо к определенному адресату или домену:

root@odminblog.ru#  exiqgrep -r  user@search.dom

Флаг -o выведет информацию о сообщениях старше определенного количества секунд. В примере для значения в 1 день:

root@odminblog.ru#  exiqgrep -o  86400

Флаг -y выведет информацию о сообщения моложе определенного количества секунд. В примере для значения в 1 час:

root@odminblog.ru#  exiqgrep -y 3600

Флаг -s выведет сообщение определенного размера, или при использовании видгета, определенного диапазона. Например от 500 до 599 байт:

root@odminblog.ru# exiqgrep -s ‘^5..$’

Флаг -z выведет только замороженные сообщения, или  -x для только размороженных сообщений.

Еще несколько флагов для контроля вывода

Флаг -i выведет только message-id в качестве результата запроса:

root@odminblog.ru# exiqgrep -i [-o | -r | -f ]

Флаг -c выведет отчет о количестве сообщений из общего числа, удовлетворяющих условию поиска:

root@odminblog.ru# exiqgrep -c [-o | -r | -f ]

Листинг message-id всех сообщений находящихся в очереди:

root@odminblog.ru# exiqgrep -i

Управление очередью

Для управления сообщениями в очереди используется основной бинарник сервера exim, находящийся /usr/sbin/exim, в вариациях с различными флагами. Большая часть этих флагов требует задания одного или конвейера message-IDЮ заданных из командной строки.

Запуск очереди:

root@odminblog.ru# exim -q -v

Запуск очереди только для локальной доставки:

root@odminblog.ru# exim -ql -v

Удаление сообщения из очереди:

root@odminblog.ru# exim -Mrm <message-ID>

Заморозить сообщения для отправки:

root@odminblog.ru# exim -Mf <message-ID>

Разморозить сообщение:

root@odminblog.ru# exim -Mt <message-ID>

Доставить сообщение не зависимо от того заморожено оно или нет и истекло ли время повтора или нет:

root@odminblog.ru# exim -M <message-ID>

Доставить сообщение только если время повтора истекло:

root@odminblog.ru# exim -Mc <message-ID>

Удалить все замороженные сообщения:

root@odminblog.ru#  exiqgrep -z -i | xargs exim -Mrm

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

root@odminblog.ru#  exiqgrep -o -860000 | xargs exim -Mrm

Заморозить все сообщения в очереди от данного отправителя:

root@odminblog.ru#  exiqgrep -i -f  user@test.com | xargs exim -Mf

Просмотреть заголовок письма:

root@odminblog.ru#  exim -Mvh <message-ID>

Просмотреть тело письма:

root@odminblog.ru#  exim -Mvb <message-ID>

Просмотреть логи относящиеся к данному письму:

root@odminblog.ru#  exim -Mvl <message-ID>

Добавить адресата к сообщению:

root@odminblog.ru#  exim -Mar <message-ID> <address> [<address>]

Изменить отправителя письма:

root@odminblog.ru#  exim -Mes <message-ID> <address>

Access control

Сервер Exim дает возможность использовать так называемые листы контроля доступа( access control lists) для управления и фильтрацией на уровне  SMTP диалога, которые задаются в разделе ACL конфигурационного файла сервера exim.conf. Начинать фильтрацию можно со строки SMTP диалога  HELO.

# Использовать ACL после HELO
acl_smtp_helo = check_helo

# Выражения для проверки check_helo ACL:
check_helo:

deny message = Gave HELO/EHLO as “friend”
log_message = HELO/EHLO friend
condition = ${if eq {$sender_helo_name}{friend} {yes}{no}}

deny message = Gave HELO/EHLO as our IP address
log_message = HELO/EHLO our IP address
condition = ${if eq {$sender_helo_name}{$interface_address} {yes}{no}}

accept

*** Проверка HELO остается исключительно на вашей совести, поскольку строка HELO наименне важная в диалоге SMTP, поэтому не надо вешать на неё слишком много проверок, поскольку многие спамеры используют весьма информативные поля HELO, в то время как вполне законопослушные отправители, с кривых серваков, будут отметаться именно по этому полю. К тому же для спамера это наиболее простой способ избежать проверки- указать в поле HELO что дескать HELO im.an.ugly.spammer, так что в этой проверке не стоит устраивать допроса с пристрастием.

Следующим этапом идет проверка отправителя и хоста-отправителя. Ниже разобрано как сделать это после команды RCPT TO, что даст гораздо больше информации, нежели делать отлуп сразу по завершению строки MAIL FROM.

# Указать листу ACL отрабатывать после RCPT TO
acl_smtp_rcpt = check_recipient

# Выражение для check_recipient ACL
check_recipient:

# [...]

drop hosts = /etc/exim_reject_hosts
drop senders = /etc/exim_reject_senders

# [ Здесь же можно указывать и белые списки... ]

В данноом примере два текстовых файлика приводятся в качестве черных списков. В этих файлах следует указывать имена хостов/IPадреса в /etc/exim_reject_hosts, и почтовые адреса в /etc/exim_reject_senders, по одному на строчке

Также возможно использовать контекстное сканирование для проверки тела сообщения, но нужно помнить о том, что эта процедура затребует для сервера Exim гораздо больше  CPU чем это необходимо при отсутствии этой проверки, особенно если письма большого размера.
# Указать ACL отрабатывать после поля DATA
acl_smtp_data = check_message

# Выражение для использования check_messages ACL
check_message:

deny message = “Sorry, Charlie: $regex_match_string”
regex = ^Subject:: .*Lower your self-esteem by becoming a sysadmin

accept

Исправление SMTP-Auth для почтового клиента Pine

Если клиенты pine не могут использовать SMTP аутентификацию на сервере Exim и получают ошибку “unable to authenticate” без запроса пароля, то для них следует использовать следующее выражение в конце конфига  exim.conf.  Выражение приводится для сервера Exim с поддержкой MySQL:

begin authenticators

fixed_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT user_idnr FROM dbmail_users \
WHERE userid = ‘${quote_mysql:$2}’ AND passwd = ‘${quote_mysql:$3}’}}
server_set_id = $2
server_prompts = :

Эта проблема существовала довольно давно в CPanel Exim , но она добавляется в конфигурацию для стабильности системы.

Исправление SMTP-Auth для почтового клиента The Bat

Для использования почтового клиента The Bat с сервером Exim, следует прописать для него следующее выражение аутентификации с использованием алгоритма CRAM-MD5, в  секции аутентификаций конфига exim.conf:

begin authenticators

auth_cram_md5:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup mysql{SELECT passwd FROM dbmail_users \
WHERE userid = ‘${quote_mysql:$1}’}{$value}fail}
server_set_id = $1

Логирование темы письма

Одна из наиболее полезных конфигураций для Exim- логирование тем сообщений, проходящих через почтовый сервер. Добавляем в конфиг exim.conf, и можем смотреть какие сообщения признаны спамом:

log_selector = +subject

Reducing or increasing what is logged.

Отключение блокировки вложений

Для того чтобы отключить блокировку потенциально опасных вложений, которая применяется на многих Cpanel серверах по умолчанию,  но осуществлять контроль на уровне доменов, следует добавить соответствующую блокировку в начало файла /etc/antivirus.exim:

if $header_to: matches “example\.com|example2\.com”
then
finish
endif

Просмотр логов с помощью утилиты exigrep

Утилита exigrep (не путать с exiqgrep) используется для поиска по лог файлам, используя произвольные выражения. Использование этой команды выведет все сообщения из лога с определенным message-id, подпадающим под данное выражение, что очень удобно, поскольку каждое сообщение оставляет в лог файле три записи, которые проблематично вывести с помощью стандартных команд.

Поиск письма посланного с определенного IP адреса:

root@odminblog.ru# exigrep ‘<= .* \[12.34.56.78\] ‘ /path/to/exim_log

Поиск письма посланного на определенный IP адрес:

root@odminblog.ru#  exigrep ‘=> .* \[12.34.56.78\]‘ /path/to/exim_log

В данном поисковом запросе символ  “=>” указывает исходящее сообщение, посланное на “user@domain.tld”. Символ “<=”  указывает на входящее сообщение и отправителя письма, IP адрес отправителя, размер письма,  message ID и тему письма, если данный параметр логирования включен.

root@odminblog.ru# exigrep ‘=> .*user@domain.tld’ /path/to/exim_log | fgrep ‘<=’

Сгенерировать и вывести статистику работы сервера Exim на основе лог файла:

root@odminblog.ru# eximstats /path/to/exim_mainlog

Сгенерировать и вывести статистику работы сервера Exim на основе лог файла, с менее информативным  выводом:

root@odminblog.ru# eximstats -ne -nr -nt /path/to/exim_mainlog

Сгенерировать и вывести статистику работы сервера Exim за определенный день, на основе лог файла:

root@odminblog.ru# fgrep YYYY-MM-DD /path/to/exim_mainlog | eximstats

Удалить из очереди все сообщения содержащие в теле определенный набор символов:

root@odminblog.ru# grep -lr ‘a certain string’ /var/spool/exim/input/ | \
sed -e ‘s/^.*\/\([a-zA-Z0-9-]*\)-[DH]$/\1/g’ | xargs exim -Mrm

Для просмотра тел сообщений используется команда grep, поскольку утилита exiqgrep не умеет просматривать тело сообщения. Если удалить эти файлы напряму, то это будет не корректной обработкой очереди, поэтому настоятельно рекомендуется использовать приведенные команды.

Но поскольку в очереди может содержаться огромное количество message-ids (например вывод `exiqgrep -i` возвращает большой список значений) , то можно попасть под ограничение shell на количество вводимых аргументов.  Поэтому вывод содержащий message-ids перенаправляется в xargs для избежания подобных ограничений. Например команда для удаления всех сообщений, посланных с адреса spam@evil.com, выглядит так:

root@odminblog.ru# exiqgrep -i -f ‘<spam@evil.com>’ | xargs exim -Mrm

Перегрузка конфигурации сервера

После внесения измененений в exim.conf, необходимо перегрузить основной pid сервера exim, для того чтобы демон перечел конфигурацию. В принципе можно выключить и включить сервис, но в этот момент можно потерять какое то количество сообщений. Поэтому делаем через kill:

root@localhost# kill -HUP `cat /var/spool/exim/exim-daemon.pid`

Этот рестарт отобразит в логе сервера exim_mainlog что нибудь вроде этого:

2010-02-11 12:08:56 pid 750: SIGHUP received: re-exec daemon
2010-02-11 12:08:56 exim 4.69 daemon started: pid=750, -q30m, listening for SMTP on port 25 (IPv4)

Read The Fucking Manual

The Exim Home Page

Documentation For Exim

The Exim Specification – Version 4.5x

Exim command line arguments

VN:F [1.9.21_1169]
Rating: 7.2/10 (10 votes cast)
VN:F [1.9.21_1169]
Rating: +5 (from 5 votes)
Всякие полезности для exim, 7.2 out of 10 based on 10 ratings

Теги: ,

Отзывов: 6 на «Всякие полезности для exim»

  1. Автор: Рома на 16 Apr 2010

    Классная статейка, то что искал. СПС за труд. Внёс её в свою локальную вику.

    [Reply]

    VA:F [1.9.21_1169]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.21_1169]
    Rating: 0 (from 0 votes)
  2. Автор: Alex на 02 Oct 2011

    Подскажите, пожалуйста, где поменять имя отправителя в настройках exim?

    К примеру есть почта TEST@domain.ru
    и при получение писем с данного ящика в графе отправителя пишется TEST
    А хотелось бы к примеру что бы писалось FOX.

    [Reply]

    anchous Reply:

    а что вам мешает указать в настройках почтового клиента данные отправителя хоть root@anydomain.aero ?

    [Reply]

    VN:F [1.9.21_1169]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.21_1169]
    Rating: +1 (from 1 vote)
  3. Автор: Сергей на 13 Dec 2012

    Как напоминалку себе, но может и другим пригодится. Иногда не уходит письмо по непонятным причинам и даже включение в конфиге журналирования всего и вся не помогает. В таком случае можно попробовать отправить письмо в режиме отладки и результат вывести в файл:
    exim -d -M > /var/log/exim-debug.log 2>&1

    [Reply]

    VA:F [1.9.21_1169]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.21_1169]
    Rating: +2 (from 2 votes)
  4. Автор: Сергей на 09 Jan 2013

    небольшая правка к предыдущему сообщению:
    exim -d -M > /var/log/exim-debug.log 2>&1

    [Reply]

    VA:F [1.9.21_1169]
    Rating: 5.0/5 (1 vote cast)
    VA:F [1.9.21_1169]
    Rating: +2 (from 2 votes)
  5. Автор: Тарас на 30 Mar 2015

    Охренеть, Серег, ты так выручил :))))

    [Reply]

    VA:F [1.9.21_1169]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.21_1169]
    Rating: 0 (from 0 votes)

Ваш отзыв