Почтовый сервер · 6 min read · Oct 14, 2025

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

Этот учебник является объектом авторского права (c) 2013 года Фалько Тимме. Он основан на учебнике Кристофа Хааса, который вы можете найти по адресу 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 для создания файлов базы данных, больше никакой перезагрузки Postfix и т.д. Для администрирования базы данных MySQL вы можете использовать веб-инструменты, такие как phpMyAdmin, которые также будут установлены в этом руководстве. Третье преимущество заключается в том, что у пользователей есть адрес электронной почты в качестве имени пользователя (вместо имени пользователя + адреса электронной почты), что проще для понимания и запоминания.

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

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

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

Этот учебник основан на Debian Wheezy, поэтому вам следует установить базовую установку сервера Debian Wheezy перед тем, как продолжить с этим учебником. Система должна иметь статический IP-адрес. Я использую 192.168.0.100 в этом учебнике и server1.example.com в качестве имени хоста.

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

dpkg-reconfigure dash

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

… и чтобы вы отключили AppArmor:

/etc/init.d/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

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

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

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

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

apt-get build-dep postfix
cd /usr/src  
apt-get source postfix

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

postconf -d | grep mail_version

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

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

)

wget http://vda.sourceforge.net/VDA/postfix-vda-v11-2.9.6.patch  
cd postfix-2.9.6  
patch -p1 < ../postfix-vda-v11-2.9.6.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.9.3/src/virtual'  
make[1]: * [update] Ошибка 1  
make[1]: Выход из директории `/usr/src/postfix-2.9.3'  
make: *** [build] Ошибка 2  
dpkg-buildpackage: ошибка: debian/rules build завершился с кодом выхода 2  
root@server1:/usr/src/postfix-2.9.3#

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

dpkg-buildpackage

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

cd ..

Команда

ls -l

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

root@server1:/usr/src# ls -l  
total 8400  
drwxr-xr-x  4 root root    4096 May  7 01:24 linux-headers-3.2.0-4-amd64  
drwxr-xr-x  4 root root    4096 May  7 01:24 linux-headers-3.2.0-4-common  
lrwxrwxrwx  1 root root      23 Jun 24  2012 linux-kbuild-3.2 -> ../lib/linux-kbuild-3.2  
drwxr-xr-x 18 root root    4096 Jul  1 21:13 postfix-2.9.6  
-rw-r--r--  1 root root    3561 Jul  1 21:13 postfix_2.9.6-2_amd64.changes  
-rw-r--r--  1 root root 1529980 Jul  1 21:13 postfix_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  254432 Jul  1 21:12 postfix_2.9.6-2.diff.gz  
-rw-r--r--  1 root root    1492 Jul  1 21:12 postfix_2.9.6-2.dsc  
-rw-r--r--  1 root root 3767309 Mar 11 15:03 postfix_2.9.6.orig.tar.gz  
-rw-r--r--  1 root root  255470 Jul  1 21:13 postfix-cdb_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  367774 Jul  1 21:13 postfix-dev_2.9.6-2_all.deb  
-rw-r--r--  1 root root 1294258 Jul  1 21:13 postfix-doc_2.9.6-2_all.deb  
-rw-r--r--  1 root root  264196 Jul  1 21:13 postfix-ldap_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  257322 Jul  1 21:13 postfix-mysql_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  257376 Jul  1 21:13 postfix-pcre_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  257476 Jul  1 21:13 postfix-pgsql_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root   55009 May  7 08:47 postfix-vda-v11-2.9.6.patch  
drwxr-xr-x  7 root root    4096 May  7 01:24 virtualbox-guest-4.1.18  
root@server1:/usr/src#

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

dpkg -i postfix_2.9.6-2_amd64.deb postfix-mysql_2.9.6-2_amd64.deb

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

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

mysqladmin -u root -p create mail

Затем мы переходим в оболочку 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.