Настройка почты · 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.key6 Настройка 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 restartGet new posts in your inbox
No spam. Unsubscribe anytime.