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

Виртуальные пользователи и домены с Postfix, Courier, MySQL и SquirrelMail (Debian Squeeze) - Страница 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      3838/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_create_maildirsize = yes'  
 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

Название страны (2 буквы) [AU]: <– Введите название вашей страны (например, “DE”).
Название штата или провинции (полное название) [Some-State]: <– Введите название вашего штата или провинции.
Название населенного пункта (например, город) []: <– Введите ваш город.
Название организации (например, компания) [Internet Widgits Pty Ltd]: <– Введите название вашей организации (например, название вашей компании).
Название структурного подразделения (например, отдел) []: <– Введите название вашего структурного подразделения (например, “IT-отдел”).
Общее название (например, ВАШЕ имя) []: <– Введите полное доменное имя системы (например, “server1.example.com”).
Электронная почта []: <– Введите ваш адрес электронной почты.

Затем измените разрешения для 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: "-c -m /var/spool/postfix/var/run/saslauthd" #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: 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' |

Затем добавьте пользователя 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.