Настройка почтовой системы (Exim+Dovecot+Roundcube)

  1. Основные термины
  2. Введение
  3. Структура таблиц в базе данных
  4. Агент доставки почты Dovecot
  5. Агент пересылки почты Exim
  6. Веб интерфейс Roundcube
  7. Заключение
  8. Список литературы
  9. Комментарии

Основные термины

SMTP (Simple Mail Transfer Protocol) — простой протокол передачи почты.
POP3 (Post Office Protocol Version 3) — протокол почтового отделения, версия 3.
IMAP (Internet Message Access Protocol) — протокол доступа к почте в Интернете.
MTA (Mail Transfer Agent) — агент пересылки почты.
MDA (Mail Delivery Agent) — агент доставки почты.
LDA (Local Delivery Agent) — локальный агент доставки почты;
MUA (Mail user agent) — почтовый агент пользователя (почтовый клиент);
Sieve — язык описания правил фильтрации для почтовых сообщений.

1. Введение

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

Exim logo Dovecot logo

В данной статье описан процесс настройки почтовой системы на базе операционной системы FreeBSD и программного обеспечения Exim, Dovecot, Roundcube. Здесь я не буду рассказывать про основы работы электронной почты, поскольку предполагается, что читатель уже знаком с основными терминами и понятиями, а также знает какие службы отвечают за работу той или иной части электронной почты (имеется ввиду MTA, MDA, MUA). Очень полезным и даже необходимым будет прочтение документов, описывающих протоколы SMTP, POP3, IMAP (это тот базис, который любой уважающий себя админ почтовых систем должен знать). Перевод данных документов будет не сложно найти на просторах Интернета.

В будущей конфигурации почтового сервера предполагается, что Exim занимается только передачей электронных сообщений, а Dovecot работает непосредственно с почтовыми ящиками пользователей. Взаимодействие Exim и Dovecot организовано через программу LDA, входящую в состав пакета Dovecot. Защита от спама будет реализована средствами Exim, о методике защиты будет подробно рассказано в соответствующем разделе. К Dovecot будет подключен плагин Sieve, который позволит пользователям создавать собственные фильтры. Доступ к почтовым ящикам и управление ими, а также управление пользовательскими фильтрами будет организовано с помощью веб интерфейса Roundcube. Задача хранения всей служебной информации будет возложена на систему управления базами данных PostgreSQL.

2. Структура таблиц в базе данных

На данном этапе, необходимо определиться, в каком виде у вас будут храниться данные почтовой системы (информация о пользователях, доменах и т.п.). Гибкость используемых программных средств позволяет реализовать абсолютно любую структуру базы данных, например, для управления почтовой системой, возможно использовать postfixadmin и взять за основу, поставляемую с данным пакетом структуру базы данных. В моем случае для доступа к почте будет использоваться веб интерфейс Roundcube, который позволяет пользователю рулить всеми необходимыми настройками своего аккаунта (изменение своих учетных данных, пароля и т.п.), поэтому я сделал удобную для меня структуру базы данных, а для внесения и изменения данных мне достаточно функционала phpPgAdmin.

На приведенном ниже рисунке представлена схема базы данных. Из приведенной схемы видно, что поля "domain_id" из таблиц aliases_tb и users_tb связаны с полем "id" из таблицы domains_tb. Данная связь обеспечивает привязку учетных записей (users_tb) и синонимов (aliases_tb) к конкретному домену (domains_tb). Связь полей в таблицах обеспечена на уровне запросов языка SQL.

Схема связей таблиц
SQL код:
  1. CREATE TABLE "aliases_tb" (
  2.     "id" bigserial PRIMARY KEY,
  3.     "aliasname" character varying(32) NOT NULL,
  4.     "domain_id" integer NOT NULL,
  5.     "mailaddr" character varying(256) NOT NULL,
  6.     "active" boolean DEFAULT true NOT NULL,
  7.     CONSTRAINT "aliases_tb_domain_id_check" CHECK (("domain_id" > 0))
  8. );
  9.  
  10. CREATE TABLE "domains_tb" (
  11.     "id" bigserial PRIMARY KEY,
  12.     "domainname" character varying(128) NOT NULL,
  13.     "active" boolean DEFAULT true NOT NULL
  14. );
  15.  
  16. CREATE TABLE "users_tb" (
  17.     "id" bigserial PRIMARY KEY,
  18.     "username" character varying(32) NOT NULL,
  19.     "passwd" character varying(32) DEFAULT md5((power((5)::double precision, (random() * (12345)::double precision)))::text) NOT NULL,
  20.     "domain_id" bigint NOT NULL,
  21.     "uid" integer DEFAULT 26 NOT NULL,
  22.     "gid" integer DEFAULT 6 NOT NULL,
  23.     "homedir" character varying(512) DEFAULT '/var/mail'::character varying NOT NULL,
  24.     "quota" integer DEFAULT 10240,
  25.     "active" boolean DEFAULT true NOT NULL,
  26.     CONSTRAINT "users_tb_domain_id_check" CHECK (("domain_id" > 0)),
  27.     CONSTRAINT "users_tb_gid_check" CHECK (("gid" > 0)),
  28.     CONSTRAINT "users_tb_quota_check" CHECK (("quota" > 0)),
  29.     CONSTRAINT "users_tb_uid_check" CHECK (("uid" > 0)),
  30.     CONSTRAINT "users_tb_username_check" CHECK ((char_length(("username")::text) > 0))
  31. );
  32.  
  33. CREATE TABLE "whitelist_tb" (
  34.     "ip" inet,
  35.     "addrhash" character varying(32),
  36.     "ctime" integer DEFAULT date_part('epoch'::text, now())
  37. );
  38.  
  39. CREATE TABLE "greylist_tb" (
  40.     "ip" inet,
  41.     "addrhash" character varying(32),
  42.     "ctime" integer DEFAULT date_part('epoch'::text, now())
  43. );
  44.  
  45. CREATE TABLE "blacklist_tb" (
  46.     "ip" inet,
  47.     "ctime" bigint DEFAULT date_part('epoch'::text, now())
  48. );
  49.  
  50. CREATE TABLE "badhosts_tb" (
  51.     "id" bigserial PRIMARY KEY,
  52.     "ip" cidr,
  53.     "description" character varying(512)
  54. );

В таблице domains_tb содержится список обслуживаемых доменов почтовым сервером. Таблица aliases_tb содержит синонимы для доменов, users_tb содержит учетные данные пользователей, а таблицы blacklist_tb, greylist_tb и whitelist_tb используются для реализации технологии серых списков, о которой будет рассказано в разделе про настройку Exim. Таблицу badhosts_tb пришлось ввести, поскольку от некоторых более или менее корректно настроенных хостов бывает, приходит спам, и как раз такие хосты уютно располагаются в данной таблице (вычисляются в процессе работы почтовой системы и вручную добавляются/удаляются).


Для понимания приведу пример вставляемых в таблицы данных:
  1. INSERT INTO "domains_tb" VALUES (DEFAULT, 'example.net', 'true');
Таким образом добавляется домен, который будет обслуживать почтовый сервер. Далее необходимо посмотреть какой идентификатор (поле "id" таблицы "domains_tb") был присвоен новой записи. Он будет использоваться при добавлении синонимов и учетных записей пользователей. В данном случае пусть он будет равным единице.
  1. INSERT INTO "aliases_tb" VALUES (DEFAULT, 'postmaster', 1, 'admin@old_domain.net', 'true');
  2. INSERT INTO "users_tb" VALUES (DEFAULT, 'admin', md5('1234'), 1, 26, 26, '/var/mail', 10240, 'true');
Первый запрос добавляет синоним вида postmaster@example.net —> admin@old_domain.net, а второй новую учетную запись с почтовым адресом admin@example.net, паролем 1234, директорией для хранения почты — /var/mail и квотой размером в 10Мб. Поля uid и gid (в данном случае они равны 26) указывают под каким пользователем осуществлять доставку в директорию для хранения почты.

Начало | Вперед