Exim, весьма распространен и в некоторых операционных системах является почтовым сервером по умолчанию.
Данный материал, является вольным переводом exim chearsheet.
ID сообщений и spool файлы
Идентификаторы сообщений в очередях Exim, представляют из себя буквенно-цифровые последовательности в верхнем и нижнем регистрах: XXXXXX-YYYYYY-ZZ и используются большинством команд администрирования очереди и логирования в Exim.
Для каждого сообщения создаются три файла в spool директории ( зачастую это: /var/spool ). Если вы работает с данными файлами вручную, без использования описанных ниже команд и утилит, убедитесь что обработали все три файла, например, не оставив в очереди exim только один из них, удалив остальные.
Каталог /var/spool/exim/msglog содержит файлы со служебной информацией для каждого сообщения и именуются в соответствии с ID этого сообщения.
Каталог /var/spool/exim/input содержат файлы заголовков и данных, к ID сообщения в имени, добавлены суффиксы -H и -D, соответственно.
Кроме того в этих директориях могут появляться хэшированные подкаталоги для работы с большими почтовыми очередями.
Получение базовой информации по Exim
Вывести количество сообщений в очереди:
Код: Выделить всё
root@localhost# exim -bpc
Код: Выделить всё
root@localhost# exim -bp
Код: Выделить всё
root@localhost# exim -bp | exiqsumm
Код: Выделить всё
root@localhost# exiwhat
Код: Выделить всё
root@localhost# exim -bt alias@localdomain.com
user@thishost.com
<-- alias@localdomain.com
router = localuser, transport = local_delivery
root@localhost# exim -bt user@thishost.com
user@thishost.com
router = localuser, transport = local_delivery
root@localhost# exim -bt user@remotehost.com
router = lookuphost, transport = remote_smtp
host mail.remotehost.com [1.2.3.4] MX=0
Код: Выделить всё
root@localhost# exim -bh 192.168.11.22
Код: Выделить всё
root@localhost# exim -bP
Стандартная поставка сервера Exim включает в себя утилиту для поиска по очередям — exiqgrep, это самый оптимальный путь для решения данной задачи.
Если вы используете конвейер команд, например из exim -bp в awk, grep, cut и т.д., вы просто усложняете себе жизнь.
Различные ключи команды exiqgrep, позволяют достаточно тонко настроить критерии поиска.
Ключ -f используется для поиска сообщений конкретного отправителя
Код: Выделить всё
root@localhost# exiqgrep -f [luser]@domain
Код: Выделить всё
root@localhost# exiqgrep -r [luser]@domain
Код: Выделить всё
root@localhost# exiqgrep -o 86400 [...]
Код: Выделить всё
root@localhost# exiqgrep -y 3600 [...]
Код: Выделить всё
root@localhost# exiqgrep -s '^7..$' [...]
Еще несколько ключей отвечающих за вывод результатов поиска
Вывести только ID сообщения, в одном из вышеупомянутых вариантов поиска
Код: Выделить всё
root@localhost# exiqgrep -i [ -r | -f ] ...
Код: Выделить всё
root@localhost# exiqgrep -c ...
Код: Выделить всё
root@localhost# exiqgrep -i
Основной бинарник Exim ( /usr/sbin/exim ), используется с различными ключами для управления сообщениями в очереди. Многие ключи, подразумевают указание одного или более ID сообщения в командной строке, как раз тут вам и пригодится команда exiqgrep -i, которая была упомянута выше.
Запуск очереди:
Код: Выделить всё
root@localhost# exim -q -v
Код: Выделить всё
root@localhost# exim -ql -v
Код: Выделить всё
root@localhost# exim -Mrm [ ... ]
Код: Выделить всё
root@localhost# exipick -zi | xargs exim -Mrm
Код: Выделить всё
root@localhost# exipick -i | xargs exim -Mrm
Заблокировать( заморозить ) сообщение:
Код: Выделить всё
root@localhost# exim -Mf [ ... ]
Код: Выделить всё
root@localhost# exim -Mt [ ... ]
Код: Выделить всё
root@localhost# exim -M [ ... ]
Код: Выделить всё
root@localhost# exim -Mc [ ... ]
Код: Выделить всё
root@localhost# exim -Mg [ ... ]
Код: Выделить всё
root@localhost# exiqgrep -z -i | xargs exim -Mrm
Код: Выделить всё
root@localhost# exiqgrep -o 432000 -i | xargs exim -Mrm
Код: Выделить всё
root@localhost# exiqgrep -i -f luser@example.tld | xargs exim -Mf
Код: Выделить всё
root@localhost# exim -Mvh
Просмотреть тело сообщений:
Код: Выделить всё
root@localhost# exim -Mvb
Просмотр логов сообщения:
Код: Выделить всё
root@localhost# exim -Mvl
Добавить получателя в сообщение:
Код: Выделить всё
root@localhost# exim -Mar [ ... ]
Код: Выделить всё
root@localhost# exim -Mes
Листы контроля доступа (Access Control List, ACL)
Exim предоставляет возможность использовать, листы контроля доступа (ACL) на различных этапах SMTP передачи. Условия ACL назначаются в конфигурационном файле exim.conf.
Начать имеет смысл с 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
Далее, вы можете провести проверку по отправителю или удаленному хосту. В примере показано как фильтровать по содержимому, идущему после команды RCPT TO. Если прием сообщения будет отклонен в этом месте, вы получите больше данных в логах, нежели при блокировке по MAIL FROM.
Код: Выделить всё
# Назначит проверку содержимого после RCPT TO
acl_smtp_rcpt = check_recipient
# Условия для check_recipient ACL
check_recipient:
# [...]
drop hosts = /etc/exim_reject_hosts
drop senders = /etc/exim_reject_senders
# [ Probably a whole lot more... ]
Кроме того, можно сканировать содержимое сообщения, на предмет совпадения с регулярным выражением. Имейте в виду, это дает дополнительную нагрузку на процессор, особенно на больших сообщениях.
Код: Выделить всё
# Назначить 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
В случае, если pine не может использовать аутентификацию на сервере Exim, возвращая сообщение "unable to authenticate", без запроса на ввод пароля, нужно добавить в exim.conf следующие строки.
Код: Выделить всё
begin authenticators
fixed_plain:
driver = plaintext
public_name = PLAIN
server_condition = "${perl{checkuserpass}{$1}{$2}{$3}}"
server_set_id = $2
> server_prompts = :
Запись в лог файл заголовка Subject
Один из самых полезных хаков конфигурации Exim. Добавление в exim.conf приведенной строки, позволит писать в лог файл строку subject, писем проходящих через сервер. Это сильно помогает при решении проблем в процессе настройки сервера, а так-же дает дополнительные критерии для отсева спама.
Код: Выделить всё
log_selector = +subject
Честно говоря не думаю что протокол identd был когда либо очень полезен. Identd опирается на подключающийся хост, что-бы подтвердить идентификацию ( System UID ), удаленного пользователя, владельца процесса, устанавливающего сетевое соединение. Это может быть в определенной степени полезно в мире системных оболочек и IRC пользователей, но уж никак не на нагруженном почтовом сервере, где пользователем процесса зачастую является просто какой-нибудь "mail", и за этим может быть любой другой MTA. В итоге куча накладных расходов, нулевой результат, лишь задержки identd запросов и как следствие отказы и таймауты.
Можно запретить Exim делать подобные запросы, установив таймаут 0 секунд в exim.conf.
Код: Выделить всё
rfc1413_query_timeout = 0s
Что-бы отключить блокировку исполняемых вложений, что CPanel делает по умолчанию, правда не предоставляя при это контроля "для каждого домена", следующий блок нужно добавить в начало файла /etc/antivirus.exim:
Код: Выделить всё
if $header_to: matches "example\.com|example2\.com"
then
finish
endif
Утилита exigrep ( не путайте с exiqgrep, использующейся для поиска в очереди ), используется для поиска по лог файлам. Например exigrep может вывести все записи из лог файла с совпадающим ID сообщения, что довольно удобно, учитывая что каждое сообщение занимает 3 строки в лог файле.
Поиск сообщений отправленных с определенного IP адреса:
Код: Выделить всё
root@localhost# exigrep '<= .* \[12.34.56.78\] ' /path/to/exim_log
Код: Выделить всё
root@localhost# exigrep '=> .* \[12.34.56.78\]' /path/to/exim_log
Код: Выделить всё
root@localhost# exigrep '=> .*user@domain.tld' /path/to/exim_log | fgrep '<='
Код: Выделить всё
root@localhost# eximstats /path/to/exim_mainlog
Код: Выделить всё
root@localhost# eximstats -ne -nr -nt /path/to/exim_mainlog
Код: Выделить всё
root@localhost# fgrep YYYY-MM-DD /path/to/exim_mainlog | eximstats
Удалить все сообщения в очереди, содержащие в теле, определенную строку:
Код: Выделить всё
root@localhost# grep -lr 'a certain string' /var/spool/exim/input/ | \
sed -e 's/^.*\/\([a-zA-Z0-9-]*\)-[DH]$/\1/g' | xargs exim -Mrm
Если вывод используемой команды слишком длинный, например ID сообщений при exiqgrep -i, которые нужно передать дальше по конвейеру команде exim, может быть превышено количество аргументов командной строки вашей системной оболочки. В этом случае передавайте результат поиска через конвейер, команде xargs, которая будет обрабатывать результаты ограниченными порциями.
Например удалим тысячи сообщений, отправленных с адреса joe@example.com:
Код: Выделить всё
root@localhost# exiqgrep -i -f '' | xargs exim -Mrm
После того как вы внесли изменения в файл конфигурации, необходимо перезапустить exim, или послать рабочему процессу сигнал SIGHUP, что-бы он перечитал конфигурационный файл и изменения вступили в силу. Предпочтительней естественно отправить сигнал, нежели перезапускать приложение.
Код: Выделить всё
root@localhost# kill -HUP `cat /var/spool/exim/exim-daemon.pid`