Настраиваем почтовый сервер на базе CentOS+Postfix
Друзья, опять статья крутится вокруг переезда ресурсов на новую площадку. Скажу сразу, сегодня речь пойдет о том, чего я не любил, не люблю, и не буду, наверное, любить всю жизнь, а именно о настройке почтового сервера.
Да, изначально не сложилось у меня с ними, каждый раз когда дело доходит до дела, начинается секс, пляски с бубном и прочие камлания, да и внятных мануалов тоже немного в сети. Сколько не искал, в основном вся документация идет под FreeBSD да под Ubuntu\Debian Linux, что вобщем-то и понятно дистрибутывы-то распространены. А вот под CentOS и иже с ним документации мало, хотя, вполне и вероятно что я плохо искал, но не суть… Мануал под CentOS был найден, вот ссылка, bezha.od.ua, но мануал в целом оказался очень кривым, и если делать все по нему, не заработает ничего в принципе. Проверено! Но данный мануал все-таки стал отправной точкой в написании этой статьи, и отталкиваясь от него, со своими дополнениями, сегодня мы все-таки настроим собственный почтовый сервер с виртуальными доменами, виртуальными пользователями, postfixadmin-ом и веб-мордой roundcubemail.
Итак, перейдем к от слов к делу. Изначально разработаем ТЗ, ну или не ТЗ, а просто определим круг задач и функционал сервера. Также определимся с компонентами компонентами нашего сервера. Но, начнем по порядку!
Круг задач и функционал
Изначально почта для вcех моих доменов крутилась на pdd.yandex.ru, и вобщем-то все меня устраивало, но я привык держать сервер под контролем сам, не передавая ни каму своей лично переписки, тем более на бесплатных началах, поэтому, решено было переносить почту на свой сервер. По функционалу потребовались
- Виртуальные домены
- Виртуальные пользователи
- Веб интерфейс администрирования
- Веб интерфейс для конечного пользователя
- Хранение информации о пользователях и доменах в базе данных
- Полная бесплатность, GPL
Следовательно мною стал подбираться софт, отвечающий данным требованиям.
Компоненты почтового сервера
Изначально, серверной системой была выбрана CentOS в силу своей гибкости, удобства настройки и конфигурирования. Поэтому на ней и будет разворачиваться почтовик. Ну и пробежимся по компонентам:
- Система — CentOS Linux 5.5 x86
- SMTP — Postfix
- POP3\IMAP — Dovecot
- База данных — MySQL
- Администрирование — PostfixAdmin
- Пользовательский интерфейс — Roundcube Mail
Все программное обеспечение — OpenSource. что подразумевает отсутствие проблем с законностью и лицензионностью.
Как работает электронная почта?
На данном рисунке наглядно показано, как все же работает электронная почта, или к чему нам необходимо стремиться настраивая собственный почтовый сервер.
Вместо предисловия
В моем случае почтовый сервер ставится уже на настроенный CentOS, но, если вы ставите на чистую систему, то советую вам до начала установки прочитать следующие статьи:
- Если вы хотите поставить почту на VPS\VDS — читаем как установить и настроить собственный сервер виртуализации
- Установка web-сервера — читаем статью про установку фронтенда и бекенда nginx + apache
- Если вам нужна скорость и легкость работы web сервера — читаем статью про полный отказа от Apache в пользу Nginx с использованием PHP-FPM
- Хотите настроить производительность MySQL — читайте статью о тонкой настройке MySQL
Так, вроде бы ни о чем не забыл упомянуть…
Подготовка
Для начала удалим sendmail из системы:
1 | service sendmail stop && yum -y remove sendmail |
Подключим репозитории EPEL и CentALT:
1 2 | rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm |
Далее пересобираем кеш репозиториев, обновляем систему до последних обновлений:
1 | yum makecache && yum -y update |
После данных манипуляций приступаем к самой установке и настройке.
Установка MySQL сервера
Если у вас чистая система, и не стоит MySQL сервер, то ставим его и настраиваем его по соответствующей статье:
1 2 | yum -y install mysql mysql-server php-mysql chkconfig mysqld on && service mysqld start |
Далее пойдет первоначальная настройка сервера скриптом безопасной установки:
1 2 3 4 5 6 7 8 9 | /usr/bin/mysql_secure_installation Change the root password? [Y/n] Remove anonymous users? [Y/n] Disallow root login remotely? [Y/n] Remove test database and access to it? [Y/n] Reload privilege tables now? [Y/n] All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! |
С помощью данного скрипта мы сделали следующее:
- Задали пароль для супер пользователя root, т.к. по умолчанию у него пароль отсутсвует
- Удалили анонимного пользователя
- Запретили root подключаться к базе данных удаленно, ограничив его localhost-ом
- Удалили тестовую базу test и доступ к ней
Создаем базу данных postfix и пользователя postfix:
1 2 3 4 5 | mysql -p mysql; CREATE DATABASE postfix; mysql; CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'password'; mysql; GRANT ALL PRIVILEGES ON `postfix`.* TO 'postfix'@'localhost'; mysql; quit; |
Сервер установлен, настроен, база и пользователь созданы, двигаемся дальше!
Установка Postfix
Ставим Postfix:
1 | yum -y install postfix |
Проверяем, есть ли поддержка mysql:
1 2 | postconf -m | grep mysql mysql |
Добавляем postfix в автозагрузку, стартуем его:
1 | chkconfig postfix on && service postfix start |
Редактируем /etc/postfix/main.cf:
1 2 3 4 5 6 7 8 9 10 | soft_bounce = no default_privs = nobody myhostname = mail.domain.ru mydomain = mail.domain.ru myorigin = $mydomain inet_interfaces = all local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps mynetworks = 127.0.0.0/8 mail_spool_directory = /var/spool/mail debug_peer_list = 127.0.0.1 |
И получаем промежуточный вариант /etc/postfix/main.cf:
1 | grep -v -E "#|^$" main.cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | soft_bounce = no queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix default_privs = nobody myhostname = mail.domain.ru mydomain = mail.domain.ru myorigin = $mydomain inet_interfaces = all inet_protocols = all mydestination = $myhostname, localhost.$mydomain, localhost local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps unknown_local_recipient_reject_code = 550 mynetworks = 127.0.0.0/8 alias_maps = hash:/etc/aliases mail_spool_directory = /var/spool/mail debug_peer_level = 2 debug_peer_list = 127.0.0.1 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.7.2/samples readme_directory = /usr/share/doc/postfix-2.7.2/README_FILES config_directory = /etc/postfix |
Далее настраиваем postfix для работы с виртуальными доменами и виртуальными пользователями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | virtual_mailbox_domains = mysql:$config_directory/sql/vdomains.cf virtual_mailbox_base = /var/vmail virtual_mailbox_maps = mysql:$config_directory/sql/vmailbox.cf virtual_alias_maps = mysql:$config_directory/sql/valias.cf virtual_minimum_uid = 1000 virtual_uid_maps = static:1000 virtual_gid_maps = static:12 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 |
Описываем SMTP авторизацию:
1 2 3 4 5 | smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unverified_recipient |
Далее создаем sql директорию и необходимые конфиги:
1 | mkdir /etc/postfix/sql |
Создаем конфиг виртуальных доменов /etc/postfix/sql/vdomains.cf :
1 2 3 4 5 6 7 8 9 | user = postfix password = password hosts = localhost dbname = postfix table = domain select_field = domain where_field = domain #!!! ВНИМАНИЕ !!! ниже приведенная строка записывается в одну строчку!!! additional_conditions = and backupmx = '0' and active = '1' query = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0' AND active='1' |
Создаем конфиг виртуальных почтовых ящиков /etc/postfix/sql/vmailbox.cf :
1 2 3 4 5 6 7 8 9 10 | user = postfix password = password hosts = localhost dbname = postfix table = mailbox select_field = CONCAT(domain,'/',maildir) where_field = username #!!! ВНИМАНИЕ !!! ниже приведенная строка записывается в одну строчку!!! additional_conditions = and active = '1' query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1' |
Создаем конфиг виртуальных алиасов /etc/postfix/sql/valias.cf :
1 2 3 4 5 6 7 8 9 | user = postfix password = password hosts = localhost dbname = postfix table = alias select_field = goto where_field = address additional_conditions = and active = '1' query = SELECT goto FROM alias WHERE address='%s' AND active = '1' |
Основная настройка завершена. Далее на очереди master.cf конфиг. Для начала выбросим из него всякий закомментированный шлак:
1 | grep -v -E "#|^$" master.cf |
Определим Dovecot локальным транспортом, добавим в самый конец master.cf следующую строку:
1 2 | dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient) |
!!! ВНИМАНИЕ !!! Postfix очень чувствителен к пробелам и всякой прочей лаже, поэтому после добавления вышеуказанных строк расставьте все символы в соответсвии с конфигом, строку flags необходимо отступить от края на 2 пробела, проверено, работать не будет, если вы этого не сделаете, будет ругаться на отсутствие пользователя vmail.
Далее создаем пользователя vmail с группой mail, с UID 1000 и домиком /var/vmail
На всякий пожарный ручками добавляем права на директорию /var/vmail, т.к. не всегда postfix из-за этого корректно отрабатывает:
1 2 | chown -R vmail:mail /var/vmail chmod -R 777 /var/vmail |
Установка Dovecot
Ставим Dovecot и добавляем его в автозагрузку:
1 2 | yum -y install dovecot chkconfig dovecot on |
Открываем /etc/dovecot.conf и приводим его к следующему виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | base_dir = /var/run/dovecot/ protocols = imap pop3 protocol imap { listen = *:143 } protocol pop3 { listen = *:110 } log_timestamp = "%Y-%m-%d %H:%M:%" syslog_facility = mail mail_location = maildir:/var/vmail/%d/%u first_valid_uid = 1000 last_valid_uid = 1000 maildir_copy_with_hardlinks = yes protocol imap { login_executable = /usr/libexec/dovecot/imap-login mail_executable = /usr/libexec/dovecot/imap imap_max_line_length = 65536 } protocol pop3 { login_executable = /usr/libexec/dovecot/pop3-login mail_executable = /usr/libexec/dovecot/pop3 pop3_uidl_format = %08Xu%08Xv } protocol lda { postmaster_address = postmaster@mail.domain.ru sendmail_path = /usr/lib/sendmail auth_socket_path = /var/run/dovecot/auth-master } auth_verbose = yes auth_debug = yes auth_debug_passwords = yes auth default { mechanisms = plain passdb sql { args = /etc/dovecot-sql.conf } userdb static { args = uid=1000 gid=12 home=/var/vmail/%d/%u } user = nobody socket listen { master { path = /var/run/dovecot/auth-master mode = 0660 user = vmail group = mail } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postdrop } } } dict { } plugin { } |
1 2 3 4 5 6 7 | driver = mysql connect = host=localhost dbname=postfix user=postfix password=password default_pass_scheme = MD5 # Нижеприведенная строка записывается в одну строчку!!! user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 1000 AS uid, 12 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1' # Нижеприведенная строка записывается в одну строчку!!! password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1000 as userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1' |
Запускаем Postfix и Dovecot:
1 | service postfix start && service dovecot start |
Установка Postfixadmin
Тут все просто, ставится не сложнее любой CMS-ки:
- Создаем папку postfixadmin в директории виртуального хоста web сервера:
1 | mkdir /var/www/vhosts/mail.domain.ru/postfixadmin |
- Качаем отсюда ( я качал исходники )сам PosfixAdmin и распаковываем его в созданную директорию.
- После делаем изменения в файле /var/www/vhosts/mail.domain.ru/postfixadmin/config.inc.php
1 2 3 4 5 | $CONF['configured'] = true; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'password'; $CONF['database_name'] = 'postfix'; |
- После этого заходим по адресу mail.domain.ru/postfixadmin/setup.php и создаем суперпользователя.
- Удаляем setup.php
- Заходим по адресу http://mail.domain.ru/postfixadmin/login.php , логинимся, заводим новый домен, заводим тестовый почтовый ящик test@domain.ru
- Проверяем работоспособность почтового сервера, настроив почтовый клиент на test@domain.ru
Если почта ходит туда и обратно — отлично, если нет, отписываемся в комментариях, будем с вами разбираться.
Ставим Roundcubemail
Roundcubemail клиентский интерфейс почтового ящика, ставится тоже не сложно. Поехали:
- Качаем отсюда Roundcubemail
- Распаковываем его в папку виртуального хоста /var/www/vhosts/mail.domain.ru/
- Подготавливаем необходимые конфиги:
1 2 | cp config/db.inc.php.dist config/db.inc.php cp config/main.inc.php.dist config/main.inc.php |
- Создаем базу данных Roundcubemail:
1 2 3 4 | mysql -p CREATE DATABASE roundcubemail; CREATE USER 'roundcubemail'@'localhost' IDENTIFIED BY 'password'; \q; |
- Правим main.inc.php
1 2 3 4 | $rcmail_config['default_host'] = 'localhost'; $rcmail_config['smtp_server'] = ''; $rcmail_config['enable_installer'] = false; $rcmail_config['enable_installer'] = true; (после установки изменить на false) |
- Правим db.inc.php
1 | $rcmail_config['db_dsnw'] = 'mysql://roundcubemail:password@localhost/roundcubemail'; |
- Ставим необходимые расширения php:
1 | yum -y install php-dom php-intl |
- Запускаем установщик http://mail.domain.ru/installer/
- Выставляем необходимые права на директории:
1 | chmod -R 777 temp logs |
- Инициализируем базу данных нажатием кнопки «Initialize Databese»
- Проверяем отправку и авторизацию стандартными средствами Roundcubemail
- Запрещаем повторную переустановку приложения в main.inc.php:
1 | $rcmail_config['enable_installer'] = false; |
- Удаляем или переименовываем установщик.
- Заходим по адресу mail.domain.ru и наслаждаемся web интерфейсом.
В качестве заключения
Вот собственно и вся настройка почтового сервера. Все задуманное реализовано! Если у вас что-то не получилось, не взлетело, или работает не так. прошу отписываться в комментариях, обязательно помогу разобраться.
Popularity: 100% [?]
Похожие записи:
- Запрещаем NAT пользователям посещать не желательные сайты с помощью iptables в CentOS 5.6
- Боремся с почтовым спамом. Установка и настройка PostGrey к Postfix на CentOS
- Рисуем графики нагрузки Nginx в Cacti
- Nginx rewrite конфиги под популярные CMS, список будет пополняться
- Тюнинг Apache2










Pingback: Боремся с почтовым спамом. Установка и настройка PostGrey. | Technical Laboratory