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

Полное решение почтового сервера с виртуальными доменами и пользователями (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - Страница 4

B. Настройка Postfix для виртуальных пользователей и доменов

Хотя почтовые обменники не будут доставлять почту виртуальным пользователям и доменам, они будут отклонять на основе действительных/недействительных адресов. Поэтому нам нужно, чтобы mx-серверы могли подключаться к SQL-серверу для проверки адресов. Введите информацию в postconf:

# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_extended = yes'
# postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf'
# postconf -e 'virtual_mailbox_limit_override = yes'
# postconf -e 'virtual_maildir_limit_message = "Пользователь, к которому вы пытаетесь обратиться, превысил свою квоту."
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'

Здесь есть несколько “подводных камней”. Эта конфигурация будет хранить почтовые ящики виртуальных пользователей в /vmail. Если вам нужно хранить ваши почтовые ящики в другом месте, измените строку virtual_mailbox_base соответственно.

Параметры virtual_minimum_uid и virtual_uid_maps указывают на идентификатор пользователя 150. Этот идентификатор пользователя предназначен для специально созданного пользователя “Виртуальная почта”. Он использует стандартную группу “mail” с идентификатором группы по умолчанию (Debian) 8. Вы можете создать пользователя и директорию следующим образом:

# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Виртуальный почтовый ящик" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/

Теперь нам нужно установить инструменты клиента NFS:

# apt-get install nfs-common portmap

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

# mount files-1.internal.example.com:/vmail /vmail

Теперь у вас должен быть доступ к общему ресурсу /vmail с files-1. Попробуйте создать файл (это не должно сработать!):

# cd /vmail
# touch tmp

ПРИМЕЧАНИЕ: Вы должны получить ошибку только для чтения!

Предполагая, что все работает, выполните размонтирование NFS:

# cd /
umount /vmail

А затем сделайте монтирование постоянным, добавив следующее в ваш /etc/fstab:

[...]  
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0

Теперь смонтируйте файловую систему в последний раз:

# mount /vmail

… и вы готовы к работе!

C. Конфигурация Postfix MySQL

Postfix был установлен с поддержкой MySQL, но это не означает, что он уже знает, как использовать нашу базу данных. Ему необходимо предоставить различную информацию о SQL-запросах для каждого типа таблицы в нашей базе данных. Эта информация хранится в файлах MySQL, определенных в файле main.cf. Обратите внимание, что в следующих файлах последняя строка содержит один комментарий (предшествующий #) с полным запросом. Последние версии Postfix могут использовать это вместо других операторов. Если вы используете более новую версию, просто закомментируйте все остальные строки и раскомментируйте оператор запроса.

/etc/postfix/mysql_virtual_alias_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = alias  
select_field = goto  
where_field = address  
additional_conditions = and active = '1'  
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
/etc/postfix/mysql_virtual_domains_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = domain  
select_field = domain  
where_field = domain  
additional_conditions = and backupmx = '0' and active = '1'  
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = mailbox  
select_field = quota  
where_field = username  
additional_conditions = and active = '1'  
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = mailbox  
select_field = CONCAT(domain,'/',maildir)  
where_field = username  
additional_conditions = and active = '1'  
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_transports.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = domain  
select_field = transport  
where_field = domain  
additional_conditions = and active = '1'  
#query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.