Материал просмотрен 5,389 раз(а)

Всем привет! И вот наконец дописал я эту статью, которая стала сборником различных методов настройки почты на сервере Debian.

При написании использовались разные источники, поэтому элементы кода могут вам быть знакомыми. Я благодарен форумам за то, что наставили на путь истинный в войне с postfix!

В начале нам потребуется вот что:

  1. Регистрируем доменное имя, какое нам больше нравится. Если хотите почту вида <user>@litl-admin.ru, то регистрировать нужно litl-admin.ru. Конечно, придумайте своё; 🙂 Сделать это можно у крупных регистраторов или у, практически, любого хостера.
  2. Арендуем VDS с предустановленной Linux. В общем виде – это виртуальная машина с выделенным IP, на которой мы являемся root и можно ставить все, что угодно. Само-собой и настраивать тоже. Обходится эта услуга не очень дорого, порядка 1400 рублей в год, что весьма и весьма неплохо;
  3. Прописываем MX запись в DNS настройках нашего доменного имени с указанием IP-адреса нашего VDS;

Так, это всё организационные моменты. Теперь будем настраивать наш сервер.

Шаг 1. Удаление предыдущего MTA.

Удаляем exim4 из системы. У меня в Debian это был почтовый MTA по умолчанию, от которого я поспешил избавиться. Если в системе фурычит sendmail (проверить можно по # netstat -an | grep :25) то # kill -9 этот PID и продолжаем работу дальше;

Шаг 2. Настраиваем имя хоста.

Для этого посмотрите вывод команд:

# hostname

– выводит короткое имя узла и

# hostname -f

– выводит полное FQDN имя узла. Эти имена нужно будет прописать сразу в файл /etc/hosts в виде:


<ваш IP адрес> <вывод команды hostname -f> <вывод команды hostname>

Попутно запишите себе этот FQDN, он нам ещё пригодится.

Шаг 3. Начинаем установку необходимых пакетов:

# apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-common dovecot-imapd dovecot-pop3d libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl telnet mailutils

Установка всех пакетов

Установка всех пакетов

Во время установки вам будет задан ряд наводящих  на мысли вопросов навроде пароля суперпользователя mysql. Указывайте то, что не забудете. И лучше сразу записывать куда-нибудь подальше.

Далее, начнется конфигурирование Postfix (диалоговые окна), в которых нужно указать, что наш почтовый сервер является Интернет-сайтом, после чего указать наше hostname в поле ввода имени хоста. Тут указываем полное FQDN-имя:

Конфигурирование Postfix

Конфигурирование Postfix

Вводим FQDN-имя хоста

Вводим FQDN-имя хоста

Остальные настройки будем вносить непосредственно в файл /etc/postfix/main.cf.

Шаг 4. Настройка сервера MySQL

Настройка проста и богата дефолтами. Прежде всего убедимся, что работать будем с локальным хостом, для чего в файле /etc/mysql/my.cnf отметим параметр:

bind-address = 127.0.0.1

Перезапускаем / запускаем службу mysql:

# service mysql restart (или start, если не была запущена ранее)

Проверяем коннект:

# mysql -uroot -p<наш пароль, заданный при установке>

Обратите внимание, что пробелы между -p и паролем не ставятся! Если увидели приглашение mysql> значит всё ок! Идём дальше.

Шаг 5. Создаем служебные таблицы MySQL

Выполняем, как указано выше:

# mysql -u root -p<пароль>

и попадаем в командный режим mysq.

Далее, переписываем туда нижеуказанные команды (можно сделать копипаст):

CREATE DATABASE mail;
USE mail;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'postfixpassword';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'postfixadmin'@'localhost.localdomain' IDENTIFIED BY 'postfixpassword';
FLUSH PRIVILEGES;
CREATE TABLE domains (domain varchar(30) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
QUIT;

Не забудьте поменять логин с паролем для пущей безопасности!

Шаг 6. Настраиваем Postfix для работы с MySQL

Для того, чтобы Postfix мог брать информацию не из файлов, а из нашей базы данных (какие аккаунты есть, какие домены обслуживать, куда почту перенаправлять), нужно предусмотреть его работу с движком mysql. Для этого создаем служебные файлы следующего содержания:

Файл /etc/postfix/mysql-virtual_domains.cf
user = postfixadmin
password = postfixpassword
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

Файл /etc/postfix/mysql-virtual_forwardings.cf
user = postfixadmin
password = postfixpassword
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

Файл /etc/postfix/mysql-virtual_mailboxes.cf
user = postfixadmin
password = postfixpassword
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

Файл /etc/postfix/mysql-virtual_email2email.cf
user = postfixadmin
password = postfixpassword
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

Сразу расскажу, для чего нужна та или иная таблица:

  1. domain – в этой таблице хранятся домены, обслуживаемые нашим сервером. Для моего сайта будет litl-admin.ru, если вы купите ещё одно доменное имя, то укажите и его сюда, чтобы наш почтовый сервер мог обслуживать несколько доменов.
  2. forwardings – в этой таблице хранятся данные для перенаправления входящей почты. Например, если мы хотим завести почту с нашим красивым доменом, но не хотим хранить там письма, то можно редиректить всю входящую почту на наш ящик на mail.ru например;
  3. users – в этой таблице хранятся пользователи, созданные на нашем сервере. Хотите добавить нового юзера – просто добавьте запись в эту таблицу. Указывать нужно вместе с доменом.

На все созданные выше файлы назначаем привилегии, для того, чтобы увеличить безопасность. Конечно, чтобы никто другой не прочитал.

# chmod o= /etc/postfix/mysql-virtual_*.cf

Напомню, что формулировка 0= выставляет права для других (Other) равными … ну то есть убирает, при этом не трогая другие права. То есть права владельца и группы остаются неизменными.

Назначим так же группу на эти файлы:

# chgrp postfix /etc/postfix/mysql-virtual_*.cf

Готово! Идём дальше.

Шаг 7. Создаем пользователя для хранения почты

Первым делом, создаем группу virtualmail с gid-ом 5000, конечно можно указать любой gid из не существующих ранее, но почему-то полюбился для постфикса именно этот:

# groupadd -g 5000 virtualmail

Теперь создаем одноименного пользователя с аналогичным uid и домашний каталог для него.

# useradd -g virtualmail -u 5000 virtualmail -d /home/virtualmail -m

Шаг 8. Конфигурируем Postfix

#Указываем баннер для нашего сервера)
smtpd_banner = Welcome to SMTP by Litl-admin.ru
biff = no

# Не будем добавлять .домен, это работа почтового
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = /usr/share/doc/postfix

# TLS parameters
# Путь к сертификату, сгенерируем его попозже
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# Имя хоста, совпадает с сайтом
myhostname = litl-admin.ru
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost, localhost.localdomain
relayhost =
# Замените [My.Site.Ip.Addr] на ваш IP-адрес
mynetworks = 127.0.0.0/8 [My.Site.Ip.Addr]/32

mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
html_directory = /usr/share/doc/postfix/html

# 30 мегабайт вполне достаточно
message_size_limit = 30720000

virtual_alias_domains =

# Вот тут используем виртуальные адреса для пересылки почты
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf

# Обслуживаемые виртуальные домены
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
# Обслуживаемые ящики
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf

# Каталог для почты
virtual_mailbox_base = /home/virtualmail
# Владелец каталога (UID, GID)
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# Испольуем SASL для аутентификации
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes

# Обязательно наличие HELO
smtpd_helo_required = yes

# Отбрасываем тормозов
smtpd_delay_reject = yes

# Команда VRFY помогает злоумышленникам подбирать адреса (можно узнать о существовании адреса)
disable_vrfy_command = yes

# Отсекаем на уровне HELO. Разрешаем всех из mynetworks и успешно аутентифицированных, режем всех, кто представляется инвалидным именем
smtpd_helo_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_invalid_hostname
permit

# Отсекаем на уровне MAIL FROM. Разрешаем аутентифицированных и из наших подсетей, режем всех, кто представляется не FQDN или неизвестным нам доменом (не пошлют письмо с обратным адресом billi@gates.ass и подобным.
smtpd_sender_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_non_fqdn_sender
reject_unknown_sender_domain
permit

# Отсекаем на уровне RCPT TO. Разрешаем аналогично. Режем всех, кто шлёт письма в потоке, а так же когда адрес назначения не соответствует нашему серверу или FQDN-записи.
smtpd_recipient_restrictions =
reject_unauth_pipelining
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
reject_non_fqdn_recipient
permit

# Отсекаем на уровне DATA. Разрешаем аналогично, режем всех, кто шлет в потоке.
smtpd_data_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_pipelining
permit

# Отсекаем на уровне End data, режем всех, кто осуществляет множественную пересылку от пустого имени.
smtpd_end_of_data_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_multi_recipient_bounce
permit

virtual_create_maildirsize = yes
virtual_maildir_extended = yes
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
virtual_transport = dovecot

Шаг 9. Создаем SSL-сертификат

Переходим в каталог с postfix (по умолчанию это /etc/postfix/, ну вы знаете уже)

# cd /etc/postfix

Генерируем сертификат

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

Начнутся допросы с пристрастием, отвечаем честно, то есть первое, что придёт в голову. Важно только предпоследнее поле, туда указываем то имя хоста, что у нас в конфиге postfix-а:

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Sakhalin isl.
Locality Name (eg, city) []:Yuzhno-Sakhalinsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Litl-admin Ltd
Organizational Unit Name (eg, section) []:My Mail Service
Common Name (eg, YOUR name) []:litl-admin.ru
Email Address []:root@litl-admin.ru

Вот и всё. 🙂 Не забываем защитить сертификат от посягательств:

# chmod o= /etc/postfix/smtpd.key

Шаг 9. Учим saslauthd работать с MySQL

Создаем директорию для saslauthd

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

Начинаем редактировать файл /etc/default/saslauthd, предварительно создав его резервную копию. Вообще, поверьте, перед любым редактированием конфига полезно сделать его резервную копию:

# cp -a /etc/default/saslauthd /etc/default/saslauthd.old

Содержимое конфига /etc/default/saslauthd:

START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Вслед за этим создаем файл /etc/pam.d/smtp и вставляем в него строки:

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

Далее, создаем файл /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: postfixadmin
sql_passwd: postfixpassword
sql_database: mail
sql_select: select password from users where email = '%u'

Аналогичным образом, защищаем эти файлы:

# chmod o= /etc/pam.d/smtp
# chmod o= /etc/postfix/sasl/smtpd.conf

Ну и добавим пользователя в группу:

# adduser postfix sasl

Шаг 10. Конфигурируем Dovecot

Для этого открываем файл /etc/postfix/master.cf и дописываем в конец:

dovecot unix - n n - - pipe
flags=DRhu user=virtualmail:virtualmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Редактируем конфиг dovecot (разумеется, сделав бэкап):

# cp -a /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.old

Открываем этот файл и записываем в него (предварительно грохнув всё, что там есть)

# cat /dev/null > /etc/dovecot/dovecot.conf

Содержимое файла /etc/dovecot/dovecot.conf:

protocols = imap imaps pop3 pop3s
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/virtualmail/%d/%n/Maildir

ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem

namespace private {
separator = .
prefix = INBOX.
inbox = yes
}

protocol lda {
log_path = /home/virtualmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = root@litl-admin.ru
mail_plugins = sieve
global_script_path = /home/virtualmail/globalsieverc
}

protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}

auth default {
user = root

passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}

userdb static {
args = uid=5000 gid=5000 home=/home/virtualmail/%d/%n allow_all_users=yes
}

socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = virtualmail
}

client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}

Далее, редактируем файл /etc/dovecot/dovecot-sql.conf, предварительно сделал резервную копию.

# cp -a /etc/dovecot/dovecot-sql.conf /etc/dovecot/dovecot-sql.conf.old

driver = mysql
connect = host=127.0.0.1 dbname=mail user=postfixadmin password=postfixpassword
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

Защищаем конфиги dovecot-а (он будет пахать под учеткой виртуальной почты):

# chgrp virtualmail /etc/dovecot/dovecot.conf
# chmod g+r /etc/dovecot/dovecot.conf

Для нормальной работы Postfix требуются почтовые алиасы (синонимы), редактируем файл /etc/aliases:

postmaster: root
root: root@litl-admin.ru

После того, как сохранили все нужные алиасы, перестраиваем файл алиасов так:

# newaliases

Ну и рестартнем MTA и все сопутствующие сервисы:

# service postfix restart
# service saslauthd restart
# service dovecot restart

Все логи можно смотреть в /var/log/mail.log, предварительно очистим, чтобы не мельтешили лишние записи:

# cat /dev/null > /var/log/mail.log