Почтовая система на базе CentOS

ISP Mail Server With Virtual Users/Domains On Centos 5.0 Using Postfix, Dovecot, MySQL, phpMyAdmin, TLS/SSL — практическое применение и перевод этой статьи в упрощенке.

Лично я решил попробовать. Получилось. И очень даже ничего. Буду приводить свои конфиги, они немного видоизменненые, в отличие от оригинальных.

Ну как стало понятно нам понадобиться: Postfix, Dovecot, MySQL, phpMyadmin, Postfixadmin, Web server Apache + PHP, TLS/SSL (поддержка безопасного соединения).

Итак приступим, будем считать что базовая настройка свеже-установленного сервера проделана.

  1. Hostname (имя нашей машины в сети, выводиться по команде в консоли hostname) with ip adress (соответствующее нашему ip адресу). В моем случае ns1.kipalex.ru 192.168.1.2.
  2. В статье говориться что необходимо создать алиас на устройство, с другим адрессом, зачем? Я не делал.
  3. Ну и все это хозяйство надо прописать в файле /etc/hosts.

127.0.0.1         localhost.localdomain localhost
192.168.1.2     ns1.kipalex.ru kipalex.ru
192.168.0.1     ns1.kipalex.ru kipalex.ru

Ставим необходимые нам пакеты.

yum -y install cyrus* (Поддержка SASL)

После того как все пакеты вместе с зависимостями установились. Проверяем все ли есть.

rpm -qa | grep cyrus

Вот что должно быть установленно:

cyrus-sasl-sql-2.1.22-4
cyrus-sasl-gssapi-2.1.22-4
cyrus-sasl-lib-2.1.22-4
cyrus-sasl-plain-2.1.22-4
cyrus-sasl-2.1.22-4
cyrus-sasl-devel-2.1.22-4
cyrus-imapd-perl-2.3.7-2.el5
cyrus-imapd-2.3.7-2.el5
cyrus-sasl-ldap-2.1.22-4
cyrus-sasl-md5-2.1.22-4
cyrus-imapd-devel-2.3.7-2.el5
cyrus-imapd-utils-2.3.7-2.el5
cyrus-sasl-ntlm-2.1.22-4

Устанавливаем библиотеку openssl для поддержки TLS.

yum install -y openssl openssl-devel mod_ssl

Проверяем:

rpm -qa | grep openssl

openssl097a-0.9.7a-9
openssl-perl-0.9.8b-10.el5
openssl-0.9.8b-10.el5
openssl-devel-0.9.8b-10.el5

Ставим IMAP сервер:

yum install -y dovecot

Дальше по статье говориться про то как собрать Postfix  с поддержкой MySQL.

Скачиваем Postfix, разархифируем, заходим в директорию и делаем:

make makefiles \
CCARGS=’-DUSE_SASL_AUTH -DHAS_SSL -DHAS_MYSQL -DHAS_LDAP -DUSE_CYRUS \
-I/usr/include/sasl -I/usr/include/openssl \
-I/usr/include/mysql -I/usr/include’ \
AUXLIBS=’-L/usr/lib -L/usr/lib/openssl/engines \
-L/usr/lib/mysql -L/usr/lib \
-lsasl2 -lcrypto -lssl -lmysqlclient -lz -lm -lldap -llber \
-Wl,-rpath /usr/lib/mysql -Wl,-rpath /usr/lib \
-Wl,-rpath /usr/lib/openssl/engines’

Предварительно убедившись что стоит db4-packages.

Я правда этого пункта не делал. 😆 . В репозитарии centosplus уже есть собраный пакет с поддержкой MySQL, ну я им и воспользовался.

Все установка законченна. Приступаем к конфигурированию.

Изменим файл /usr/lib/sasl2/smtpd.conf.

pwcheck_method: saslauthd
mech_list: plain login

Создадим директорию для хранения наших ключей и сертификатов.

mkdir -p /etc/postfix/ssl/mailserver
cd /etc/postfix/ssl/mailserver
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Все сгенерировали как надо, на основе наших данных из файла /etc/hosts.

Далее займемся БД MySQL, считаем, что она у нас стоит и настроена правильно.

mysql -u root -p

CREATE DATABASE mail;

GRANT ALL PRIVILEGES ON mail.* TO ‘mail’@’localhost’ IDENTIFIED BY ‘mail’;
FLUSH PRIVILEGES;
quit

mysqladmin -u mail password newpassword

mysql -u mail -p

show databases;

USE mail;

Создаем таблицу доменов:

CREATE TABLE domain ( domain varchar(255) NOT NULL default », description varchar(255) NOT NULL default », aliases int(10) NOT NULL default ‘0’, mailboxes int(10) NOT NULL default ‘0’, maxquota int(10) NOT NULL default ‘0’, transport varchar(255) default NULL, backupmx tinyint(1) NOT NULL default ‘0’, created datetime NOT NULL default ‘0000-00-00 00:00:00’, modified datetime NOT NULL default ‘0000-00-00 00:00:00’, active tinyint(1) NOT NULL default ‘1’, PRIMARY KEY (domain), KEY domain (domain) ) TYPE=MyISAM COMMENT=’ Virtual Domains’;

Создаем таблицу почтовых ящиков:

CREATE TABLE mailbox ( username varchar(255) NOT NULL default », password varchar(255) NOT NULL default », name varchar(255) NOT NULL default », maildir varchar(255) NOT NULL default », quota int(10) NOT NULL default ‘0’, domain varchar(255) NOT NULL default », created datetime NOT NULL default ‘0000-00-00 00:00:00’, modified datetime NOT NULL default ‘0000-00-00 00:00:00’, active tinyint(1) NOT NULL default ‘1’, PRIMARY KEY (username), KEY username (username) ) TYPE=MyISAM COMMENT=’Virtual Mailboxes’;

Создаем таблицу псевдонимов (алиасов):

CREATE TABLE alias ( address varchar(255) NOT NULL default », goto text NOT NULL, domain varchar(255) NOT NULL default », created datetime NOT NULL default ‘0000-00-00 00:00:00’, modified datetime NOT NULL default ‘0000-00-00 00:00:00’, active tinyint(1) NOT NULL default ‘1’, PRIMARY KEY (address), KEY address (address) ) TYPE=MyISAM COMMENT=’Virtual Aliases’;

Выходим:

quit

Теперь нам необходимо создать файл:

/etc/postfix/mysql_virtual_alias_maps.cf

Со следующим содержимым:

user = mail
password = mail
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = ‘1’
#query = SELECT goto FROM alias WHERE address=’%s’ AND active = ‘1’

Создадим файл /etc/postfix/mysql_virtual_domains_maps.cf

Со следующим содержимым:

user = mail
password = mail
hosts = localhost
dbname = mail
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/mysql_virtual_mailbox_maps.cf

Со следующим содержимым:

user = mail
password = mail
hosts = localhost
dbname = mail
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/mysql_virtual_mailbox_limit_maps.cf

Со следующим содержимым:

user = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = ‘1’
#query = SELECT quota FROM mailbox WHERE username=’%s’ AND active = ‘1’

Присвоим права и владельца дадим на наши конфигурационные файлы:

chown root:postfix *.cf
chmod 644 *.cf

Теперь займемся непосредственно шапкой нашего postfix, его главным конфигурационным файлом.

Сделаем резервную копию:

mv /etc/postfix/main.cf /etc/postfix/main.cf.orig

Все внутри него удаляем и добавляем следующее:

############## Postfix###############
#Date Modified 17th June 2008
#—————————————
smtpd_banner = $myhostname
biff = no
append_dot_mydomain = no
relayhost =
mynetworks = 192.168.0.0/24
inet_interfaces = all
mailbox_size_limit = 0
recipient_delimiter = +
alias_database = hash:/etc/postfix/aliases
alias_maps = $alias_database
myhostname = ns1.kipalex.ru
mydomain = rnd
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, $transport_maps
mail_spool_directory = /var/spool/mail
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
disable_vrfy_command = no
#readme_directory = /usr/share/doc/postfix-2.2.10/README_FILES
#sample_directory = /usr/share/doc/postfix-2.2.10/samples
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 450
####################postfix section ends here###############

В строчке inet_interfaces — надо указать all, т.е все интерфейсы, а то может некоректно заработать.

Создадим пользователя и группу от имени которой будет все у на с работать:

useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c «Virtual mailbox» vmail
chmod 770 /var/vmail/ (создать директорию если еще не созданна)
chown vmail:mail /var/vmail

И подрихтуем наш postfix main.cf

#######################Virtual Domains Users and mailboxes###############
virtual_mailbox_domains =

mysql:$config_directory/mysql_virtual_domains_maps.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps =

mysql:$config_directory/mysql_virtual_mailbox_maps.cf
virtual_alias_maps =

mysql:$config_directory/mysql_virtual_alias_maps.cf
virtual_minimum_uid = 150
virtual_uid_maps = static:150
virtual_gid_maps = static:12
##############################Virtual section of main.cf ends##############

Так вот тут надо повнимательней, у меня postfix отказался пускаться, ибо номера групп и пользователей надо посмотреть на свои.

Ну и добавим поддержку TLS/SASL

#################### SASL/TLS Authentication###########################
######SASL PART#########
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_recipient_restrictions = permit_sasl_authenticated,

permit_mynetworks, reject_unauth_destination
######TLS PART###########
smptpd_tls_cert_file = /etc/postfix/ssl/mailserver/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/mailserver/smtpd.key
smtpd_tls_CAfile = /etc/postfix/ssl/mailserver/cacert.pem
smtp_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_received_header = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
tls_random_source = dev:/dev/urandom
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_recieved_header = yes
###########################SASL/TLS Authentication ends here#############

Копирнем базу данный аллиасов к нам и пересоздадим БД:

cp /etc/aliases* /etc/postfix/

newaliases

Теперь нас ждет Dovecot. Создадим файл /etc/dovecot-mysql.conf, со следующим содержимым:

######dovecot-mysql.conf should look like this##########
# NOTE: ‘\’ line splitting is used only for readability, currently Dovecot doesn’t support it
# The mysqld.sock socket may be in different locations in different systems
driver = mysql
default_pass_scheme = plain
#connect = host=/var/run/mysqld/mysqld.sock dbname=mail user=root password=default
# Alternatively you can connect to localhost as well:
connect = host=localhost dbname=mail user=mail password=pass
password_query = SELECT password FROM mailbox WHERE username = ‘%u’
user_query = SELECT ‘/var/vmail/%d/%n@%d’ as home, ‘maildir:/var/vmail/%d/%n@%d’ as mail, 150 AS uid, 12 AS gid,

concat(‘dirsize:storage=’,quota) AS quota FROM mailbox WHERE username =’%u’ AND active =’1′
####################ends here####################

Сделаем бэкап конфига сервера:

cp -p /etc/dovecot.conf /etc/dovecot.conf.orig

Удаляем все в файле, и добавляем новое содержимое:

##############dovecot configured to work with virtual users############
base_dir = /var/run/dovecot/
protocols = imap pop3 imaps pop3s
listen = [::]
login_dir = /var/run/dovecot-login
mail_location = mbox:/var/vmail/%d/%n@%d
mbox_read_locks = fcntl
log_timestamp = «%Y-%m-%d %H:%M:%S »
log_path = /var/log/maillog
mail_access_groups = mail
first_valid_uid = 150
last_valid_uid = 150
maildir_copy_with_hardlinks = yes
auth default {
mechanisms = plain login cram-md5
userdb sql {
args = /etc/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
}
####################################ends here######################

Дадим права и назначим владельца:

chmod 600 /etc/dovecot/*.conf
chown vmail /etc/dovecot/*.conf

Все ставим Postfixadmin, при желании Roundcube, рихтуем под свои нужды apache сервер и наслаждаемся…

Выполняем:

chkconfig -level 235 mysqld on
chkconfig -level 235 saslauthd on
chkconfig -level 235 postfix on
chkconfig -level 235 dovecot on
chkconfig -level 235 httpd on
/etc/init.d/saslauthd start
/etc/init.d/mysqld start
/etc/init.d/postfix start
/etc/init.d/dovecot start
/etc/init.d/httpd start

И получаем удовлетворение.

Ну а теперь проверим работу:

[root@ns1 etc]# postconf -m
btree
cidr
environ
hash
ldap
mysql
nis
pcre
pgsql
proxy
regexp
static
unix

Telnet запустим:

[root@ns1 etc]# telnet ns1.kipalex.ru 25
Trying 192.168.1.2…
Connected to kipalex.ru (192.168.1.2).
Escape character is ‘^]’.
220 ns1.kipalex.ru
EHLO kipalex.ru
250-ns1.kipalex.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN DIGEST-MD5 GSSAPI CRAM-MD5 LOGIN NTLM
250-AUTH=PLAIN DIGEST-MD5 GSSAPI CRAM-MD5 LOGIN NTLM
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

Аналогично проверяем работу IMAP сервера:

telnet ns1.kipalex.ru 143

Ставим phpmyadmin, хотя его надо было ставить в самом начале. 😉

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

Если что писать и семафорить на контакты указанные на сайте…

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

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

Поделиться ссылкой:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.