@ Карта сайта News Автора!

Bog BOS: exim - почтовый сервер (MTA) для борьбы со спамом

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

Последнее изменение файла: 2016.02.26
Скопировано с www.bog.pp.ru: 2024.04.16

Bog BOS: exim - почтовый сервер (MTA) для борьбы со спамом

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

exim является одним из немногих открытых (лицензия GNU) и активно развиваемых MTA (версия 4.71 от 23 ноября 2009, был пропуск в 2008). Основное внимание при разработке уделялось борьбе со спамерами. Устанавливается и настраивается значительно проще, чем sendmail. Недостатки: отсутствие конвертации 7-bit/8-bit; отсутствие DSN; неадекватная обработка "double error"; адреса только в формате RFC2822 (адресов в формате UUCP нет, но UUCP транспорт прикрутить возможно, поддержка batched SMTP есть); внешний транспорт - только SMTP (локально в файл или pipe, LMTP); компьютер д.б. постоянно подключён к Интернет; очередь нельзя использовать для хранения и извлечения сообщений в стиле ETRN. Лучше всего подходит в качестве "привратника", фильтрующего входную почту и направляющего остатки более гибко настраиваемому sendmail. Разработка ведется под Solaris, так что настройка расположения файлов отличается от той, что принята в Linux (/var/mail вместо /var/spool/mail и т.д.).

Слова "отправитель" и "получатель" в тексте статьи означают адреса отправителя и получателя соответственно, взятые из конверта письма, и не имеют никакого отношения к полям заголовка письма. Слова "письмо" и "сообщение" используются как синонимы.

Путь письма

Письмо может быть получено (при установлении соединения может производиться аутентификация клиента):

Пользователь может установить свои дополнительный фильтры (в файле ~/.forward, маршрутизатор redirect) в стандартном формате Sieve (RFC 3028) или собственном формате exim.

Адрес отправителя в локальных режимах (не SMTP), конструируется из имени пользователя и содержимого переменной qualify_domain (команда MAIL в интерактивной эмуляции SMTP игнорируется). Если переменная не установлена, то используется primary_hostname.

После успешного приема письма производится преобразование адресов (address rewriting) для всех адресов в конверте и заголовках. Если в процессе отправки порождаются новые адреса (например, с помощью механизма aliasing), то их преобразование производится немедленно после порождения. Затем в спуле (поддиректория input) создаются 2 файла: первый содержит конверт, текущее состояние сообщения и заголовки (имя состоит из идентификатора сообщения и суффикса "-H"); второй содержит тело письма (имя состоит из идентификатора сообщения и суффикса "-D"). Для обработки аварийных ситуации (неожиданная перезагрузка) используется файл, имя которого состоит из идентификатора сообщения и суффикса "-J". В нормальных условиях он живет недолго.

Письмо будет храниться в спуле до тех пор, пока оно не будет разослано всем получателям или отчет об ошибках не будет отослан отправителю. Если письмо не может быть отправлено получателю, а отчет об ошибке - отправителю, то оно помечается как "замороженное". Администратор может его "оттаять" (или заморозить любое письмо вручную). Имеются опции автоматического оттаивания через определённое время и автоматического удаления. При оттаивании делается последняя попытка отправить отчёт, при неудаче он просто удаляется. Администратор может спровоцировать ошибку доставки любого письма в спуле вручную. Иногда, спул называют очередью, но exim не соблюдает очередности обработки, так что это не очередь, а куча. При каждой попытке отправки письма в спуле (в поддиректории msglog) добавляется запись к журналу обработки сообщения (имя файла совпадает с идентификатором сообщения). Файл удаляется при отправке письма всем получателям или отправке всех отчетов об ошибках. Эту запись можно отключить на перегруженном сервере. Аналогичная запись делается в основном журнале.

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

При отправке письма каждый адрес получателя по очереди предъявляется каждому сконфигурированному маршрутизатору, если выполняются установленные предварительные условия (preconditions), пока один из них не признает адрес за "свой".

Получив адрес, маршрутизатор может:

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

Транспорт передает копию сообщения из спула в файл или канал (локальный транспорт) или на удаленный хост по протоколу SMTP (LMTP). Используемый транспорт и его параметры (например, имя хоста) определяются маршрутизатором. Транспорт может потребовать дополнительного преобразования адресов и добавления или удаления полей заголовка в момент отправки. Локальный транспорт выполняет доставку для каждого адреса по очереди, порождая отдельный процесс с непривилегированными правами. Удаленный транспорт доставляет сообщения по каждому адресу отдельно, порождая процессы под uid exim, но выполняя их параллельно. При установлении соединения exim может аутентифицировать себя как клиент.

Отправка письма по отдельному адресу может быть отложена в маршрутизаторе (например, таймаут DNS) или транспорте, причем как в удаленном (нет связи с удаленным хостом), так и в локальном (переполнен почтовый ящик). Для повторной попытки отправить письмо требуется запустить exim с ключом -q или запускать регулярную обработку очереди с помощью cron, иначе письмо останется в очереди навечно. Одновременно может быть запущено несколько обработчиков очереди. Обработка очереди происходит последовательно письмо за письмом. В конфигурационном файле должны быть заданы правила, определяющие для сочетания хост/адрес/тип-ошибки интервал повторения попыток и максимальное время нахождения в очереди. Если письмо не попадет ни под одно правило, то временная ошибка обрабатывается как постоянная. При истечении максимального времени нахождения в очереди, генерируется сообщение об ошибке. После успешной повторной попытки удалённой доставки сервер проверяет в своей БД не ждали ли другие письма отправки на этот же хост и отправляет их в том же соединении.

Сгенерированное сообщение об ошибке обрабатывается как обычное письмо. Одно исходное письмо может приводить к генерации нескольких сообщений об ошибке, если оно имеет нескольких получателей и условия ошибки для различных получателей появляются неодновременно. Текст сообщения об ошибке можно настраивать. В любом случае, оно содержит поле заголовка X-Failed-Recipients:, содержащее список неудачных адресов. Обычно сообщение об ошибке посылается отправителю (задается командой MAIL протокола SMTP), но для сгенерированных адресов может указываться альтернативный адрес для сообщений об ошибках.

Настройка

Все настройки хранятся в одном файле (по умолчанию - /usr/exim/configure). Права доступа к файлу должны быть ограничены (root:exim, 0640).

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

Разрешается включение другого файла (глубина вложения неограничена) с помощью команды ".include имя-файла". Имя файла может быть заключено в кавычки. Команда .include может использоваться в середине строки и выполняется до макроподстановок.

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

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

Если строка в общей секции начинается с прописной буквы, то она воспринимается как определение макро в форме: имя = значение. Имя может содержать буквы, цифры и подчеркивания. Начальные и конечные пробелы удаляются из значения. Все последующие строки файла сканируются на вхождение имени макро и заменяются его значением. Заметьте, что никаких специальных символов, выделяющих вхождение имени макро не используется! После подстановки получившийся текст сканируется на вхождение имени следующего макро и т.д..

Общая секция и секции драйверов (аутентификаторы, маршрутизаторы и транспорты) имеют одинаковый синтаксис. Каждая опция записывается на отдельной строке. Имя опции содержит строчные буквы и подчеркивания. Опция может иметь значение, которое записывается после знака равенства (пробелы вокруг знака равенства удаляются). Перед именем может стоять слово hide, что позволяет скрыть значение от раскрытия с помощью exim -bP.

Значение логических опций (true, false, yes, no) может быть задана без использования формы имя=значение. Достаточно указать имя опции, чтобы включить ее, или имя опции, перед которым стоит приставка "no_" или "not_", чтобы выключить.

Целое число может трактоваться как шестнадцатеричное, если начинается с "0x", как восьмеричное, если начинается с нуля, или десятичное. Если за числом стоит буква K, то оно умножается на 1024, если за числом стоит буква M, то - на 1024*1024. Некоторые опции определяются как восьмеричные числа, их значения воспринимаются как восьмеричные независимо от наличия нуля в начале числа.

Временной интервал записывается как последовательность чисел, за каждым из которых записывается буква, обозначающая единицу измерения (без пробелов): s, m, h, d, w. Например: 3h50m.

Строки могут заключаться в кавычки. Обратная косая черта позволяет задавать специальные символы: \n, \r, \t, \\, \020, \xFF.

Некоторые опции задаются как список объектов. Весь список рассматривается как строка, объекты в списке разделяются двоеточиями. Если объект содержит двоеточие, то оно представляется двумя двоеточиями. Пробелы вокруг разделителей удаляются. Разделитель можно заменить на любой символ, если строку начать со знака меньше и этого символа. Перед использованием списка он вычисляется, как и любая другая строка. Каждый объект в списке представляет собой шаблон, с которым сравнивается имя домена, имя хоста, адрес или локальная часть адреса. Если вычисление строки завершается аварийно, то exim считает, что имя в список не входит. Специальные символы в шаблоне должны быть защищены от их интерпретации при вычислении строки. Шаблоны могут быть позитивными и негативными (начинаются с !). Совпадение имени с негативным шаблоном означает, что имя отсутствует в списке. Если ни один шаблон не подошел, но последним в списке был негативный шаблон, то считается, что имя в списке (как будто в конец списка добавили шаблон *). В качестве шаблона можно использовать абсолютное имя файла: каждая строка файла интерпретируется как шаблон (строка не может содержать ссылку на другой файл; пустые строки игнорируются; комментарии начинаются с #). Файл читается заново при каждой обработке списка. Если перед именем файла стоит восклицательный знак, то значения шаблонов в нем инвертируется. В дополнение к явному заданию шаблона можно указывать запросы на поиск в файле или БД (объекты в файле или БД являются константами, не шаблонами!).

Синтаксис регулярных выражений, используемых в некоторых опциях, соответствует регулярным выражениям языка perl. Точнее говоря, используется библиотека PCRE (см. doc/pcre.txt).

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

Поиск в БД и файлах

exim ищет данные в файлах или БД в следующих случаях (синтаксис определяется случаем):

Некоторые поисковые механизмы возвращают сообщение о временной недоступности. Если это происходит в маршрутизаторе или транспорте, то доставка сообщения задерживается.

Типы поисковых механизмов (делятся на 2 класса - по ключу и по запросу):

Механизмы поиска по ключу (cdb, dbm, dbmnz, dsearch, lsearch, nis) позволяют задать задавать значение по умолчанию:

Результаты поиска кешируются. Последствия непредсказуемы.

При подстановке параметров в запросы (mysql и др.), значение параметра может оказаться несовместимым с языком запросов. Имеются операторы для преобразования параметров в безопасный вид: ${quote_mysql:строка}.

Списки доменов, хостов, адресов и локальных частей

Поименованный список доменов определяется строкой:
domainlist имя-списка = список

Аналогично создаются hostlist, addresslist и localpartlist.

Для того, чтобы использовать поименованный список, надо указать его имя и поставить перед ним знак +. Для отрицания списка надо перед плюсом написать строку "! ". Поименованный список может быть использован для создания другого поименованного списка (вложенность не ограничена). В то время как макросы являются средством чисто текстовой подстановки, поименованные списки вычисляются (например, можно сделать отрицание списка поставив перед ним восклицательный знак, в то время как поставив восклицательный знак перед макросом мы придадим отрицание только первому элементу списка).

Результаты проверки вхождения элемента в поименованный список кешируются, что ускоряет обработку (только если exim уверен, что список постоянен).

Список доменов может содержать:

Список хостов может содержать (шаблоны с адресами лучше ставить перед шаблонами с именами):

Список адресов может содержать:

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

Вычисление строк

Перед использованием каждая строка вычисляется. Вычисление состоит в интерпретации команд, задаваемых с использованием символа $, и маскировании специальных символов с помощью обратной косой черты перед ними. Если строка заключена в кавычки, то обратную косую черту необходимо удвоить, т.к. при обработке кавычек одна обратная косая черта будет удалена. При необходимости заблокировать вычисление длинной строки, ее можно заключить в скобки, состоящие из "\N". Не надо забывать, что обратная косая черта имеет специальное значение в уже вычисленных строках (\n, \t, \r, \020, \xFF) и как признак строки продолжения.

Обрабатываемые команды:

Операции:

Условия в команде if:

Переменные:

Общие опции

Сокращенный список опций (тип, значение по умолчанию, пояснения):

Предварительные условия для маршрутизаторов

Очередность проверки условий перед выбором маршрутизатора:

  1. local_part_prefix (локальная часть адреса имеет указанный префикс, который немедленно удаляется)
  2. local_part_suffix (локальная часть адреса имеет указанный суффикс, который немедленно удаляется)
  3. verify (verify_sender, verify_recipient) и verify_only (маршрутизатор может быть предназначен только для верификации адреса или только для реальной отправки письма или для обоих действий)
  4. address_test (пропустить маршрутизатор, если exim запущен в режиме тестирования адресов: -bt)
  5. expn (маршрутизатор может быть запрещено использовать при обработке команды EXPN)
  6. domains (доменная часть адреса входит в указанный список доменов)
  7. local_parts (локальная часть адреса входит в указанный список)
  8. check_local_user (локальная часть адреса должна соответствовать учетной записи пользователя на хосте)
  9. router_home_directory (?)
  10. senders (адрес отправителя должен быть в указанном списке)
  11. require_files (проверяется наличие или отсутствие указанного файла)
  12. condition (вычисляется условное выражение)

Маршрутизаторы

Общие опции маршрутизаторов (тип; значение по умолчанию; описание):

Маршрутизатор accept. При выполнении предусловий принимает письмо к обработке и ставит в очередь к указанному транспорту. Дополнительных опций не имеет.

Маршрутизатор dnslookup. Транспорт и хост определяются по DNS. Сначала проверяются MX записи. Если MX запись не обнаружена и домен не указан в опции mx_domain, то просматриваются адресные записи. MX записи с одинаковым приоритетом сортируются случайным образом. Из получившегося списка удаляются ссылки на локальный хост и хосты из списка hosts_treat_as_local (и все хосты с равным и более низким приоритетом), если только они не имеют максимальный приоритет (смотри опцию self). Дополнительные опции:

Маршрутизатор ipliteral. Не рекомендуется использовать.

Маршрутизатор iplookup. Используется только разработчиками exim.

Маршрутизатор manualroute. Транспорт и хост определяются шаблонами в обход системы DNS и MX.

Маршрутизатор queryprogram. Транспорт и хост вычисляются внешней программой.

Маршрутизатор redirect.

Транспорты

Опции, применимые для всех транспортов:

Транспорт smtp. В момент запуска $host и $host_address есть имя и адрес первого хоста в списке, переданном маршрутизатором. Перед соединением с конкретным хостом и во время соединения в них помещается имя и адрес этого хоста. Опции:

appendfile, autoreply, pipe, lmtp.

ACL

ACL вызываются общими опциями acl_smtp_auth, acl_smtp_data, acl_smtp_etrn, acl_smtp_expn, acl_smtp_rcpt, acl_smtp_vrfy. Если acl_smtp_auth не определена, то команда AUTH всегда разрешается. Если acl_smtp_data не определена, то проверок после получения сообщения не производится. Если не определена acl_smtp_etrn, acl_smtp_expn, acl_smtp_rcpt или acl_smtp_vrfy, то соответствующая команда не принимается. В опциях вместо имени ACL может быть указано абсолютное имя файла, в котором должен лежать ACL. Строка опции вычисляется перед использованием, что позволяет динамически задавать имя ACL или имя файла. Если вычисленная строка не начинается с косой черты и ACL с таким именем не найдена, то строка интерпретируется как встроенный ACL.

Результатом проверки ACL может быть accept (принято, код SMTP - 2xx), deny (не принято, 5xx), defer (временный сбой, 4xx), error (ошибка синтаксиса, 4xx).

При обработке ACL для DATA доступна информация об удаленном хосте и отправителе ($sender_host_address, $sender_address). При обработке ACL для RCPT доступна информация об удаленном хосте и отправителе, а также информация о получателе ($domain, $local_part). При обработке ACL для других команд их аргументы доступны в $smtp_command_argument.

Секция ACL начинается со строки "begin acl" и завершается перед следующей секцией (слово "begin" в начале строки). Каждый поименованный ACL начинается со строки, состоящей из его имени и двоеточия. Завершается ACL началом следующего ACL или следующей секции. В конце ACL подразумевается безусловная команда deny. Каждая строка содержит команду, начинающуюся с действия, за которым могут следовать условия и/или модификаторы (каждое на отдельной строке). Если начало строки не содержит действия (например, пробел), то она содержит условие или модификатор для предыдущей команды. Отрицание условия обозначается восклицательным знаком перед ним. Аргументы условий и модификаторов вычисляются (forced fail при вычислении интерпретируется как удовлетворение условия). Действие выполняется, если удовлетворены все условия или их нет (см. исключения).

Действия:

Модификаторы:

Условия:

Верификация header_sender, recipient, sender. Сначала адрес маршрутизируется в режиме верификации. Опции:

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

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

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

Время повторения - это намек, а не обещание ;). Никто не гарантирует, что повторная доставка будет сделана именно в это время. Время повторной доставки зависит от интервала обработки очереди или прихода новых писем, направляемых в тот же домен.

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

Драйверы аутентификации (аутентификаторы)

Аутентификаторы позволяют реализовать расширения SMTP протокола (RFC 2554), касающиеся аутентификации клиента с помощью метапротокола SASL (EHLO/AUTH). Необходимые типы аутентификаторов должны быть заданы при сборке. Порядок описания аутентификаторов важен. Возможные типы аутентификаторов:

exim может выступать с точки зрения аутентификации как в роли сервера, так и в роли клиента (реализовано неполностью). Драйвер аутентификации может использоваться в обоих случаях. Имена опций можно предварять префиксами "server_" или "client_", чтобы определить роль сервера, при которой они используются. После аутентификации клиента exim заполняет переменные $received_protocol ("esmtpa") и $sender_host_authenticated (имя драйвера). Необходимость аутентификации в роли клиента определяется опциями транспорта (hosts_require_auth, hosts_try_auth) и анонсированными механизмами аутентификации сервера. При этом можно использовать переменные $host и $host_address.

Общие опции (заголовок секции начинается с имени драйвера и двоеточия):

Опции драйвера типа plaintext

Механизм PLAIN определяет в качестве приглашения пустую строку, имя пользователя во второй строке ответа, пароль - в третьей:

plain_server:
    driver = plaintext
    public_name = PLAIN
    server_prompts = :
    server_condition = \
      ${if and {{eq{$2}{username}}{eq{$3}{mysecret}}}{yes}{no}}
    server_set_id = $2
plain_client:
    driver = plaintext
    public_name = PLAIN
    client_send = ^username^mysecret

Механизм LOGIN определяет в качестве приглашения две строки с запросом имени и пароля, имя пользователя в первой строке ответа, пароль - во второй, например (использованы приглашения, "любимые" MS OE):

login_server:
    driver = plaintext
    public_name = LOGIN
    server_prompts = Username:: : Password::
    server_condition = \
      ${if and {{eq{$1}{username}}{eq{$2}{mysecret}}}{yes}{no}}
    server_set_id = $1
login_client:
    driver = plaintext
    public_name = LOGIN
    client_send = : username : mysecret

Опции драйвера типа cram_md5:

Опции драйвера типа cyrus_sasl (необходимо обеспечить права доступа exim к файлам, требуемым Cyrus SASL; реализована только роль сервера!):

Опции драйвера типа spa (public_name = NTLM):

TLS/SSL

Поддержку TLS (SSL) необходимо включить явно при сборке. Требуется наличие OpenSSL или GnuTLS (версия 1.0 или выше). При этом необходимо заранее заготовить незашифрованный ключ (exim:exim, 400) и сертификат сервера, подпись сертификата.

Системные переменные:

Опции конфигурации:

Транспорт типа smtp имеет опции:

ACL для проверки команды STARTTLS задаётся опцией acl_smtp_starttls.

Следующее условие ACL требует наличия верифицированного сертификата клиента (tls_verify_hosts, tls_try_verify_hosts):

verify = certificate

Имеются следующие селекторы журнала:

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

Ключи командной строки:

Обработка сигналов:

Прием локальной почты

Ключи командной строки:

Обработка очереди

Запуск exim с ключом -bp выводит содержимое очереди. В качестве параметра может быть указан идентификатор сообщения. Выводится время нахождения в очереди, размер сообщения, локальный идентификатор сообщения, адрес отправителя. Для замороженного сообщения выдается пометка "*** frozen ***". В последующих строках выводятся адреса получателей. Адреса, по которым сообщение уже отправлено, помечаются буквой D.

Если exim выполняется под именем mailq, то он работает, как если бы exim запускался с ключом -bp.

Ключ -bpa действует аналогично -bp, но дополнительно показывает сгенерированные адреса.

Ключ -bpu действует аналогично -bp, но показываются только те адреса получателей, которым письмо еще не отправлено.

Ключ -bpc выводит общее число сообщений в очереди.

При запуске exim с ключом -M идентификатор-сообщения ... он пытается отправить указанное сообщение из очереди. Замороженное сообщение предварительно размораживается. Игнорируются все ограничения на повтор отправки.

Ключ -Mar идентификатор-сообщения адрес ... добавляет список получателей к сообщению в очереди.

Ключ -Mes идентификатор-сообщения адрес изменяет адрес отправителя указанного сообщения в очереди.

Ключ -Mf идентификатор-сообщения ... замораживает сообщение.

Ключ -Mg идентификатор-сообщения ... прекращает дальнейшие попытки послать сообщение. В тексте посылаемого в результате сообщения об ошибке доставки будет сказано: "cancelled by administrator".

Ключ -Mmad идентификатор-сообщения ... делает пометку о доставке для всех адресов получателей.

Ключ -Mmd идентификатор-сообщения адрес ... делает пометку о доставке для указанных адресов получателей.

Ключ -Mrm идентификатор-сообщения ... молча удаляет сообщение из очереди.

Ключ -Mt идентификатор-сообщения ... размораживает сообщение.

Ключ -q сканирует очередь и пытается отправить все найденные сообщения по одному разу. Дожидается завершения отправки предыдущего сообщения перед обработкой следующего. Некоторые сообщения могут быть пропущены в соответствии с установленными правилами повтора посылки. Порядок обработки сообщений неопределен.

Ключ -qq. Обработка очереди в два прохода: при первом проходе производится маршрутизация адресов и отправка локальной почты. На втором проходе отправляется удаленная почта. Это позволяет пакетизировать сообщения и особенно полезно для сервера, подключенного к Интернет не в постоянном режиме..

Ключ -q[q]i. Обрабатывать только те сообщения в очереди, для которых еще не было попыток отправки.

Ключ -q[q][i]f. Обрабатывать сообщения, не обращая внимания на правила повтора.

Ключ -q[q][i]ff. Обрабатывать сообщения, не обращая внимания на правила повтора и "замороженность".

Ключ -qинтервал. Обрабатывать очередь многократно с указанным интервалом. Перед интервалом могут быть указаны флаги q,i,f. Обычно комбинируется с ключом -bd, например: exim -bd -q30m для одновременного приема сообщений по SMTP и обработки очереди с инервалом в 30 минут.

Ключ -R[флаги] строка. Однократная обработка тех сообщений в очереди, необслуженные адреса получателей которых содержат указанную строку (независимо от регистра). Если сообщение выбрано, то обрабатываются все его необслуженные адреса. Дополнительные условия на успешность отправки по первому выбранному адресу столь туманны, что пользоваться этим не хочется. Используется для реализации ETRN. Флаги могут быть: f, ff, r, rf, rff. f означает обработку сообщений, не обращая внимания на правила повтора. ff означает обработку сообщений, не обращая внимания на правила повтора и состояние "замороженности". Если используется флаг r, то строка рассматривается как регулярное выражение.

Ключ -S[флаги] строка. Аналогично ключу -R, но сравнение строки производится с адресами отправителей, а не получателей. Если используется одновременно с ключом -R, то оба условия должны быть выполнены для отбора сообщения в обработку.

Если exim выполняется под именем runq, то он работает, как если бы exim запускался с ключом -q.

Aliases

Если exim выполняется под именем newaliases, то он работает, как если бы он выполнялся с опцией -bi. Мимикрия под поведение sendmail, который в данном режиме перестраивает базу данных алиасов. Так как exim не имеет единого файла алиасов, то требуемое действие задается опцией bi_command в конфигурационном файле (например, перестройка требуемых баз данных с помощью exim_dbmbuild).

Отладка

Добавление ключа -dкатегория при вызове exim позволяет вывести отладочную информацию на stderr. Категория представляет собой строку имен, перед каждым из которых стоит знак плюс или минус, например: -all+filter. Имена: acl, auth, deliver, dns, dnsbl (black list), exec, filter, hints_lookup, host_lookup, ident, interface, lists, load, lookup, memory, process_info, queue_run, receive, resolver, retry, rewrite, route, tls, transport, uid, verify, all. По умолчанию: +all-filter-interface-load-memory-resolver.

Отладочные ключи командной строки:

Установка exim 4.63 на CentOS 5.4 из пакетов (клиентский сервер, x86-64)

Принимает почту от сервера верхнего уровня (там же стоит антиспам и антивирус) и локальных клиентов, раздаёт по локальным POP/IMAP серверам (LMTP, cyrus-imap) и наверх. Локальных ящиков не имеет. Доступа в Интернет здесь нет.

  1. установить пакет exim
  2. настройка /etc/exim/exim.conf
  3. тестируем работоспособность: /usr/sbin/exim -bV
  4. тестируем маршрутизацию (по всем направлениям!): /usr/sbin/exim -bt адрес
  5. открыть сетевые экраны к LMTP для IMAP серверов
  6. тестируем отправку почты по LMTP к IMAP серверам: /usr/sbin/exim -v адрес (надо ввести поля From:, To:, Subject:, пустую строку, тело письма, ^D)
  7. открыть сетевые экраны к внутренним и внешним SMTP серверам
  8. тестируем отправку почты по SMTP: /usr/exim/bin/exim -v адрес (надо ввести поля From:, To:, Subject:, пустую строку, тело письма, ^D)
  9. установить пакет system-switch-mail
  10. запустить system-switch-mail-nox и сделать exim MTA по умолчанию
  11. проверка приёма почты снаружи
  12. адаптация остальных частей почтовой инфраструктуры, закрытие сетевых экранов и т.д.

Установка exim 4.67/4.68 на CentOS 4.5/CentOS 5.0 (входной сервер, x86-64)

Принимает почту из внешнего мира, фильтрует от спама и вирусов, раздает на внутренние серверы по SMTP. Есть вариант с использованием MySQL для определения маршрута почты и использованием LMTP для cyrus-imap. Локальных ящиков не имеет. Принимает почту изнутри по SMTP для рассылки наружу. Находится внутри DMZ, так что входящие соединения пробрасываются на входном сетевом экране с помощью DNAT, а исходящие - SNAT. Антиспам и антивирус (clamav).

  1. создать группу exim (себя в неё) и пользователя exim по аналогии с mail
  2. распаковать дистрибутив
  3. exim может использовать различные библиотеки DBM, но лучше если это будет Berkeley BD 4 без режима эмуляции ndbm (USE_DB в OS/Makefile-Linux) во избежание путаницы с неверной версией ndbm.h, к тому же она использует один файл на базу данных
  4. скопировать src/EDITME в Local/Makefile и отредактировать его:
  5. на всякий случай просмотреть
  6. make
  7. make install (если была старая версия, то конфигурация не замещается, старые версии утилит переименовываются; в общем, лучше посмотреть, что получилось)
  8. настройка /usr/exim/configure
  9. тестируем работоспособность: /usr/exim/bin/exim -bV
  10. открыть сетевые экраны к MySQL серверу
  11. тестируем маршрутизацию (по всем направлениям!): /usr/exim/bin/exim -bt адрес
  12. открыть сетевые экраны к LMTP для IMAP серверов
  13. тестируем отправку почты по LMTP к IMAP серверам: /usr/exim/bin/exim -v адрес (надо ввести поля From:, To:, Subject:, пустую строку, тело письма, ^D)
  14. открыть сетевые экраны к внутренним и внешним SMTP серверам
  15. тестируем отправку почты по SMTP: /usr/exim/bin/exim -v адрес (надо ввести поля From:, To:, Subject:, пустую строку, тело письма, ^D)
  16. обеспечение автоматического запуска (или позаимствовать из готового пакета и использовать стандартные механизмы chkconfig и service):
  17. остановить sendmail (service, chkconfig)
  18. запустить exim (service, chkconfig)
  19. проброс тестового порта 10025 на входном сетевом экране на этот сервер порт 25
  20. проверка приёма почты снаружи
  21. смена пробрасываемого порта на нормальный 25 и останов старого почтового сервера
  22. адаптация остальных частей почтовой инфраструктуры, закрытие сетевых экранов и т.д.

Установка exim 4.50 на Red Hat Linux 9 как входного сервера

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

  1. создать группу exim (себя в неё) и пользователя exim по аналогии с mail
  2. распаковать дистрибутив
  3. exim может использовать различные библиотеки DBM, но лучше если это будет Berkeley BD 4 без режима эмуляции ndbm (USE_DB в OS/Makefile-Linux) во избежание путаницы с неверной версией ndbm.h, к тому же она использует один файл на базу данных
  4. скопировать src/EDITME в Local/Makefile и отредактировать его:
  5. на всякий случай просмотреть
  6. make
  7. make install (если была старая версия, то конфигурация не замещается, старые версии утилит переименовываются; в общем, лучше посмотреть, что получилось)
  8. настройка /usr/exim/configure для прозрачной передачи полученной почты sendmail-у
  9. тестируем работоспособность: /usr/exim/bin/exim -bV
  10. тестируем маршрутизацию: /usr/exim/bin/exim -bt адрес
  11. тестируем отправку почты по SMTP: /usr/exim/bin/exim -v адрес (надо ввести поля From:, To:, Subject:, пустую строку, тело письма, ^D)
  12. обеспечение автоматического запуска:
  13. отредактировать нстройки tcp_wrapper (/etc/hosts.allow и /etc/hosts.deny; имя сервиса - exim)
  14. дырка в ipchains
  15. дырка в IOS ACL внешнем
  16. дырка в IOS ACL для клиентов
  17. замена DNS MX
  18. подождать 3 дня и закрыть старый сервер

Ссылки

@ Карта сайта News Автора!

Bog BOS: exim - почтовый сервер (MTA) для борьбы со спамом

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru