April 5

Mail server в Debian/Ubuntu

Это полная перепечатка статьи, так как она “то, что надо”.

Я постараюсь подробно описать, как я настраивал mail server, чтобы обеспечить поддержку нескольких доменов, доступ по IMAP и POP3, защищеное соединение, веб-доступ к почте и многое другое. Это будет полезно новичкам в этом деле, да и мне самому, если потребуется повторить процесс…

1. Имя хоста и RDNS

Перед тем, как настраивать почтовый сервер, вам стоит убедиться, что на вашем хостинге правильно настроены названия хоста и RDNS. RDNS позволяет идентифицировать легитимность сервера, и уменьшает шанс того, что ваши письма будут классифицированы, как спам существующими спам-фильтрами.

Для примера, я буду использовать названия доменов domen1.com и domen2.com. Оба этих домена должны быть зарегистрированы и иметь соответствующие ДНС записи (в частности MX записи, необходимые для корректного функционирования почтового сервера)

Проверим имя хоста:
hostname -f

Если оно отличается от доменного имени вашего будущего сервера — требуется его поменять.

Для этого отредактируем два файла:
sudo nano /etc/hostname

Замените существующее имя на mail.domen1.com.

И второй файл:sudo nano /etc/hosts

Так же убедитесь, что старое название хоста изменено на новое.

После изменения названия хоста — перегрузите вашу систему.

Теперь снова проверим имя хоста:

hostname -f

На экран выводится:

mail.domen1.com

Замечательно. Первый шаг выполнен.

Теперь нужно проверить RDNS (reverse DNS). У разных провайдеров это настраивается по разному, в зависимости от особенностей реализации панели управления.

Вы должны прописать соответствие вашего внешнего IP-адреса имени почтового сервера, например mail.domen1.com — 231.123.134.12

Проверить настройки RDNS просто. Установите пакет dnsutils.

sudo aptitude install dnsutils

После установки, выполните проверку:
dig -x 231.123.134.12

Если вывод имеет такие строки,
dig -x 231.123.134.12


;; QUESTION SECTION:
;231.123.134.12.in-addr.arpa. IN PTR
;; ANSWER SECTION:
231.123.134.12.in-addr.arpa. 3477 IN PTR mail.domen1.com.

то все нормально. Можем продолжать.
2. Настройка места физического расположения почты на сервере

Самый простой способ настроить место для хранения почты — создать пользователя vmail с соответствующей группой и назначить ему специфичный userID.

Конечно, в будущем мы настроим MySQL для обеспечения работы сервера с многочисленными пользователями и доменами, но почта не будет храниться в базе данных. База будет использоваться только для поиска соответствующих пользователей и определения деталей доставки почты.

Пользователь vmail создается как обычно, но с некоторым отличием: мы указываем, что пользователь не может логиниться в систему.

Для начала создадим группу vmail:

sudo groupadd -g 5000 vmail

Это команда создает группу vmail и присваивает ее GID (group ID) 5000.

Затем создаем пользователя vmail:

sudo useradd -s /usr/sbin/nologin -g vmail -u 5000 vmail -d /home/vmail -m

Эта команда создает пользователя vmail, чтобы он не мог логиниться в систему, присваивает его группе vmail, а так же создает ему домашнюю директорию /home/vmail
3. Установка сервера Postfix и MySQL

Выполните команду:
sudo aptitude install postfix postfix-mysql mysql-server postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl telnet mailx

Эта команда дополнительно к Postfix и MySQL установит пакеты mailx и telnet, которые будут очень удобны в процессе тестирования настроек.

В процессе установки MySQL сервера потребуется установить (и подтвердить) пароль для администратора (пользователь root).

В процессе установки Postfix сервера вначале система выведет на экран окно с информацией, после чего потребуется выбрать пункт ‘Internet Site’.

postfix1

На следующем окне

postfix2

введите имя вашего почтового домена mail.domen1.com.

Можно протестировать установку почтового сервера. Для этого отправим себе с него постовое сообщение.

Выполните команду:
mail address@example.com

address@example.com должен быть реальным действующим адресом, который вы можете проверить на предмет новой почты.

После нажатия на клавишу ввода потребуется ввести тему сообщения. После следующего нажатия — текст письма. Тест письма любой, можно сколько угодно пользоваться клавишей ввода. Признаком окончания тела письма является символ точки с начала новой строки, с последующим нажатием на клавишу ввод.

Далее система спросит адрес для копий письма, последний ввод, — и письмо отправлено.

mail adress@example.com
Subject: test email from domen1.com
Это, собственно
письмо
с уважением,
Я
.
Cc:

Удобная штучка для отсылки писем в терминале, да? Рекомендую! Это пакет mailx, который мы установили чуть ранее.

Проверяйте ящик adress@example.com. Пришло письмо? Замечательно! Можем двигаться дальше.
4. Настройка базы данных MySQL

Далее будет много текстового ввода в терминале — не пугаемся. Всегда можно воспользоваться копированием через буфер обмена 😉

Для начала создадим базу данных с оригинальным названием — mail.

mysqladmin -u root -p create mail

В процессе выполнения команды система вас попросит ввести пароль администратора MySQL (вы его ввели при инсталляции MySQL).

Далее залогинимся в MySQL и создадим несколько таблиц.

mysql -u root -p

Для начала создадим пользователя БД, для наших целей…

CREATE USER ‘mailadmin’@localhost’ IDENTIFIED BY ‘MyPasswordHere’;

Замените MyPasswordHere на свой собственный пароль.

Далее, дадим этому пользователю необходимые привелегии: SELECT, INSERT, UPDATE, DELETE.

FLUSH PRIVILEGES;
GRANT SELECT, INSERT, UPDATE, DELETE ON `mail` . * TO 'mailadmin'@'localhost';
FLUSH PRIVILEGES;

Теперь мы можем выбрать нашу БД mail и создать необходимые таблицы.

USE mail;

Необходимо создать три таблицы для хранения почтовых доменов, пользователей и деталей доставки сообщений (форвардинг сообщений).

Таблица доменов. В Mysql введите следующие команды:

CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain)
)
TYPE=MyISAM;

Не забываем вводить точку с запятой (;) в конце команды SQL, иначе она не будет выполнена.

Таблица пользователей. Как раньше, введите в MySQL:

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
PRIMARY KEY (email)
)
TYPE=MyISAM;

Таблица форвардинга:

CREATE TABLE forwards (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source)
)
TYPE=MyISAM;

Теперь можно выйти из MySQL:

quit;

Вы вернулись обратно в командную строку терминала.

Не волнуйтесь, что при создании таблицы пользователей поле пароля определено как текстовое. При создании пароля, мы его зашифруем перед записью в таблицу.
5. Настройка Postfix для использования базы данных MySQL

Для того, чтобы Postfix мог использовать таблицы MySQL, необходимо создать несколько настроечных файлов.

Каждый из этих файлов достаточно прост: он содержит название БД, имя, пароль, SQL-запрос и название хоста. Эти файлы подсказывают Postfix-у, как выбирать данные из созданных нами ранее таблиц.
Домены.

Создадим текстовый файл:

sudo nano /etc/postfix/mysql-domains.cf

Введем следующие строки:

user = mailadmin
password = MyPasswordHere
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

Помним: MyPasswordHere надо заменить на введенный при создании пользователя БД mailadmin пароль.
Форвардинг.

Создаем файл:

sudo nano /etc/postfix/mysql-forwards.cf

Заполняем его:

user = mailadmin
password = MyPasswordHere
dbname = mail
query = SELECT destination FROM forwards WHERE source='%s'
hosts = 127.0.0.1

Почтовые ящики.

Каждый домен имеет множество различных почтовых ящиков. Этот скрипт получает правильные характеристики почтового ящика.

sudo nano /etc/postfix/mysql-mailboxes.cf

Содержимое:

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

E-Mail адреса.

И наконец создадим файл адресов.

sudo nano /etc/postfix/mysql-email.cf

Содержимое:

user = mailadmin
password = MyPasswordHere
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

с файлами все.

Эти четыре файла позволят Postfix-у получить доступ к информации в базе данных mail и присвоить корректные данные каждому письму.
Полномочия на файлы

Да, чуть не забыл. Необходимо еще установить правильный доступ к этим файлам:

sudo chmod o= /etc/postfix/mysql-* (другие группы не имеют доступа к файлам.

И сменим владельца:

sudo chgrp postfix /etc/postfix/mysql-*

Postfix должен иметь к ним доступ.
Настройки Postfix

Отредактируем файл настроек Postfix:
sudo nano /etc/postfix/main.cf

Обычно нижняя часть файла выглядит так:
myhostname = mail.domen1.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination =
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

Убедитесь, что mydestination не сделано присвоение.

Добавим ссылки на созданные файлы настроек, чтобы Postfix использовал их в процессе работы. В конец файла добавьте строки:
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-forwards.cf, mysql:/etc/postfix/mysql-email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

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
6. Безопасное соединение — настраиваем Saslauthd

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

Посмотрим основной файл настроек программы:
sudo nano /etc/default/saslauthd

Первым делом надо установить автоматический запуск демона (поменяйте значение на ‘yes’. По умолчанию стоит ‘no’):
# Should saslauthd run automatically on startup? (default: no)
START=yes

Далее нужно изменить некоторые опции в конце файла. По умолчанию они выглядят так:
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
OPTIONS="-c -m /var/run/saslauthd"

Изменим их следующим образом (мы же запускаем Postfix):
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Кстати…Мы только что указали каталог, который не существует в природе. Непорядок. Устраним это:
sudo mkdir -p /var/spool/postfix/var/run/saslauthd
MySQL

Мы же используем MySQL для хранения наших идентификационных данных. Точнее не наших, а пользователей сервера. Значит процесс авторизации должен знать, где брать данные.
Создадим два файла, чтобы процесс мог получить доступ к базе данных и добыть необходимую ему информацию:

sudo nano /etc/pam.d/smtp
Добавим в этот файл следующий текст:
auth required pam_mysql.so user=mailadmin passwd=MyPasswordHere host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mailadmin passwd=MyPasswordHere host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

Это позволит процессу авторизации иметь доступ к БД для проверки пароля и e-mail-а.

И второй файл:
sudo nano /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: mailadmin
sql_passwd: MyPasswordHere
sql_database: mail
sql_select: select password from users where email = '%u'

По моему, тут ничего особо не надо пояснять, текст говорит сам за себя.

Для того, чтобы Postfix мог получить доступ к процессу Saslauthd, добавим пользователя Postfix в группу Saslauthd (Это же Лииинукс!!!) 😉 ).
sudo adduser postfix sasl

Поменяли кучу настроек. Время перезапустить демоны:
sudo /etc/init.d/postfix restart
sudo /etc/init.d/saslauthd restart

Создаем SSL-сертификат

Создадим сертификат безопасности. По умолчанию он будет создан в каталоге /etc/ssl/certs.
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/certs/mailcert.pem

В процессе создания, вам зададут несколько вопросов. Ответить можно, например так:
Country Name — RU
State or Province -
Locality name — Moscow
Organisation Name — MyGreat Company
Organisational Unit Name — Mail
Hostname — mail.domen1.com
Email address — admin@domen1.com

Важно, чтобы Hostname совпадал с именем mail server-а — hostname. В нашем случае, это mail.domen1.com.
Мы создали самоподписанный сертификат здесь:
/etc/ssl/certs/mailcert.pem
Настраиваем Postfix

Теперь требуется отредактировать главный файл настроек Postfix:
sudo nano /etc/postfix/main.cf

Найдите секцию TLS parameters. Настройки по умолчанию в ней выглядят так:
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.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

Стираем их полностью. И вставляем вместо них следующие:
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/mailcert.pem
smtpd_tls_key_file = $smtpd_tls_cert_file

Тем самым мы активировали безопасные соединения, перечислили, какие соединения будем принимать, и, наконец, указали путь к сертификату.
7. Устанавливаем Courier

Courier позволит нам получить POP3 и IMAP доступ к нашей почте.
Установка Courier

Установка достаточна проста, с использованием aptitude:
sudo aptitude install courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl

Во время установки вам будет задан вопрос, нужно ли создать директории. Правильный ответ — НЕТ (это ответ по умолчанию, так что можете просто нажать клавишу ввода)!
Настройка Courier

Для начала отредактируем файл:
sudo nano /etc/courier/authdaemonrc
Поменяйте строку
authmodulelist="authpam"
на
authmodulelist="authmysql"
Понятно для чего, да? Мы же используем MySQL!

Далее редактируем файл с деталями БД:
sudo nano /etc/courier/authmysqlrc

Чтобы не заморачиваться — удалите в нем все содержимое, и вставьте следующее:
MYSQL_SERVER localhost
MYSQL_USERNAME mailadmin
MYSQL_PASSWORD MyPasswordHere
MYSQL_PORT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_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),'/';)

Сохраните файл.
После изменения файлов настроек, требуется рестартовать демоны:
sudo /etc/init.d/courier-authdaemon restart
sudo /etc/init.d/courier-imap restart
sudo /etc/init.d/courier-imap-ssl restart
sudo /etc/init.d/courier-pop restart
sudo /etc/init.d/courier-pop-ssl restart

8. Настраиваем firewall

Не буду здесь описывать настройки файрволла. Они у всех разные… Я например, использую Shorewall, кто-то IPTables… Дело вкуса.
Нужно дать доступ по портам: 25 (SMTP), 110, 995 (POP, POPS), 143, 993 (IMAP, IMAPS).
9. Добавляем домены и пользователей в таблицы БД

Нужно заполнить таблички в MySQL, чтобы все то, что мы настроили ранее заработало.

Логинимся в MySQL:
mysql -u root -p

Выбираем базу данных:
USE mail;

Заполняем таблицу доменов:
INSERT INTO `domains` (`domain`) VALUES ('domen1.com');

Чтобы ввести любой другой домен, выполните аналогичную команду:
INSERT INTO `domains` (`domain`) VALUES ('domen2.com');

Заполняем таблицу пользователей:
INSERT INTO `users` (`email`, `password`) VALUES ('admin@domen1.com', ENCRYPT('secretpassword'));

Остальные пользователи вводятся аналогично:
INSERT INTO `users` (`email`, `password`) VALUES ('kot@domen2.com', ENCRYPT('secretpassword'));

Когда все таблицы заполнены — выходим из ведения БД:
quit;

Перегружаем postfix:
sudo postfix reload

Проверим, работает или нет?
Давайте отправим почтовое сообщение по одному из введенных адресов: admin@domen1.com
mail admin@domen1.com
Введите тело и тему письма и отправьте его адресату. Через какое-то время проверьте папку /home/vmail:
ls /home/vmail

Увидите новый каталог:
/home/vmail/domen1.com
А для каждого пользователя домена domen1.com в папке /home/vmail/domen1.com будет создан собственный каталог с письмами.

Почта уже работает. Остались небольшие дополнения, но о них в следующей статье. Так же в конце мы убедимся, что наш сервер не используется спамерами для несанкционированных рассылок — об этом еще одна статья
Спасибо за внимание.

Tags: ,
Copyright 2021. All rights reserved.

Posted 5 April 2013 by admin in category "simple memo

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.