Как я настраивал себе сервер на FreeBSD (часть 5)

Наступил 2013 год. Мы пережили конец света, причем без бункера, новый год и, конечно же, сессию! Думаю, это неплохие новости, к тому же компания Valve порадовала нас переходом к открытому Beta-тестированию Steam. Ну а пока появилось свободное время, грех не вернуться к любимому делу и не закончить начатое. Наш сервер почти готов, думаю, что основные статьи можно будет закончить на настройке почтового сервера. А в следующих статьях - установка и настройка DNS и etc... Настройка почтового сервера разбита на 2 части.

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

Сначала обновим порты:

sudo portsnap fetch update

Далее установим postfix:

cd /usr/ports/mail/postfix && sudo make config

Выбираем пункты: PCRE, DOVECOT, MYSQL.

И как обычно после этого выполняем:

sudo make install clean

В процессе установки установщик предложит нам сконфигурировать и инсталировать Dovecot:

В конце же установки будет задан вопрос:

Would you like to activate Postfix in /etc/mail/mailer.conf [n]?

На него отвечаем - Y.

После установки идем править следующие файлы конфигурации. Для начала отключим sendmail, чтобы не было конфликтов. Для этого в /etc/rc.conf добавляем следующее:

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

Теперь займемся postfix:

sudo vi  /usr/local/etc/postfix/main.cf

Приводим все примерно к такому виду:

queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
mail_owner = postfix
myhostname = home-server
myorigin = $myhostname
inet_interfaces = all
local_recipient_maps = unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = host
mynetworks = 192.168.0.0/28, 127.0.0.0/8
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
smtpd_banner = $myhostname ESMTP $mail_name
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
inet_protocols = ipv4
virtual_mailbox_base = /usr/mail/
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid             = 150
virtual_uid_maps                = static:150
virtual_gid_maps                = static:150
virtual_transport               = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

при этом заменяя на свои значения hostname и mynetworks.

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

mysql --user root --password
Enter password:

mysql> create database postfix;
Query OK, 1 row affected (0.00 sec)

Создадим отдельного пользователя - postfix, пароль - postfixpass, с полными правами для этой БД:

mysql> grant all on postfix.* to postfix@localhost identified by 'postfixpass';
Query OK, 0 rows affected (0.00 sec)

Нужные нам таблицы:

mysql> use postfix;
Database changed

mysql> CREATE TABLE `virtual_domains` (
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name VARCHAR(50) NOT NULL
    -> ) ENGINE = InnoDB;
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE `virtual_users` (
    -> id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> domain_id INT(11) NOT NULL,
    -> user VARCHAR(40) NOT NULL,
    -> password VARCHAR(32) NOT NULL,
    -> CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
    -> FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE = InnoDB;
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE `virtual_aliases` (
    -> id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> domain_id INT(11) NOT NULL,
    -> source VARCHAR(40) NOT NULL,
    -> destination VARCHAR(80) NOT NULL,
    -> FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
    -> ) ENGINE = InnoDB;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye

Ну и конечно, нужно создать почтовый домен и почтовые ящики. Но я хочу содержать на своем сервере несколько доменов, скажем домены domain.ru, domain2.ru и domain3.ru:

mysql -u postfix -p
Enter password:

mysql> use postfix;
Database changed

mysql> INSERT INTO virtual_domains (id, name) VALUES (1, 'domain.ru');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO virtual_domains (id, name) VALUES (2, 'domain2.ru');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO virtual_domains (id, name) VALUES (3, 'domain3.ru');
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye

Теперь создадим и почтовые ящики:

mysql> INSERT INTO virtual_users (id, domain_id, user, password) VALUES (1, 1, 'total', MD5('074dimchel'));
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO virtual_users (id, domain_id, user, password) VALUES (2, 3, 'total', MD5('074dimchel'));
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO virtual_users (id, domain_id, user, password) VALUES (3, 2, 'total', MD5('074dimchel'));
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO virtual_users (id, domain_id, user, password) VALUES (4, 2, 'test', MD5('testpass'));
Query OK, 1 row affected (0.01 sec)

Как видите, (2, 3, 'total', MD5('074dimchel')) первая цифра, это порядковый номер записи в таблице virtual_users, а вторая обозначает порядковый номер домена в таблице virtual_domains. 'total' - логин, то есть, то что стоит перед @, MD5 - метод шифрования пароля, а '074dimchel' соответственно сам пароль.

Теперь создадим файл /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf со следующим содержанием:

user = postfix
password = postfixpass
hosts = localhost
dbname = postfix
query = SELECT 1 FROM view_users WHERE email='%s'

Где, user - это логин в mysql, который мы создали раньше, а password - пароль к нему. dbname - имя БД, где хранятся наши данные. Создадим также так называемую таблицу view (запрос, берущий данные из нескольких таблиц) для ящиков:

mysql> CREATE VIEW view_users AS
    -> SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email,
    -> virtual_users.password
    -> FROM virtual_users
    -> LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
Query OK, 0 rows affected (0.01 sec)

Следом проверим правильность, вы должны увидеть, примерно, это:

mysql> SELECT * FROM view_users;
+-----------------------+----------------------------------+
| email                 | password                         |
+-----------------------+----------------------------------+
| total@domain.ru  | db10cb6edcbe2d9a7ae1012c5ab1e2db |
| total@domain3.ru | db10cb6edcbe2d9a7ae1012c5ab1e2db |
| total@domain2.ru | db10cb6edcbe2d9a7ae1012c5ab1e2db |
| test@domain2.ru  | 179ad45c6ce2cb97cf1029e212046e81 |
+-----------------------+----------------------------------+
4 rows in set (0.00 sec)

Нужно создать алиасы (используется для пересылки с одного или нескольких адресов на другой). Опять же логинимся в mysql, выбираем БД postfix и выполняем:

mysql> INSERT INTO virtual_aliases (id, domain_id, source, destination) VALUES (1, 3, 'total', 'total@hdomain.ru'),(2, 2, 'total', 'total@domain.ru');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

Итак, здесь мы указали, что с ящика total@domain3.ru вся почта будет пересылаться на total@domain.ru (первая цифра - это id в таблице virtual_aliases, вторая - id домена в virtual_domains и total - это имя почтового ящика (логин). Ну и с total@domain2.ru будет тоже пересылаться на total@domain.ru.

Теперь view для алиасов:

mysql> CREATE VIEW view_aliases AS
    -> SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email,
    -> destination
    -> FROM virtual_aliases
    -> LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM view_aliases;
+-----------------------+----------------------+
| email                 | destination          |
+-----------------------+----------------------+
| total@domain3.ru | total@domain.ru |
| total@domain2.ru | total@domain.ru |
+-----------------------+----------------------+
2 rows in set (0.01 sec)

Проверим правильность настроек, если все сделали правильно, должны увидеть единицу:

postmap -q domain.ru mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_domains.cf
1
postmap -q total@domain.ru mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
1

Если все верно, идем дальше. Нужно создать файл /usr/local/etc/postfix/mysql_virtual_alias_maps.cf со следующим содержимым:

user = postfix
password = postfixpass
hosts = localhost
dbname = postfix
query = SELECT destination FROM view_aliases WHERE email='%s'

Проверим, вывод должен быть "total@domain.ru":

postmap -q total@domain2.ru mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
total@domain.ru
postmap -q total@domain3.ru mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
total@domain.ru

Создадим на сегодня последний файл - /usr/local/etc/postfix/mysql_email2email.cf:

user = postfix
password = postfixpass
hosts = localhost
dbname = postfix
query = SELECT email FROM view_users WHERE email='%s'

Добавим в самый конец файла /usr/local/etc/postfix/master.cf:

dovecot unix - n n - - pipe flags=DRhu user=sermail:sermail argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

Для проверки правильности конфигурационных файлов выполним:

sudo postfix check

Если все правильно, он просто перейдет на новую строку. Перезапустим postfix:

sudo postfix reload

На сегодня все. В следующей статье рассмотрим настройку dovecot и шифрование. Если будут вопросы, не стесняйтесь задавать их в комментариях.

P.S. Будьте внимательны при создании и редактировании конфигурационных файлов.

Добавить комментарий