Почтовый сервер · 7 min read · Jan 26, 2026

Виртуальные пользователи и домены с Postfix, Courier, MySQL и SquirrelMail (Ubuntu 14.04LTS)

Этот учебник является объектом авторского права (c) 2014 года Фалко Тимме и Сриджан Кишор. Он основан на учебнике Кристофа Хааса, который вы можете найти по адресу http://workaround.org. Вы можете свободно использовать этот учебник в соответствии с лицензией Creative Commons 2.5 или любой более поздней версией.

Этот документ описывает, как установить почтовый сервер Postfix, основанный на виртуальных пользователях и доменах, т.е. пользователях и доменах, которые находятся в базе данных MySQL. Я также продемонстрирую установку и настройку Courier (Courier-POP3, Courier-IMAP), чтобы Courier мог аутентифицироваться с использованием той же базы данных MySQL, которую использует Postfix.

Получившийся сервер Postfix способен на SMTP-AUTH и TLS и квоты (квота по умолчанию не встроена в Postfix, я покажу, как правильно патчить ваш Postfix). Пароли хранятся в зашифрованном виде в базе данных (большинство документов, которые я нашел, имели дело с паролями в открытом виде, что является риском безопасности). В дополнение к этому, этот учебник охватывает установку Amavisd, SpamAssassin и ClamAV, чтобы электронные письма сканировались на наличие спама и вирусов. Я также покажу, как установить SquirrelMail в качестве веб-интерфейса для почты, чтобы пользователи могли читать и отправлять электронные письма и изменять свои пароли.

Преимущество такой “виртуальной” настройки (виртуальные пользователи и домены в базе данных MySQL) заключается в том, что она гораздо более производительна, чем настройка, основанная на “реальных” системных пользователях. С этой виртуальной настройкой ваш почтовый сервер может обрабатывать тысячи доменов и пользователей. Кроме того, администрировать ее проще, потому что вам нужно иметь дело только с базой данных MySQL, когда вы добавляете новых пользователей/доменов или редактируете существующих. Больше никаких команд postmap для создания db файлов, больше никаких перезагрузок Postfix и т.д. Для администрирования базы данных MySQL вы можете использовать веб-инструменты, такие как phpMyAdmin, которые также будут установлены в этом руководстве. Третье преимущество заключается в том, что у пользователей есть адрес электронной почты в качестве имени пользователя (вместо имени пользователя + адреса электронной почты), что легче понять и запомнить.

Это руководство предназначено как практическое руководство; оно не охватывает теоретические основы. Они рассматриваются во многих других документах в сети.

Этот документ предоставляется без каких-либо гарантий! Я хочу сказать, что это не единственный способ настройки такой системы. Существует множество способов достижения этой цели, но это тот путь, который я выбрал. Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Этот учебник основан на Ubuntu 14.04 Server (Trusty Tahr), поэтому вам следует установить базовую установку сервера Ubuntu 14.04 перед тем, как продолжить с этим учебником. Система должна иметь статический IP-адрес. Я использую 192.168.0.100 в этом учебнике и server1.example.com в качестве имени хоста.

Убедитесь, что вы вошли в систему как root (введите

sudo su

чтобы стать root), потому что мы должны выполнять все шаги из этого учебника от имени пользователя root.

Очень важно, чтобы вы сделали /bin/sh символической ссылкой на /bin/bash…

dpkg-reconfigure dash

Использовать dash в качестве оболочки по умолчанию для системы (/bin/sh)? <– Нет

… и чтобы вы отключили AppArmor, если вы получаете apparmor: unrecognized service, тогда удалите его из update-rc.d

service apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

2 Установка Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Чтобы установить Postfix, Courier, Saslauthd, MySQL и phpMyAdmin, просто выполните

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

Вам будет задано несколько вопросов:

Новый пароль для пользователя MySQL “root”: <– вашпарольsqlroot
Повторите пароль для пользователя MySQL “root”: <– вашпарольsqlroot
Создать директории для веб-администрирования? <– Нет
Общий тип конфигурации почты: <– Интернет-сайт
Системное имя почты: <– server1.example.com
Требуется SSL-сертификат <– Ок
Веб-сервер для автоматической перенастройки: <– apache2
Настроить базу данных для phpmyadmin с dbconfig-common? <– Нет

3 Применение патча квоты к Postfix

Нам нужно получить исходные коды Postfix, патчить их с помощью патча квоты, собрать новые пакеты Postfix.deb и установить эти пакеты:

apt-get build-dep postfix

Иногда вы можете получить ошибку следующего вида:-

root@server1:~# apt-get build-dep postfix
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение состояния информации… Готово
E: Вы должны указать некоторые ‘source’ URIs в вашем sources.list
root@server1:~#

Вы можете исправить это следующим образом, добавив репозитории источников:

vi /etc/apt/sources.list

Сделайте запись, как в моем случае:

deb http://archive.ubuntu.com/ubuntu trusty main restricted universe
deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu trusty partner

deb-src http://archive.ubuntu.com/ubuntu trusty main restricted universe
deb-src http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
deb-src http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb-src http://archive.canonical.com/ubuntu trusty partner

Далее

apt-get update
apt-get build-dep postfix

cd /usr/src
apt-get source postfix

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

postconf -d | grep mail_version

Вывод должен выглядеть так:

root@server1:/usr/src# postconf -d | grep mail_version
mail_version = 2.11.0
milter_macro_v = $mail_name $mail_version
root@server1:/usr/src#

wget http://vda.sourceforge.net/VDA/postfix-vda-v13-2.10.0.patch
cd postfix-2.11.0
patch -p1 < ../postfix-vda-v13-2.10.0.patch

Далее откройте debian/rules и измените DEB_BUILD_HARDENING с 1 на 0:

vi debian/rules

| [...] export DEB_BUILD_HARDENING=0 [...] |

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

maildir.c: В функции âdeliver_maildirâ:
maildir.c:974:17: ошибка: формат не является строковым литералом и нет аргументов формата [-Werror=format-security]
maildir.c:977:17: ошибка: формат не является строковым литералом и нет аргументов формата [-Werror=format-security]
maildir.c:983:17: ошибка: формат не является строковым литералом и нет аргументов формата [-Werror=format-security]
maildir.c:986:17: ошибка: формат не является строковым литералом и нет аргументов формата [-Werror=format-security]
maildir.c: В функции âsql2fileâ:
maildir.c:404:25: предупреждение: игнорирование возвращаемого значения âreadâ, объявленного с атрибутом warn_unused_result [-Wunused-result]
maildir.c:417:26: предупреждение: игнорирование возвращаемого значения âwriteâ, объявленного с атрибутом warn_unused_result [-Wunused-result]
cc1: некоторые предупреждения рассматриваются как ошибки
make: [maildir.o] Ошибка 1
make: Выход из директории `/usr/src/postfix-2.11.0/src/virtual’
make[1]:
[update] Ошибка 1
make[1]: Выход из директории `/usr/src/postfix-2.11.0’
make: * [build] Ошибка 2
dpkg-buildpackage: ошибка: debian/rules build дала код выхода 2
root@server1:/usr/src/postfix-2.11.0#

Теперь мы можем собрать новые пакеты Postfix.deb:

dpkg-buildpackage

Теперь мы переходим на один уровень вверх, там были созданы новые .deb пакеты:

cd ..

Команда

ls -l

показывает вам доступные пакеты:

root@server1:/usr/src# ls -l
total 6824
drwxr-xr-x 18 root root    4096 Apr 30 04:28 postfix-2.11.0
-rw-r–r–  1 root root   46756 Apr 30 04:28 postfix-cdb_2.11.0-1_amd64.deb
-rw-r–r–  1 root root  142842 Apr 30 04:28 postfix-dev_2.11.0-1_all.deb
-rw-r–r–  1 root root  851842 Apr 30 04:28 postfix-doc_2.11.0-1_all.deb
-rw-r–r–  1 root root   53898 Apr 30 04:28 postfix-ldap_2.11.0-1_amd64.deb
-rw-r–r–  1 root root   48500 Apr 30 04:28 postfix-mysql_2.11.0-1_amd64.deb
-rw-r–r–  1 root root   48610 Apr 30 04:28 postfix-pcre_2.11.0-1_amd64.deb
-rw-r–r–  1 root root   48324 Apr 30 04:28 postfix-pgsql_2.11.0-1_amd64.deb
-rw-r–r–  1 root root   55701 Jun  7  2013 postfix-vda-v13-2.10.0.patch
-rw-r–r–  1 root root  267855 Apr 30 04:27 postfix_2.11.0-1.diff.gz
-rw-r–r–  1 root root    1522 Apr 30 04:27 postfix_2.11.0-1.dsc
-rw-r–r–  1 root root    3885 Apr 30 04:28 postfix_2.11.0-1_amd64.changes
-rw-r–r–  1 root root 1329238 Apr 30 04:28 postfix_2.11.0-1_amd64.deb
-rw-r–r–  1 root root 4034741 Feb 12 01:38 postfix_2.11.0.orig.tar.gz
root@server1:/usr/src#

Выберите пакеты postfix и postfix-mysql и установите их следующим образом:

dpkg -i postfix_2.11.0-1_amd64.deb postfix-mysql_2.11.0-1_amd64.deb

4 Создание базы данных MySQL для Postfix/Courier

Теперь мы создаем базу данных с именем mail:

mysqladmin -u root -p create mail

Вам будет задан этот вопрос:

Введите пароль: <– вашпарольsqlroot

Далее мы переходим в оболочку MySQL:

mysql -u root -p

В оболочке MySQL мы создаем пользователя mail_admin с паролем mail_admin_password (замените его на свой собственный пароль), который имеет привилегии SELECT, INSERT, UPDATE, DELETE на базе данных mail. Этот пользователь будет использоваться Postfix и Courier для подключения к базе данных mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.
TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;

Все еще в оболочке MySQL мы создаем таблицы, необходимые для Postfix и Courier:

USE mail;

CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
ENGINE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
ENGINE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) ENGINE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) ENGINE=MyISAM;

quit;

Как вы могли заметить, с помощью команды quit; мы вышли из оболочки MySQL и вернулись в оболочку Linux.

Таблица domains будет хранить каждый виртуальный домен, для которого Postfix должен получать электронные письма (например, example.com).

domain
example.com

Таблица forwardings предназначена для алиасирования одного адреса электронной почты на другой, например, пересылки писем для [email protected] на [email protected].

sourcedestination
[email protected][email protected]

Таблица users хранит всех виртуальных пользователей (т.е. адреса электронной почты, потому что адрес электронной почты и имя пользователя совпадают) и пароли (в зашифрованном виде!) и значение квоты для каждого почтового ящика (в этом примере значение по умолчанию составляет 10485760 байт, что означает 10 МБ).

emailpasswordquota
[email protected]No9.E4skNvGa. (“секрет” в зашифрованном виде)10485760

Таблица transport является необязательной, она предназначена для продвинутых пользователей. Она позволяет пересылать письма для отдельных пользователей, целых доменов или всех писем на другой сервер. Например,

domaintransport
example.comsmtp:[1.2.3.4]

пересылала бы все электронные письма для example.com через протокол smtp на сервер с IP-адресом 1.2.3.4 (квадратные скобки [] означают “не выполнять поиск записи MX DNS” (что имеет смысл для IP-адресов…). Если вы используете полностью квалифицированное доменное имя (FQDN), то квадратные скобки не используются.).

Кстати, (я предполагаю, что IP-адрес вашей почтовой системы составляет 192.168.0.100) вы можете получить доступ к phpMyAdmin по адресу http://192.168.0.100/phpmyadmin/ в браузере и войти как mail_admin. Затем вы можете взглянуть на базу данных. Позже вы можете использовать phpMyAdmin для администрирования вашего почтового сервера.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.