Почтовый сервер Exim: «Я не Sendmail, я иной»

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

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

Сначала — совсем немного теории для тех, кто что-то пропустил. Общая схема почтового сервера выглядит примерно так:

В этой схеме приняты такие общепринятые обозначения:

* MUA, Mail User Agent,- клиентская программа, установленная на компьютере пользователя, с ее помощью пользователь создает и читает почту;
* MTA, Mail Transport Agent,- основная программа доставки почты, передающая почту от клиента на удаленный компьютер. В случае выделенного подключения для этого используется протокол SMTP, но можно также задействовать другие методы доставки, например UUCP;
* DA, Delivery Agent. После получения почты MTA иногда не желает самостоятельно раскладывать почту по ящикам, обрабатывать списки рассылки, передавать почту в программные каналы или файлы. Для таких операций может быть вызван специальный компонент — Delivery Agent;
* AA, Access Agent. В исконном виде задача MTA — доставить почту в почтовые ящики, расположенные в пользовательских каталогах. Но пользователь зачастую желает достать почту из своего каталога (или из хранилища, если DA доставляет ее в хранилище) на сервере. В таком случае необходим Access Agent — программа, которая оперирует почтой уже после того, как она была доставлена в почтовые ящики, но должна быть снова извлечена и переправлена еще куда-то.

С точки зрения Exim все операции доставки делятся на две категории — директоры и маршрутизаторы.

Директор (от direct — прямой, непосредственный) — это тип пересылки, который может быть выполнен локально без привлечения других компьютеров. К таким пересылкам относятся: рассылка писем локальным пользователям в их частные каталоги, запись почтового потока в указанный файл или направление в канал для обработки отдельной программой.

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

Конфигурация Exim производится через один простой (то есть предназначенный для восприятия человеком) текстовый файл /etc/exim.conf. Впрочем, он не совсем прост: в момент загрузки конфигурации он может пройти стадию препроцессинга, в результате чего в конфигурацию могут быть подставлены макросы, зарезервированные переменные и вычисленные значения. К этому мы еще вернемся в свое время.

Обращаю ваше внимание: в целях совместимости Exim поддерживает многие опции и комманды Sendmail, для чего устанавливает на себя символические ссылки, так что:

/usr/sbin/sendmail -> exim

Но это не значит, что нужно делать:

kill -HUP `pidof sendmail`

а только:

kill -HUP `pidof exim`.

Все параметры в файле конфигурации делятся на семь категорий:

* общие параметры;
* описание транспортов — то есть методов доставки;
* описание директоров — доставка по адресам, которые были квалифицированы как локальные;
* описание для маршрутизаторов, доставка для «всех, кроме локальных» адресов;
* описание возврата для почты, которая не может быть доставлена;
* правила коррекции адресов для подстановки адресов при пересылке;
* параметры SMTP аутентификации для команды AUTH.

Каждая категория (область), кроме последней, завершается словом end. Пустые строки и строки, начинающиеся с %h, будут проигнорированы (последние служат для комментариев).Глобальные параметры

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

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

* primary_hostname — «официальное» имя локальной машины — то, как она прописана в DNS. Это имя используется в сообщениях HELO и как умолчание для qualify_domain;
* qualify_domain — имя домена для неквалифицированных получателей без указанного домена, например To: achome;
* local_domains — список доменов, которые при доставке сервер должен определять как локальные. Если этот список пуст (хотя сам параметр указан), то никакая почта не будет доставляться как локальная;
* forbid_domain_literals — запрещает использование числовой адресации доменных имен для предотвращения некоторых нештатных методов использования. Даже если числовые литералы и допускаются, то все равно для них используется отдельный маршрутизатор domain_literal;
* host_accept_relay — список хостов и подсетей (обычно в виде CIDR-подсети), для которых открыта пересылка mail relay;
* relay_domains. Если вы выступаете в качестве моста для какого-то домена (или просто предоставляете для него вход MX), то, указав relay_domains, вы позволяете любому хосту пересылать через вас почту для указанного домена;
auth_hosts — перечисленные хосты должны пройти smtp-аутентификацию;
* log_* — параметры, устанавливающие, что и как записывается в журналы. Возможна настройка от очень скромных отчетов до самого жесткого контроля. Если установлена запись в журналы, не забывайте также читать и анализировать их;
* message_filter* — набор параметров фильтрации сообщений в зависимости от разбора полей заголовка. Правила фильтрации, указывают на логически заданные операции, после чего записи message_filter_*_transport привязывают это действие к конкретному транспорту. Таким образом можно перенастроить все правила, перенастроив записи message_filter_*_transport;
* queue_* — параметры управления очередью, определяющие, для каких доменов и с какими параметрами сообщения не будут отправляться непосредственно, а будут помещаться в очередь. По умолчанию очередь не используется и ее включение должно быть аргументировано;
* rbl_* — система поддержки Realtime Blackhole Lists («черных списков»).

Остальные параметры главной области задают менее распространенные опции.

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

<имя_объекта>:
driver = <имя_драйвера>
…другие параметры

Например:

adress_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
Транспорты

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

* appendfile — добавляет сообщение в текстовый файл (обычно в формате Unix mailbox);
* autoreply — это «псевдотранспорт», реализованный как локальная доставка. «Псевдо», потому что сообщение никуда реально не пересылается, вместо него создается новое в режиме автоответчика;
* lmtp — реализует протокол локальной доставки в канал соответственно RFC 2033. Типично Exim не скомпилирован с этой возможностью (если хотите задействовать этот протокол, см. документацию);
* pipe — доставка потока почтовых сообщений в канал как входных данных для указанной команды. Учтите, что для фильтрации и редактирования заголовков есть штатные встроенные возможности.

Типичное использование — направление локальных пересылок через procmail:

%h транспорт
procmail_pipe:
driver = pipe
command = /opt/local/bin/procmail -d $local_part
return_path_add
delivery_date_add
envelope_to_add
check_string = «From »
escape_string = «>From »
user = $local_part
group=mail
%h директор
procmail:
driver=localuser
transport=procmail_pipe

smtp — пересылает почту другому smtp-серверу по протоколу TCP. Исключительно важный элемент настройки для почты, покидающей ваш сервер. Поскольку по умолчанию этот транспорт ничего не знает о тех серверах, на которые вы будете пересылать свою почту.

Приведу пример транспорта типа smtp — так, как он настроен на сервере нашей рабочей группы:

outer_space:
driver=smtp
fallback_hosts=10.0.0.6

Указанный хост 10.0.0.6 — внутренний адрес корпоративного сервера, выступающего в роли главного почтового маршрутизатора, открытый для пересылки с адреса нашего сервера. Напротив, для того чтобы ваш сервер мог принимать почту для пересылки от определенных хостов и подсетей, настройте соответствующий параметр в общей секции:

host_accept_relay = localhost: 192.168.0.0/16: may2relay.net

Директоры

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

* aliasfile — преобразует адрес получателя в другой адрес, список рассылки, канал или файл на диске. Правила подстановки хранятся в текстовом файле, базе данных с прямым доступом DBM или через сервисы NIS/NIS+ или LDAP;
* forwardfile — изначально отвечает за доставку писем, переадресованных с помощью пользовательского файла.forward. Другое применение этого директора — списки рассылки;
* localuser — доставка почты локальным пользователям, в основном это обычная раскладка в пользовательские каталоги, но возможна организация доставки по procmail или еще каким-то другим способом;
* smartuser — доставка локальным пользователям, не попавшим ни в одну из предыдущих категорий. Таким образом фильтруются некоторые адреса для специальной доставки.

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

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

* Ipliteral — маршрутизатор для писем, адрес которых задан явно в числовом виде, например: achome@[192.168.1.1]
* iplookup — специальный маршрутизатор для Кембриджского университета, по умолчанию не входит в бинарный файл;
* lookuphost — машрутизатор для поиска почтового сервера, обслуживающего определенный домен. Поиск осуществляется по определенному алгоритму, начиная с MX-записей в DNS — и, если таких нет, то опросом функции gethostbyname ();
* queryprogram — маршрутизатор, запускающий внешнюю программу и далее обрабатывающий ее выходные данные. Поскольку это достаточно ресурсоемкий путь, то пользоваться им нужно с осторожностью.

Досылка и возврат, трансляция адресов и средства SMTP-аутентификации

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

Дополнительно существует еще две секции конфигурации, одна из которых определяет правила трансляции (перезаписи) адресов отправителя. Exim, как минимум, будет стараться дополнять не полностью квалифицированные имена (имена из одного имени без домена) указанным доменом. Кроме того, будет заменяться доменное имя, преобразованное в результате запроса к DNS. Перезаписывание адресов предполагает, что вы переписываете адреса из вашего собственного домена, в противном случае могут возникнуть проблемы.

Последняя часть файла конфигурации посвящена настройке SMTP-аутентификации и включает описание методов шифрования и дайджесты, используемые при передаче пароля.
Организация списка рассылки

Драйвер forwardfile может быть использован для организации несложных списков рассылки, например так:

rassylka:
driver = forwardfile
domains = comizdat.lan
no_more
file = /opt/lists/$local_part
no_check_local_user
forbid_pipe
forbid_file
errors_to = $local_part-err@comizdat.lanЭтот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script

В этом примере имя получателя служит переключателем списков рассылки, то есть письмо, посланное по адресу list1@comizdat.lanЭтот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script , будет разослано по списку /opt/lists/list1. Если такой файл не найден, то, согласно опции no_more, обработка сообщения будет прекращена и сообщение об ошибке будет направлено по адресу list1-err@comizdat.lan.Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script Опции с префиксом forbid отменяют расширение имен адресатов до имени файла или канала; no_check_local_user отменяет проверку прав файла. Если нужно прикрыть рассылку, сделав ее доступной только для определенных пользователей, можно добавить следующие параметры:

require_files =/opt/lists/$local_part
senders = lsearch;/opt/lists/$local_part

Настройка виртуальных серверов

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

local_domains = comizdat.lan: dbm;/etc/virtual_hosts

DBM файл можно «изготовить» из обычного текстового файла посредством команды exim_dbmbuild.

Фактически существует несколько способов обрабатывать несколько доменов. «Старая добрая» техника — посылать всю почту для домена на один адрес. Фактически это не виртуальный домен в собственном смысле, а схема маршрутизации, которая может быть обработана маршрутизатором domainlist. После того как поток будет распознан как локальный, его можно отфильтровать на smartuser или альтернативно пропустить через forwardfile.

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

virtual:
driver = aliasfile
domains = dbm;/etc/mail/domains
no_more
file = /etc/mail/$domain
search_type = lsearch

После подстановки псевдонима письмо получит новый конверт и начнет новый цикл доставки. Проверка доменов гарантирует, что будут «перелицованы» только определенные домены.
Формирование списков

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

* полным именем домена, как abc.domain.com;
* именем с подстановочными знаками * (*. domain.com);
* именем с префиксом!, что обозначает «все, кроме указанных», (!*.domain.com);
* абсолютным именем файла, который содержит в каждой строке отдельный элемент списка, который, в свою очередь, может быть одним из перечисленного, то есть содержать метасимволы — и так далее (например: /etc/mail-redirection-allowed);
* одиночным вхождением символа @ (обозначает имя компьютера, как указано в primary_hostname. Таким образом, файл конфигурации можно скопировать с одного компьютера на другой без модификации);
* строкой, начинающейся с ^ (обозначает регулярное выражение в терминах языка perl. Если доменное имя подходит под это условие (вызывает совпадение), то считается, что такое имя входит в список);
* если в качестве префикса стоит один из методов поиска по одному ключу, а остальная часть — имя файла, по которому нужно осуществить поиск, то имя домена ищется в указанном файле. И если оно там найдено, считается, что оно входит в список: local_dоmains=cdb;/etc/mail/local_domains.cdb;
* аналогично для методов доступа, основанных на запросах, строка должна содержать метод и запрос: mysql;select dom from domains where dom=’$key’;
* все перечисленные методы могут быть использованы одновременно, результат их выполнения будет учтен в порядке упоминания — так что ставьте более быстрые и более вероятные варианты ближе к началу списка.

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

local_domains=@: comizdat.com: *.comizdat.ua:
^[1-2]d {3}.fict.book$: dbm;/etc/exim/locals/: nis;domains.byname:
nisplus;[name=$key,status=local],domains.org_dir

Программное управление доставкой

Существует множество способов внедрения логики в процесс доставки, фильтрации и трансляции почтовых сообщений — от простых макроподстановок до полного программного управления доставкой.

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

OUR_DOMAIN=comizdat.lan
primary_hostname=mail.OUR_DOMAIN
qualify_domain=OUR_DOMAIN
local_domains=localhost: OUR_DOMAIN

Аналогично подстановке макро существует множество встроенных (зарезервированных) переменных, которые автоматически принимают значения в контексте обрабатываемого почтового сообщения. Кто знаком с программированием веб-приложений, тот встречался с подобной техникой. Синтаксически встроенные переменные обозначаются знаком $, и в случае, если их нужно отделить от окружающего текста, заключаются в фигурные скобки — например, ${domain} обозначает домен назначения текущего письма.

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

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

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

В любом случае, попробуйте — возможно, это именно то, что вам нужно.

Добавить комментарий

всё о почтовых и курьерских услугах