Настройка почты · 7 min read · Jan 17, 2026

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

5 Настройка Postfix

Теперь нам нужно сказать Postfix, где он может найти всю информацию в базе данных. Поэтому нам нужно создать шесть текстовых файлов. Вы заметите, что я говорю Postfix подключиться к MySQL по IP-адресу 127.0.0.1 вместо localhost. Это связано с тем, что Postfix работает в chroot-окружении и не имеет доступа к сокету MySQL, к которому он пытался бы подключиться, если бы я сказал Postfix использовать localhost. Если я использую 127.0.0.1, Postfix использует TCP-сетевое соединение для подключения к MySQL, что не является проблемой даже в chroot-окружении (альтернативой было бы переместить сокет MySQL в chroot-окружение, что вызывает некоторые другие проблемы).

Пожалуйста, убедитесь, что /etc/mysql/my.cnf содержит следующую строку:

vi /etc/mysql/my.cnf

| [...] # Вместо skip-networking по умолчанию теперь слушает только на # localhost, что более совместимо и не менее безопасно. bind-address = 127.0.0.1 [...] |

Если вам пришлось изменить /etc/mysql/my.cnf, пожалуйста, перезапустите MySQL сейчас:

/etc/init.d/mysql restart

Запустите

netstat -tap | grep mysql

чтобы убедиться, что MySQL слушает на 127.0.0.1 (localhost.localdomain):

root@server1:/usr/src# netstat -tap | grep mysql
tcp 0 0 localhost.localdo:mysql : LISTEN 3895/mysqld
root@server1:/usr/src#

Теперь давайте создадим наши шесть текстовых файлов.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

Затем измените права доступа и группу этих файлов:

chmod o= /etc/postfix/mysql-virtual*.cf
chgrp postfix /etc/postfix/mysql-virtual
*.cf

Теперь мы создаем пользователя и группу с именем vmail с домашним каталогом /home/vmail. Здесь будут храниться все почтовые ящики.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Далее мы выполняем некоторую настройку Postfix. Убедитесь, что вы заменили server1.example.com на действительное FQDN, в противном случае ваш Postfix может работать неправильно!

postconf -e ‘myhostname = server1.example.com’
postconf -e ‘mydestination = server1.example.com, localhost, localhost.localdomain’
postconf -e ‘mynetworks = 127.0.0.0/8’
postconf -e ‘virtual_alias_domains =’
postconf -e ‘virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf’
postconf -e ‘virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf’
postconf -e ‘virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf’
postconf -e ‘virtual_mailbox_base = /home/vmail’
postconf -e ‘virtual_uid_maps = static:5000’
postconf -e ‘virtual_gid_maps = static:5000’
postconf -e ‘smtpd_sasl_auth_enable = yes’
postconf -e ‘broken_sasl_auth_clients = yes’
postconf -e ‘smtpd_sasl_authenticated_header = yes’
postconf -e ‘smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination’
postconf -e ‘smtpd_use_tls = yes’
postconf -e ‘smtpd_tls_cert_file = /etc/postfix/smtpd.cert’
postconf -e ‘smtpd_tls_key_file = /etc/postfix/smtpd.key’
postconf -e ‘transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf’
postconf -e ‘virtual_maildir_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 ‘proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps’

После этого мы создаем SSL-сертификат, который необходим для TLS:

cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Country Name (2 letter code) [AU]: <– Введите название вашей страны (например, “DE”).
State or Province Name (full name) [Some-State]: <– Введите название вашего штата или провинции.
Locality Name (eg, city) []: <– Введите ваш город.
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <– Введите название вашей организации (например, название вашей компании).
Organizational Unit Name (eg, section) []: <– Введите название вашего подразделения (например, “IT Department”).
Common Name (eg, YOUR name) []: <– Введите полное доменное имя системы (например, “server1.example.com”).
Email Address []: <– Введите ваш адрес электронной почты.

Затем измените права доступа к smtpd.key:

chmod o= /etc/postfix/smtpd.key

6 Настройка Saslauthd

Сначала выполните

mkdir -p /var/spool/postfix/var/run/saslauthd

Затем отредактируйте /etc/default/saslauthd. Установите START в yes и измените строку OPTIONS=”-c -m /var/run/saslauthd” на OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”:

vi /etc/default/saslauthd

| # # Настройки для демона saslauthd # Пожалуйста, прочитайте /usr/share/doc/sasl2-bin/README.Debian для подробностей. # # Должен ли saslauthd запускаться автоматически при старте? (по умолчанию: нет) START=yes # Описание этого экземпляра saslauthd. Рекомендуется. # (предложение: Демон аутентификации SASL) DESC="Демон аутентификации SASL" # Краткое имя этого экземпляра saslauthd. Настоятельно рекомендуется. # (предложение: saslauthd) NAME="saslauthd" # Какие механизмы аутентификации должен использовать saslauthd? (по умолчанию: pam) # # Доступные опции в этом пакете Debian: # getpwent -- использовать библиотечную функцию getpwent() # kerberos5 -- использовать Kerberos 5 # pam -- использовать PAM # rimap -- использовать удаленный IMAP-сервер # shadow -- использовать локальный файл паролей shadow # sasldb -- использовать локальный файл базы данных sasldb # ldap -- использовать LDAP (конфигурация находится в /etc/saslauthd.conf) # # Можно использовать только одну опцию за раз. См. страницу man saslauthd # для получения дополнительной информации. # # Пример: MECHANISMS="pam" MECHANISMS="pam" # Дополнительные параметры для этого механизма. (по умолчанию: нет) # См. страницу man saslauthd для получения информации о специфичных для механизма параметрах. MECH_OPTIONS="" # Сколько процессов saslauthd мы должны запустить? (по умолчанию: 5) # Значение 0 создаст новый процесс для каждого соединения. THREADS=5 # Другие параметры (по умолчанию: -c -m /var/run/saslauthd) # Примечание: ВЫ ДОЛЖНЫ указать параметр -m, иначе saslauthd не будет работать! # # ПРЕДУПРЕЖДЕНИЕ: НЕ УКАЗЫВАЙТЕ ПАРАМЕТР -d. # Параметр -d заставит saslauthd работать в фоновом режиме вместо того, чтобы быть # демоном. Это ПРЕДОТВРАТИТ ВАШУ СИСТЕМУ ОТ НОРМАЛЬНОГО ЗАПУСКА. Если вы хотите # запустить saslauthd в режиме отладки, пожалуйста, запустите его вручную для безопасности. # # См. /usr/share/doc/sasl2-bin/README.Debian для информации, специфичной для Debian. # См. страницу man saslauthd и вывод 'saslauthd -h' для общей # информации об этих параметрах. # # Пример для пользователей Postfix в chroot: "-c -m /var/spool/postfix/var/run/saslauthd" # Пример для пользователей Postfix вне chroot: "-c -m /var/run/saslauthd" # # Чтобы узнать, работает ли ваш Postfix в chroot, проверьте /etc/postfix/master.cf. # Если в нем есть строка "smtp inet n - y - - smtpd" или "smtp inet n - - - - smtpd" # тогда ваш Postfix работает в chroot. # Если в нем есть строка "smtp inet n - n - - smtpd", то ваш Postfix НЕ # работает в chroot. #OPTIONS="-c -m /var/run/saslauthd" OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r" |

Затем создайте файл /etc/pam.d/smtp. Он должен содержать только следующие две строки (обязательно укажите правильные данные вашей базы данных):

vi /etc/pam.d/smtp

| auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 |

Затем создайте файл /etc/postfix/sasl/smtpd.conf. Он должен выглядеть следующим образом:

vi /etc/postfix/sasl/smtpd.conf

| pwcheck_method: saslauthd mech_list: plain login allow_plaintext: true auxprop_plugin: sql sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: mail_admin sql_passwd: mail_admin_password sql_database: mail sql_select: select password from users where email = '%u@%r' |

Затем добавьте пользователя postfix в группу sasl (это гарантирует, что Postfix имеет разрешение на доступ к saslauthd):

adduser postfix sasl

Затем перезапустите Postfix и Saslauthd:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

7 Настройка Courier

Теперь нам нужно сказать Courier, что он должен аутентифицироваться против нашей базы данных MySQL. Сначала отредактируйте /etc/courier/authdaemonrc и измените значение authmodulelist так, чтобы оно выглядело следующим образом:

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" [...] |

Затем создайте резервную копию /etc/courier/authmysqlrc и очистите старый файл:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc

Затем откройте /etc/courier/authmysqlrc и вставьте в него следующие строки:

vi /etc/courier/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Во время установки SSL-сертификаты для IMAP-SSL и POP3-SSL создаются с именем хоста localhost. Чтобы изменить это на правильное имя хоста (server1.example.com в этом учебнике), удалите сертификаты…

cd /etc/courier
rm -f /etc/courier/imapd.pem
rm -f /etc/courier/pop3d.pem

… и измените следующие два файла; замените CN=localhost на CN=server1.example.com (вы также можете изменить другие значения, если необходимо):

vi /etc/courier/imapd.cnf

| [...] CN=server1.example.com [...] |

vi /etc/courier/pop3d.cnf 

| [...] CN=server1.example.com [...] |

Затем воссоздайте сертификаты…

mkimapdcert
mkpop3dcert

… и перезапустите Courier:

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Запустив

telnet localhost pop3

вы можете увидеть, работает ли ваш POP3-сервер правильно. Он должен вернуть +OK Hello there. (Введите quit, чтобы вернуться в оболочку Linux.)

root@server1:/etc/courier# telnet localhost pop3
Trying 127.0.0.1…
Connected to localhost.localdomain.
Escape character is ‘^]’.
+OK Hello there.
<– quit
+OK Better luck next time.
Connection closed by foreign host.
root@server1:/etc/courier#

8 Измените /etc/aliases

Теперь мы должны открыть /etc/aliases. Убедитесь, что postmaster указывает на root, а root на ваше собственное имя пользователя или адрес электронной почты, например, так:

vi /etc/aliases

| [...] postmaster: root root: [email protected] [...] |

или так (если администратор — это ваше собственное имя пользователя):

| [...] postmaster: root root: administrator [...] |

Каждый раз, когда вы изменяете /etc/aliases, вы должны запустить

newaliases

после этого и перезапустить Postfix:

/etc/init.d/postfix restart
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.