Как я настраивал себе сервер на 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. Будьте внимательны при создании и редактировании конфигурационных файлов.
Добавить комментарий