Управление Exim

Пуск/Остановка/Рестарт Exim

/etc/init.d/exim start|stop|restart
После того как вы внесли изменения в файл конфигурации, необходимо перезапустить exim, или послать рабочему процессу сигнал SIGHUP, что-бы он перечитал конфигурационный файл и изменения вступили в силу. Предпочтительней естественно отправить сигнал, нежели перезапускать приложение.
kill -HUP `cat /var/run/exim.pid`

Чем в данный момент занят MTA Exim?

exiwhat

Проверка маршрутизации почты по адресу электронной почты

exim -bt email@example.com

Генерирование и отображение статистики Exim из лог-файла

eximstats /path/to/exim_mainlog

Проверка SMTP содинения из коммандной строки для определенного IP-адреса. Результат покажет через какие проверки будет проходить письмо с данного IP-адреса, через какие ACL и фильтры. Необходимо заменить x.x.x.x на необходмый IP-адрес.

exim -bh x.x.x.x

выводит все значения установленные в конфиге. У этой команды тоже есть
куча параметров, но дефолтное использование + grep достаточно в 90%
случаев.

exim -bP

Посмотрим настройки транспорта

exim -bP transports

Посмотрим настройки транспорта и подписи DKIM

exim -bP transports|grep dkim

отладка. Крайне полезная опция. Специально начал с нее, потому что её
можно комбинировать с любыми другими.

Например exim -bd -d запускает exim как демон, выводя на консоль всю
отладочную информацию. Чтобы уменьшить количество выдаваемой информации,
можно использовать -dd (имеет смысл только с -bd) пропускает информацию
по подпроцессам. Или -v, простое описание того, что делает exim (при
использовании -d включена по умолчанию).

exim -d

кроме того, что выдает версию и некоторую информацию о бинарнике,
проверяет exim.conf на ошибки (А скорее, на опечатки. Если эта опция
говорит, что все хорошо, то это еще не значит, что ВСЁ хорошо).

exim -bV
 exim -F <string>

устанавливает имя отправителя. Если опция не указана, подставляется
значение поля «gecos» из данных пароля пользователя.

 exim -f <address>

устанавливает адрес отправителя. Обычно, она может использоваться только
доверенными пользователями, но директива «untrusted_set_sender» может
разрешить её использование недоверенным пользователям.

Если не понятно, в чем разница между опциями, объясню: приходит письмо
от Vasya Pupkin <admin@server.ru.>.

Vasya Pupkin — это имя отправителя (опция -F)
admin@server.ru — адрес (опция -f)

Информация по очередям(Queue)

Вывести информацию по колличеству писем в очереди

exim -bpc

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

exim -bp

Отображение всех сообщений в очереди (количество, объем, старых, новых, области, и итоги)

exim -bp | exiqsumm

Поиск сообщений в очереди

Поиск в очереди сообщения от определенного отправителя

exiqgrep -f [user]@example.com

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

exiqgrep -s `^7..$` [...]

Поиск в очереди сообщений для конкретного получателя/домена

exiqgrep -r [user]@example.com

Вывод только Message-ID, как результат одного из двух поисковых запросов выше

exiqgrep -i [ -r | -f ] ...

Вывод количества сообщений, как результат одного из поисковых запросов выше

exiqgrep -c [ -r | -f ] ...

Вывод только Message-ID очереди

exiqgrep -i

Просмотр сообщений в очереди

Просмотр заголовков сообщения в очереди

exim -Mvh messageID

Просмотр тела сообщения в очереди

exim -Mvb messageID

Просмотр лога сообщения

exim -Mvl messageID

Переместить сообщение (без ошибок)

exim -Mvl messageID

Отправить сообщение об ошибке отправителю письма с формулировкой «отменено администратором»

exim -Mg messageID

Удалить сообщения и не посылать никаких ошибок (в логах упоминание будет).

exim -Mrm messageID

Заблокировать  (заморозить) сообщение:

exim -Mf messageID messageID

Разблокировать  (разморозить) сообщение:

exim -Mt messageID

Добавить получателя в сообщение:

exim -Mar messageID

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

exim -Mes messageID

Просмотр заголовков сообщения в очереди

exim -Mvh

Просмотр теля сообщения в очереди

exim -Mvb

Просмотр лога сообщения

exim -Mvl

Если сообщение находится в состоянии «попытки доставки», следующие опции
на него не повляют: -Mrm, -Mg, -Mar, -Mes, -Mf, -Mt, -Mmad, -Mmd.

Для сообщений, которые подозреваются в спаме удобно сначала массово,
сделать -Mf, потом -Mvl, -Mvh и -Mvb для пары выбранных наугад
сообщений. Если все еще невозможно с консоли определить спам ли это
(например, проблемы с кодировками или есть вложения), то можно с помощью
— Mar добавить себя в список получателей, и ускорить данное сообщение с
помощью -M. Когда все наконец станет ясно, то либо -Mrm, либо -Mt.

Управление очередью
просто запускает один процесс обработчика очереди; очередь сканируется и
сообщения доставляются в том, порядке в котором бы доставлялись обычно
(вообще, порядок случаен, здесь имеется ввиду, что учитываются все
заморозки и т. п.). Для каждого процесса обработчика очереди одно SMTP
соединение (это справедливо для всех опций этого класса). После одного
прохода по сообщениям процесс завершается (т.о. сообщения, у которых не
подошло время доставки даже не попытаются доставиться), если не указана
опция (см. ниже).

Опция -q имеет флаги. Её использование таково exim -q<qflags><time>

Это значит, что вы можете комбинировать её разновидности (в отличие, от,
например -M, где вы НЕ можете указать -Mvlhb, чтобы просмотреть и логи,
и заголовки, и тело сообщения). Тем не менее, флаги должны быть указанны
в правильно порядке.

exim -qq...

двухступенчатое выполнение очереди. При первой обработке очереди опция
«queue_smtp_domains» принимается как совпадающая с каждым доменом.
Адреса роутятся, происходят локальные доставки, но удалённые транспорты
не запускаются. Во время второй обработки происходит нормальное
сканирование очереди. Плюс такого способа в том, что те сообщения
которые роутятся на один и тот же хост, в основном, идут через одно
SMTP-соединение, на основе БД совпадений, которые были установлены при
первом сканировании очереди.

 exim -q[q]i...

если присутствует флаг i то доставляются только те сообщения, для
которых еще не было попытки доставки.

 exim -q[q]f...

если присутствует флаг f, доставляются любые незамороженные сообщения
(независимо от того, пришло их время повтора или нет).

 exim -q[q]ff...

то же что и f, но замороженные сообщения тоже доставляются.

 exim -q[q][f[f]]l

l определяет, что нужно делать только локальные доставки (остальные
сообщения, разумеется, остаются в очереди).

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

    exim -ffl10m

Предпринимать попытку доставить любое (включая замороженные) сообщение,
требующее локальной доставки каждые 10 минут (очень полезно, когда
очередь забита всякой дрянью, которую нельзя удалить и из-за которой
нормальные люди не могут получить письма).

 /usr/exim/bin/exim -bd -q30m

А так можно запустить демона, который будет обслуживать входящие
соединения и обрабатывать очередь каждые 30 минут (собственно штатные
средства ОС, его примерно так и запускают).

Начать процесс выполнения очереди

exim -q -v

Принудительный запуск другой очереди

exim -qf

Доставить сообщение, вне зависимости от состояния блокировки или времени повторной доставки

exim -M messageID

Доставить сообщение, если достигнуто время для доставки

exim -Mc messageID

Принудительный запуск другой очереди c удалением замороженных сообщений

exim -qff

Начать процесс выполнения только для локальных получателей

exim -ql -v

Удалить сообщение из очереди

exim -Mrm messageID

Удалить все сообщения, которые старше, чем Х секунд из очереди (например, 5 дней будет 432 000 секунд)

exiqgrep -o 432000 -i | xargs exim -Mrm

Удалить все сообщения, которые реньше, чем Х секунд из очереди (например, 5 дней будет 432 000 секунд)

exiqgrep -y 432000 -i | xargs exim -Mrm

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

exiqgrep -i -f email@example.com | xargs exim -Mf

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

exipick -zi | xargs exim -Mrm

Удалить все сообщения из очереди (плохая идея)

exiqgrep -i | xargs exim -Mrm
или
exipick -i | xargs exim -Mrm

Поиск в журнальных файлах с помощью exigrep
Утилита exigrep ( не путайте с exiqgrep, использующейся для поиска в очереди ), используется для поиска по лог файлам. Например exigrep может вывести все записи из лог файла с совпадающим ID сообщения, что довольно удобно, учитывая что каждое сообщение занимает 3 строки в лог файле.

Поиск сообщений отправленных с определенного IP адреса:

bash:

exigrep '<= .* [12.34.56.78] ' /path/to/exim_log

Поиск сообщений отправленных на определенный IP адрес:

bash:

exigrep '=> .* [12.34.56.78]' /path/to/exim_log

Данный пример ищет сообщения содержащие символы «=>», и отправленные на адрес «user@domain.tld», далее по конвейеру, результат передается команде grep, которая из полученного результата выбирает строки, содержащие «<=» с информацией об отправителе, почтовом адресе, IP адресе, размере сообщения, ID сообщения и заголовок subject, если логгирование этой строки включено.

bash:

exigrep '=> .*user@domain.tld' /path/to/exim_log | fgrep '<='

Генерировать из лог файла и показать статистику Exim:

bash:

eximstats /path/to/exim_mainlog

То-же что и выше но с более подробными данными:

bash:

eximstats -ne -nr -nt /path/to/exim_mainlog

Аналогично но за определенный день:

bash:

fgrep YYYY-MM-DD /path/to/exim_mainlog | eximstats

В качестве дополнения

Удалить все сообщения в очереди, содержащие в теле, определенную строку:

bash:

grep -lr 'a certain string' /var/spool/exim/input/ |
sed -e 's/^.*/([a-zA-Z0-9-]*)-[DH]$/1/g' | xargs exim -Mrm

Командой выше, мы проверяем содержимое каталога /var/spool/exim/input/, в поисках файлов очереди, содержащих определенную строку в теле сообщения, поскольку команда exiqgrep не умеет просматривать тело сообщений. Если вы решите удалить найденные файлы напрямую, ЭТО БУДЕТ НЕ ПРАВИЛЬНО, используйте предназначенные для этого команды exim.

Если вывод используемой команды слишком длинный, например ID сообщений при exiqgrep -i, которые нужно передать дальше по конвейеру команде exim, может быть превышено количество аргументов командной строки вашей системной оболочки. В этом случае передавайте результат поиска через конвейер, команде xargs, которая будет обрабатывать результаты ограниченными порциями.

Например удалим тысячи сообщений, отправленных с адреса joe@example.com:

bash:

exiqgrep -i -f '' | xargs exim -Mrm
Листы контроля доступа (Access Control List, ACL)
 Exim предоставляет возможность использовать, листы контроля доступа (ACL) на различных этапах SMTP передачи. Условия ACL назначаются в конфигурационном файле exim.conf.
 Начать имеет смысл с HELO.
bash:
# Назначить 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 а не писать там «я спамер», так что много спама вы на этом не отсеете.
 Далее, вы можете провести проверку по отправителю или удаленному хосту. В примере показано как фильтровать по содержимому, идущему после команды RCPT TO. Если прием сообщения будет отклонен в этом месте, вы получите больше данных в логах, нежели при блокировке по MAIL FROM.
bash:
# Назначит проверку содержимого после 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... ]
 В приведенном примере для блокировки используются два текстовых файла. В файл /etc/exim_reject_hosts, значения добавляются в виде: имя_хоста/IP_адрес, в файл /etc/exim_reject_senders в виде адреса отправителя, по одной записи в строке.
 Кроме того, можно сканировать содержимое сообщения, на предмет совпадения с регулярным выражением. Имейте в виду, это дает дополнительную нагрузку на процессор, особенно на больших сообщениях.
bash:
# Назначить 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 аутентификации для pine
 В случае, если pine не может использовать аутентификацию на сервере Exim, возвращая сообщение «unable to authenticate», без запроса на ввод пароля, нужно добавить в exim.conf следующие строки.
bash:
begin authenticators
fixed_plain:
driver = plaintext
public_name = PLAIN
server_condition = «${perl{checkuserpass}{$1}{$2}{$3}}»
server_set_id = $2
> server_prompts = :
 Некоторое время назад, данная проблема имела место быть в CPanel, на текущий момент этот недочет исправлен.
Запись в лог файл заголовка Subject
 Один из самых полезных хаков конфигурации Exim. Добавление в exim.conf приведенной строки, позволит писать в лог файл строку subject, писем проходящих через сервер. Это сильно помогает при решении проблем в процессе настройки сервера, а так-же дает дополнительные критерии для отсева спама.
bash:
log_selector = +subject
Отключение identd
 Честно говоря не думаю что протокол identd был когда либо очень полезен. Identd опирается на подключающийся хост, что-бы подтвердить идентификацию ( System UID ), удаленного пользователя, владельца процесса, устанавливающего сетевое соединение. Это может быть в определенной степени полезно в мире системных оболочек и IRC пользователей, но уж никак не на нагруженном почтовом сервере, где пользователем процесса зачастую является просто какой-нибудь «mail», и за этим может быть любой другой MTA. В итоге куча накладных расходов, нулевой результат, лишь задержки identd запросов и как следствие отказы и таймауты.
 Можно запретить Exim делать подобные запросы, установив таймаут 0 секунд в exim.conf.
bash:
rfc1413_query_timeout = 0s
Отключение блокировки вложений
 Что-бы отключить блокировку исполняемых вложений, что CPanel делает по умолчанию, правда не предоставляя при это контроля «для каждого домена», следующий блок нужно добавить в начало файла /etc/antivirus.exim:
bash:
if $header_to: matches «example.com|example2.com»
then
finish
endif
Полезные утилиты Exim
Одним из главных плюсов Exim'а, без сомнения, являются утилиты, которые
поставляются вместе с ним. Они могут значительно упростить рутинные
операции, сократить ваши однострочники раз в 5, и дают возможность
составлять сложные sh-скрипты для некоторых часто повторяемых действий
с очередью и/или логами.

exiqgrep — Выборка из очереди.

Без опций будет идентично exim -bp
Самая главная опция это -h, которая выводит список всех опций.

— f <regexp> — регэксп совпадения с адресом отправителя
— r <regexp> — регэксп совпадения с адресом получателя
— s <regexp> — регэксп совпадения с полем размера (именно с полем
размера, в том виде как оно указывается при выводе exim -bp)
регэкспы не надо заключать в //
— y <seconds> — выводит сообщения «младше» заданного количества секунд
— o <seconds> — выводит сообщения «старше» заданного количества секунд
— z — только frozen сообщения
— x — все кроме frozen
— c — Показать только количество совпадений (в зависимости от версии
показывает либо просто число, либо фразу типа «15 matches out of 78
messages»
— l — Показывает полную информацию, как её выводит exim (включено по умолчанию)
— i — Показывает только IDs совпавших сообщений
— b — Показывает совпадения в «кратком» формате. Одна строка: ID, From и To
— R — Выводит сообщения в обратном порядке

Разумеется, опции можно комбинировать и делать вещи типа:

exiqgrep -zif '^<>$'

что выводит нам ID замороженных баунсов...

На основе этого можно написать такой вот скрипт

#!/bin/sh
if ! [ `which exim 2>/dev/null` ]; then
echo «Sorry, exim binary not found! Exit now.»
exit
fi
if ! [ `which exiqgrep 2>/dev/null` ]; then
echo «Sorry, exiqgrep binary not found! Exit now.»
exit
fi
if [ "$1" == "cf" ]; then
num_of_frz_mes=`sudo exiqgrep -zif '^<>$|wc -l`
sudo exiqgrep -zif '^<>$'|xargs sudo exim -Mrm > /dev/null
echo «$num_of_frz_mes frozen bounces deleted»
exit
fi
if [ "$1" == "c" ]; then
num_of_mes=`sudo exiqgrep -if '^<>$'|wc -l`
sudo exiqgrep -if '^<>$'|xargs sudo exim -Mrm > /dev/null
echo «$num_of_mes bounces deleted»
exit
fi
num_of_mes=`sudo exiqgrep -if '^<>$'|wc -l`
num_of_frz_mes=`sudo exiqgrep -zif '^<>$'|wc -l`
echo «$num_of_mes bounces currently in the queue»
echo «$num_of_frz_mes frozen bounces currently in the queue»

Запуск без опций показывает количество баунсов в очереди.

с — удалить все баунсы (не надо так делать!)
cf — удалить все frozen баунсы

А можно ускорить доставку для определённого домена (-v можно убрать,
разумеется):

exiqgrep -i -r 'domain.com$' | xargs exim -v -M

Иногда, при использовании exiqgrep появляется такое

Line mismatch: 236d 1HOnvz-00069X-8w <info@lischer.com.>

Лечится так

exim -bpr | grep «^[0-9][0-9][0-9]d» | awk `{print $2}' | xargs exim -Mrm

Я не буду рассасывать, что это значит и как такое получается потому,
что это «выходит за рамки статьи».

exipick
-------

exipick — показывает сообщения из очереди по разным критериям и в разных форматах

Создана как замена exiqgrep'у. Лично мне хватает последнего, но если
захочется чего-нибудь помощнее читайте exipick --help или perldoc exipick

exiqsumm — Анализ очереди

Сама по себе эта утилита ничего не делает. На вход ей обязательно надо
подать очередь exim'а.

exim -bp | exiqsumm

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

По умолчанию вывод сортируется по доменам в алфавитном порядке. Есть и
другие опции
— a — сортирует по возрасту самого старого сообщения
— c — сортирует по количеству сообщений
— b — показывает баунсы отдельно, строчки помечаются (b). Т.е. для тех
доменов где есть баунсы будет две строки, одна с b, другая без нее.
— f — показывает «замороженные» сообщения
— s — показывает и домен с которого отправлено и письмо, и домен
получатель. Соответсвенно каждая «пара» считается отдельно.

А вот так можно выявлять спамеров.

exim -bp | exiqsumm -c -s | head

В выводе появится что-то типа

root@domain.ru [~]# exim -bp | exiqsumm -c -s | head
Count Volume Oldest Newest Domain
----- ------ ------ ------ ------
668 814KB 74m 66m server.ru > yahoo.com
653 788KB 3h 66m server.ru > mail.ru
68 82KB 66m 66m server.ru > list.ru

Разумеется вместо server.ru будет qualify domain (подробнее см. опцию
— f коммандной строки), или домен отправителя если шлют через SMTP.

Узнаем, что это за негодяй

exiqgrep -b -f 'server.ru' -r 'mail.ru' | awk '{print $3}' | sort | uniq -c | sort -n | tail

Самый нижний он и есть.

Хотя все это можно сделать проще и за один заход, с помощью exiqgrep

exiqgrep -b | awk '{print $3}' | sort | uniq -c | sort -n | tail

Ну и соответственно удалить всю очередь от него

exiqgrep -i -f '<spamer@server.ru.>' | xargs exim -Mrm

Хорошо бы только сначала посмотреть для пары наугад выбранных сообщений
полную информацию. Или можно такое использовать (это уже извращение,
разумеется)

MID=`exiqgrep -i -f '<spamer@server.ru.>'|tail -1`;exim -Mvl $MID; exim -Mvh $MID

Но вернемся к exiqsumm. У этой утилиты есть пара важных нюансов.
Во-первых, считает она не сами сообщения а «доставки». И если некоторые
сообщения имеют более одного получателя, то доставок будет больше чем
сообщений. Во-вторых, домены на которые доставляется письмо в
результате альясинга или форвардинга — не включаются (если не
использовалась опция «one_time» роутера «redirect» для конвертации из в
адреса «верхнего уровня»). Поэтому всегда надо смотреть логи.

exigrep — Выборка из логов

Утилита позволяющая банально «грепать» логи. От обычного грепа
отличается тем, что выдет все строки для сообщения, у которого хотя бы
в одной строке встречается паттерн. Иногда это удобно, иногда такое
количество информации может быть излишним.

Использование

exigrep [-I] [-l] [-t ] [-v] []...

— I — включает регистрозависимость
— l — отключает обработку регулярных выражений в паттерне (все символы
начинают обрабатываться «как есть»)
— t<n> — в качестве n нужно указывать количество секунд. Выводятся
только сообщения, которые провели в очереди больше чем n секунд.
— v — опция идентична grep'овской. Выводит только строки не содержащие
паттерн (вернее, строки относящиеся к сообщениям у которых ни в одной
строке нет паттерна).

Логи можно подавать на стандартный ввод или через пробел после всех
опций. Логи могут быть в архиве (вообще говоря, все это дело
определяется опциями сборки ZCAT_COMMAND и COMPRESS_SUFFIX в файле
Local/Makefile).

eximstats — Статистика на базе логов

Утилита парсит логи экзима (или syslog'а) и выводит статистический
анализ по всем содержащимся сообщениям.
Вывод может быть в трех форматах: txt, html, xls (Excel).

Использование

eximstats [Output] [Options] mainlog1 mainlog2

По умолчанию скрипт выведет статистику в STDOUT в формате txt. Например
можно сделать так

eximstats mainlog1 mainlog2 ... > report.txt

но лучше так

eximstats -txt=report.txt mainlog1 mainlog2

Вместо txt можно указать html или xls, чтобы вывод был в
соответствующем формате.

Уже готовые отчеты можно объединить в один.

eximstats -merge -html [Options] report.1.html ... > weekly_rep.html

У программы масса опций, посмотреть их можно так

eximstats -help

или так

perldoc eximstats

Если отчеты в html, то можно даже png-графики выводить.
Описывать, что получается в отчете, смысла, думаю, нет. Стоит просто
попробовать и посмотреть. Статистика очень мощная, если есть проблемы,
они винды сразу.

exim_checkaccess — проверка приема для адреса с IP

Очень простая программа для проверки Relay. Заменяет «exim -bh».
Используем так:

exim_checkaccess <IP address> <email address> [exim options]

IP — IP отправителя
email address — адрес который будет указываться в RCPT TO
Обе опции обязательные (к сожалению, я не нашел как проверить «с любого
IP»). После опций можно добавить любые опции экзима. Т.к. утилита
использует <> в качестве отправителя удобно использовать её так:
exim_checkaccess 10.9.8.7 A.User@a.domain.example -f
himself@there.example

Это не все утилиты, которые идут с exim'ом. Описал только те, которые
считаю наиболее полезными.

Остальные утилиты просто перечислю:

* exiwhat — список того, что делают процессы exim`a
* exicyclog — ротация лог-файлов
* exim_dbmbuild — сборка файла DBM
* exinext — извлечение информации повторов
* exim_dumpdb — дамп БД подсказок
* exim_tidydb — очистка БД подсказок
* exim_fixdb — правка БД подсказок
* exim_lock — блокировка файла почтового ящика (mailbox)
* eximon — показывает в X'ах информацию о состоянии очереди exim'a, и о том, что exim делает

Есть сторонние утилиты, например, exilog — обеспечивает визуализацию
логов от многих серверов exim'a.
Lire — аналог eximstats, но на самом деле это более глобальная
программа которая анализирует логи многих программ и выводит

статистику.

Ссылки
Заметка написана на основе официальной документации к Exim. В процессе
написания использовались некоторые формулировки из перевода документации
[urlspan]отсюда.[/urlspan]

[urlspan]Официальный сайт программы[/urlspan]
[urlspan]Официальная Wiki Exim'а[/urlspan]
[urlspan]Сайт VirtualExim[/urlspan]
Сайт утилиты exilog
[urlspan]сайт Lire[/urlspan]
[urlspan]FAQ по Exim MTA[/urlspan]
[urlspan]Диспут на тему Exim vs Postfix[/urlspan]
[urlspan]Virtual Domains with Exim + Courier-IMAP + MySQL[/urlspan]
[urlspan]Установка почтового сервера на базе Exim[/urlspan]

pkg install clamav

После установки проверяем наличие или добавляем строки в /etc/rc.conf:

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

Запускаем даемонов:

# /usr/local/etc/rc.d/clamav-clamd start
# /usr/local/etc/rc.d/clamav-freshclam start

Проверка работы.
Вот простейший пример файла (описано здесь http://ru.wikipedia.org/wiki/EICAR-Test-File), на который реагируют все антивирусы:

X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Это com-файл, который при запуске выводит сообщение: EICAR-STANDARD-ANTIVIRUS-TEST-FILE! Все антивирусы реагируют на это. Отключаем свой антивирус, создаем файл с таким содержанием, аттачим его на веб-почте, пишем тему, например «OLOLO» и присылаем себе на адрес, например на it@adminunix.ru. Результаты у меня следующие:

Письмо отсылалось на it@adminunix.ru, однако сработал роутер check_malware, и письмо попало на admin@firma.ru. В теле письма остались все вложения, в тему письма было внесено изменение и теперь, вместо «OLOLO» она выглядит так:

[CLAMAV: Eicar-Test-Signature] OLOLO

Итог: вся зараженная почта сыпется на админский ящик.

Смотрим логи в директории /var/log/clamav

На этой страничке расписано как настроить Exim для проверки почты антивирусом ClamAV.
 

  • Использованные версии ПО:
    # uname -sr
    FreeBSD 8.0-STABLE
    
    # pkg_info | grep clamav
    clamav-0.96.1
    
    # pkg_info | grep exim
    exim-4.71
    
  • ClamAVУстановка и настройка
  • Exim/usr/local/etc/exim/configure.default
    Ищем строку которая содержит:

    av_scanner =
    

    Раскомментируем если нужно и меняем на:

    av_scanner = clamd:/var/run/clamav/clamd.sock
    

    Раскомментируем строки:

    #  deny    malware    = *
    #  message    = This message contains a virus ($malware_name).
    

    Перезапускаем Exim

    # /usr/local/etc/rc.d/exim restart
    

    Проверка что Exim работает:

    # ps ax | grep exim
     1512  ??  S      0:00.00 /usr/local/sbin/exim -bd -q30m (exim-4.71-0)
     1513  ??  S      0:00.00 /usr/local/sbin/exim -bd -q30m (exim-4.71-0)
    46661  ??  Ss     0:07.51 /usr/local/sbin/exim -bd -q30m (exim-4.71-0)
    
    Смотрим /var/log/clamav/clamd.log на предмет отсутствия ошибок работы с ClamAV.
  • cat /var/log/clamav/clamd.log | grep FOUND

Понадобилось человеку поставить FreeBSD с ZFS на сервер, но никак не получалось. Решил попробовать сам – но фишка была в том, что сервер физически находился в Украине. Решили делать удаленно.

Грузимся с диска в Live CD , логинимся и проделываем следующее:

1) Создаем каталог и монтируем раздел /etc:
# mkdir /tmp/etc
# mount_unionfs /tmp/etc /etc

2) Разрешаем вход под root в SSH:
# sed -i.bak -e 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config

3) Запускаем SSHD:
# /etc/rc.d/sshd onestart

4) Задаем пароль для root:
# passwd root

5) И поднимаем сеть ( IP и тп изменены на самом деле было сделано тоже самое, но прописывались уже внешний IP и шлюз, так как инет был напрямую через свитч):

Задаем интерфейсу re0 IP 192.168.1.143 и маску 255.255.255.0
# ifconfig re0 inet 192.168.1.143 netmask 255.255.255.0 up

И прописываем шлюз:
# route add default 192.168.1.1

Теперь можно логиниться по SSH на адрес 192.168.1.143 и начать установку через sysinstall, или в моем случае как описано тут. Успехо

Ставим nginx
deathstar# cd /usr/ports/www/nginx
deathstar# make install clean

в /etc/rc.conf добавляем:
nginx_enable="YES"

Ставим MySQL
deathstar# cd /usr/ports/databases/mysql51-server
deathstar# make install clean

в /etc/rc.conf добавляем:
mysql_enable="YES"
Запускаем MySQL

deathstar# /usr/local/etc/rc.d/mysql-server start

Задаем пароль для root в MySQL ( в скобках сам пароль )
deathstar# mysqladmin -u root password 'password'

Ставим PHP ( отмечаем [*] FPM Build FPM version )
deathstar# cd /usr/ports/lang/php5
deathstar# make install clean

в /etc/rc.conf добавляем:
php_fpm_enable="YES"

Приводим файл /usr/local/etc/php-fpm.conf к такмоу виду:

[global]
pid = run/php-fpm.pid
error_log = /var/log/php-fpm.log
events.mechanism = kqueue
include=/usr/local/etc/php-fpm.d/*.conf

Создаем каталог,в котором будут лежать описания пулов для PHP-FPM ( кому то может пригодиться, если юзеров для сайтов больше чем один ):

deathstar# mkdir -p /usr/local/etc/php-fpm.d/ и описываем пул
deathstar# ee /usr/local/etc/php-fpm.d/www.conf

[www]
user = www
group = www
listen = /tmp/php-fpm.sock
listen.backlog = -1
pm = dynamic
pm.max_children = 2
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_value[memory_limit] = 128M

Запускаем PHP-FPM:
deathstar# /usr/local/etc/php-fpm start

Ставим Vexim (отмечаем MySQL):
deathstar# cd /usr/ports/mail/vexim/
deathstar# make install clean

Ставим модуль p5-DBD-mysql51
deathstar# cd /usr/ports/databases/p5-DBD-mysql51/
deathstar# make
deathstar# make install clean

Запускаем скрипт:
perl /usr/local/share/vexim/create_db.pl --act=newdb --dbtype=mysql -uid=110 --gid=110 --mailstore=/usr/local/mail
deathstar#
Please enter the username of the mysql superuser: root
Please enter the password of the mysql superuser:
Please enter the name of your NEW database: vexim
--------------------------------------------------
Database: vexim will be created
--------------------------------------------------
Is this correct? (Y = continue / anykey = exit ): Y

Please enter a password for the 'vexim' database user:
Confirm password:
Please enter a password for the 'siteadmin' user:
Confirm password:
The user 'siteadmin' has been added with the password
Database created successfully!

Создаем каталог с виртуальными хостами для nginx

deathstar# mkdir -p /usr/local/etc/nginx/vhosts

Приводим /usr/local/etc/nginx/nginx.conf к такому виду:

worker_processes 2;

events {
use kqueue;
worker_connections 2048;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 32M;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
reset_timedout_connection on;
server_tokens off;
gzip on;

# Закрываем обращения по IP адресу
server {
listen 80 default_server;
server_name _;
return 444;
}

# PHP-FPM
upstream php-fpm {
server unix:/tmp/php-fpm.sock;
}

# Инклюдим файлы с виртуальными хостами
include /usr/local/etc/nginx/vhosts/*;
}

Делаем виртуальный хост в nginx для Vexim

deathstar# ee /usr/local/etc/nginx/vhosts/exim.deathstar.name

server
{
listen 80;
server_name exim.deathstar.name;
access_log /var/log/nginx/exim-access.log;
error_log /var/log/nginx/exim-error.log;
root /usr/local/www/vexim;
index index.php;
charset utf-8;

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

Редактируем конфиг Vexim
deathstar# ee /usr/local/www/vexim/config/variables.php";
и вводим данные для подключения к базе данных введенные ранее.
Создаем группу и пользователя exim:
deathstar# pw groupadd vexim -g 90
deathstar# pw useradd vexim -u 90 -g vexim -d /usr/local/mail -m -s /nonexistant

Устанавливаем Exim ( отмечаем опцию SA-EXIM для работы SpamAssasin) :
deathstar# cd /usr/ports/mail/exim && make install clean
Добавляем в /etc/rc.conf:
exim_enable="YES"

Копируем и правим конфиги
deathstar# cd /usr/local/etc/exim/
deathstar# cp /usr/local/share/doc/vexim/docs/*.conf ./
deathstar# cp /usr/local/share/doc/vexim/docs/configure ./
deathstar# ee /usr/local/etc/exim/configure

Находим строку:
MY_IP = CHANGEописываем свой ip
MY_IP = 46.38.63.5/code>
Находим:
trusted_users = avleen:www
и удаляем avleen .Остается:

trusted_users = www
exim_user = mailnull
exim_group = mail
never_users = root

Находим закоментированную строку, отвечающую за подключение к MySQL серверу,раскоментируем ее и поставим там свой пароль:
hide mysql_servers = localhost::(/tmp/mysql.sock)/vexim/vexim/vexim
Раскоментируем:
AINS = SELECT DISTINCT domain FROM domains WHERE type = 'relay' AND domain = '${quote_mysql:$domain}'
ALIAS_DOMAINS = SELECT DISTINCT alias FROM domainalias WHERE alias = '${quote_mysql:$domain}'timeout_frozen_after = 2d
log_selector = +subject

Изменяем путь к антивируму ClamAV:
Находим:
av_scanner = clamd:/var/run/clamav/clamd и меняем на av_scanner = clamd:/var/run/clamav/clamd.sock

Добавляем в /etc/rc.conf
spamd_enable="YES" и запускаем
exim# /usr/local/etc/rc.d/sa-spamd start

Ставим ClamAV:
deathstar# cd /usr/ports/security/clamav && make install clean
Добавляем в /etc/rc.conf:
clamav_freshclam_enable="YES"
clamav_clamd_enable="YES"

и запускаем
deathstar# /usr/local/etc/rc.d/clamav-clamd start
Запускаем обновление баз ClamAV
deathstar# /usr/local/etc/rc.d/clamav-freshclam start

Добавялем в /etc/rc.conf
exim_enable="YES"

Устанавливаем Dovecot:
deathstar# cd /usr/ports/mail/dovecot && make install clean
Настройки хранятся в файле /usr/local/etc/dovecot.conf
Приводим конфиг к такому виду

base_dir = /var/run/dovecot/
protocols = imap pop3 imaps pop3s
protocol imap {
listen=*:143
}
protocol pop3 {
listen=*:110
}
disable_plaintext_auth = no
log_path =/var/log/dovecot
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
ssl = no
ssl_parameters_regenerate = 0
mail_location = maildir:~/Maildir
mail_privileged_group = mail
mail_debug = yes
mail_log_prefix = "%Us(%u): "
dotlock_use_excl = yes
verbose_proctitle = yes
first_valid_uid = 90
first_valid_gid = 90
maildir_copy_with_hardlinks = yes
protocol imap {
mail_executable = /usr/local/libexec/dovecot/imap
imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep
}

protocol pop3 {
mail_executable = /usr/local/libexec/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
postmaster_address = postmaster@example.com
sendmail_path = /usr/sbin/sendmail
}
auth_username_format = %Lu
auth_verbose = yes
auth_debug = yes
auth default {
ssl_require_client_cert=no
ssl_username_from_cert=no
mechanisms = plain login
passdb pam {
args = session=yes dovecot
}
passdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
userdb passwd {
args = blocking=yes
}
userdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
}
client {
path = /var/run/dovecot/auth-client
mode = 0660
}
}
}
dict {
}
plugin {
}

Настраиваем подключение к MySQL в файле dovecot-sql.conf

deathstar# ee /usr/local/etc/dovecot-sql.conf

driver = mysql
connect = host=/tmp/mysql.sock user=vexim password=PASSWORD dbname=vexim
default_pass_scheme = MD5-CRYPT
password_query = SELECT crypt as `password` FROM users,domains WHERE users.username = '%u' AND users.enabled = '1' AND users.type = 'local' and domains.enabled = '1' and domains.domain_id = users.domain_id
user_query = SELECT pop as home, uid, gid FROM users WHERE username = '%u'

Добавляем запись в /etc/rc.conf:
dovecot_enable="YES"
Запускаем Dovecot:

deathstar# /usr/local/etc/rc.d/dovecot start

Ставим RoundCube (выбираем MySQL):

#deathstar cd /usr/ports/mail/roundcube/
deathstar# make install clean

И далее команды по порядку:

deathstar#cd /usr/local/www/roundcube
deathstar# chmod 777 logs/
deathstar# chmod 777 temp/

Создаем базу

deathstar# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
mysql> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

</code>
<code>deathstar# cd /usr/local/www/roundcube/
deathstar# mysql -p roundcubemail < SQL/mysql.initial.sql

deathstar# cp config/db.inc.php.dist config/db.inc.php
deathstar# ee config/db.inc.php

Правим конфигурационный файл /usr/local/www/roundcube/config/db.inc.php,
отвечающий за соединение с базой данных:
$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';

Правим файл main.inc.php, содержащий основные настройки:
deathstar# ee config/main.inc.php

$rcmail_config['default_host'] = 'localhost'; #хост, на котором находится почта
$rcmail_config['username_domain'] = ' mydomain.ru'; #домен, который будет автоматически добавляться к имени пользователя
$rcmail_config['mail_domain'] = 'mydomain.ru'; #почтовый домен
$rcmail_config['default_port'] = 143; #порт imap
$rcmail_config['imap_auth_type'] = null; #тип авторизации imap
$rcmail_config['smtp_server'] = 'localhost'; #сервер smtp
$rcmail_config['smtp_user'] = '%u';
$rcmail_config['smtp_pass'] = '%p';
$rcmail_config['smtp_auth_type'] = 'CRAM-MD5'; #тип авторизации smtp
$rcmail_config['create_default_folders'] = TRUE; #при первом логине юзера создаются дефолтные почтовые папки (Входящие, Исходящие, Корзина и тд.)
$rcmail_config['language'] = ru_RU; #локализация

И добавляем виртуальный хост в nginx для Roundcube

deathstar# ee /usr/local/etc/nginx/vhosts/mail.deathstar.name

server
{
listen 80;
server_name mail.deathstar.name;
access_log /var/log/nginx/mail-access.log;
error_log /var/log/nginx/mail-error.log;
root /usr/local/www/roundcube;
index index.php;
charset utf-8;

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

Перезапускаем PHP-FPM и NGINX

deathstar# /usr/local/etc/rc.d/nginx restart && usr/local/etc/rc.d/php-fpm restart

Теперь Roundcube доступен по адресу http://mail.deathstar.name а Vexim по http://exim.deathstar.name

Заходим по адресу http://exim.deathstar.name
Логинимся под siteadmin и пароль, что выставляли ранее
Жмем Add local domain
Прописываем домен, имя администратора ( по умолчанию postmaster, можно сменить на любое , так же создастся ящик вида postmaster@domain, а создадим например admin )
прописываем пароль ( например pass )
повторяем пароль
отмечаем антиспам и антивирус ( по желанию ) и жмем Submit

У нас появился почтовый аккаунт admin@domain с паролем pass

Чтоб для созданного домена создать еще ящик, логинимся под логином админа домена, в нашем случае – admin

Жмем Add, delete and manage POP/IMAP accounts
Потом Add User
Прописываем имя ( любое, оно просто для отображения в списке юзеров )
логин ( например user )
два раза пароль ( например userpass )
Has domain admin privileges? – отмечаем, есди хотим сделать юзера тоже админом домена
И жмем Submit.
У нас появился почтовый аккаунт user@domain с паролем userpass

Теперь можно зайти в roundcube по ссылке http://mail.deathstar.name под логином user@domain и паролем userpass

pkg install SPAMASSASIN
обноляет базу SpamAssassin

sa-update

и стартуем

/usr/local/etc/rc.d/sa-spamd start

 

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

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Если оно не пришло а в логах есть сообщение о блокировке то все работает

 

Для обучения спам фильтра  можно воспользоваться командами

sa_learn --spam <путь к спамным письмам в формате .msg>
sa_learn --ham <путь к чистым письмам в формате .msg>