From: ginger
Newsgroups: Ru.Board (http://ru-board.com)
Date: Mon, 20 Nov 2004 18:21:07 +0000 (UTC)
Subject: Установка Exim с поддержкой виртуальных аккаунтов (база в MySQL)
В данной статье мы рассмотрим установку почтового сервера на базе Exim
с поддержкой виртуальных аккаунтов (MySQL).
Exim - свободно распространяемый Mail Transport Agent (MTA),
обладающий возможностью очень гибкой и тонкой настройки, включая поиск
конфигурационной информации в различных базах данных. Кроме того, Exim
поддерживает Maildir (quota), SMTP-аутентификацию и TLS/SSL без
применения патчей.
Исходные данные:
FreeBSD 4.6
MySQL 3.23.49
OpenSSL 0.9.7a
Все действия выполняются от супер-пользователя root.
Сначала скачиваем дистрибутив Exim с сайта производителя: http://www.exim.org
Прежде чем приступить к конфигурированию Exim'а, нужно создасть базу
данных, пользователя и соответсвующие таблицы. Для этого выполним:
su-2.05a# mysql -u root mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2 to server version: 3.23.49-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
Создаем пользователя sqlmail и присваиваем ему полные права на базу
exim:
su-2.05a# mysql -u root mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 3 to server version: 3.23.49-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> GRANT ALL PRIVILEGES ON exim.* TO sqlmail@localhost
-> IDENTIFIED BY 'my_password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> q
Bye
Когда база данных и пользователь созданы, нужно создать структуру
таблиц и ввести данные о пользователях Для этого выполним:
su-2.05a#mysql -u sqlmail exim -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 3 to server version: 3.23.49-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
INSERT INTO aliases VALUES ('postmaster','example.ru','ginger');
INSERT INTO aliases VALUES
('mailer-daemon','example.ru','postmaster');
INSERT INTO aliases VALUES ('root','example.ru','postmaster');
INSERT INTO aliases VALUES ('bin','example.ru','root');
INSERT INTO aliases VALUES ('daemon','example.ru','root');
INSERT INTO aliases VALUES ('sync','example.ru','root');
INSERT INTO aliases VALUES ('mail','example.ru','root');
INSERT INTO aliases VALUES ('pop','example.ru','root');
INSERT INTO aliases VALUES ('uucp','example.ru','root');
INSERT INTO aliases VALUES ('ftp','example.ru','root');
INSERT INTO aliases VALUES ('nobody','example.ru','root');
INSERT INTO aliases VALUES ('www','example.ru','root');
INSERT INTO aliases VALUES ('named','example.ru','root');
INSERT INTO aliases VALUES ('postgres','example.ru','root');
INSERT INTO aliases VALUES ('mysql','example.ru','root');
INSERT INTO aliases VALUES ('squid','example.ru','root');
INSERT INTO aliases VALUES ('drweb','example.ru','root');
INSERT INTO aliases VALUES ('operator','example.ru','root');
INSERT INTO aliases VALUES ('abuse','example.ru','root');
INSERT INTO aliases VALUES ('hostmaster','example.ru','root');
INSERT INTO aliases VALUES ('webmaster','example.ru','root');
После этого приступим к редактированию файла конфигурации exim.conf.
### /etc/mail/exim.conf ###
primary_hostname = smtp.example.ru
domainlist local_domains = ${lookup mysql{SELECT domain FROM domains
WHERE domain='${domain}' AND
(type='LOCAL' OR type='VIRTUAL')}}
domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains
WHERE domain='${domain}' AND type='RELAY'}}
hostlist relay_from_hosts = 127.0.0.1
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT recipients FROM aliases
WHERE local_part='${local_part}' AND domain='${domain}'}}
userforward:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT recipients FROM
userforward
WHERE local_part='${local_part}' AND domain='${domain}'}}
mysqluser:
driver = accept
condition = ${if eq{} {${lookup mysql{SELECT home FROM users
WHERE id='${local_part}' AND
mbox_host='${domain}'
AND active='Y'}}}{no}{yes}}
transport = mysql_delivery
begin transports
remote_smtp:
driver = smtp
mysql_delivery:
driver = appendfile
check_string = ""
create_directory
delivery_date_add
directory = ${lookup mysql{SELECT CONCAT(home, "/Maildir") FROM users
WHERE id='${local_part}' AND mbox_host='${domain}'}}
directory_mode = 770
envelope_to_add
group = mail
maildir_format
maildir_tag = ,S=$message_size
message_prefix = ""
message_suffix = ""
mode = 0600
quota = ${lookup mysql{SELECT quota FROM users
WHERE id='${local_part}' AND mbox_host='${domain}'}{${value}M}}
quota_size_regex = S=(d+)$
quota_warn_threshold = 75%
return_path_add
#drweb:
# driver = pipe
# command = /opt/drweb/drweb-exim -f <${sender_address}> -- ${pipe_addresses}
# current_directory = /var/drweb/spool
# escape_string =
# group = mail
# headers_add = X-Virus-Scanned: by DrWeb for Unix
# message_prefix =
# message_suffix =
# path = /bin:/sbin:/usr/bin:/usr/sbin:/opt/drweb
# no_return_output
# no_return_path_add
# user = drweb
begin retry
* quota
* * F,2h,15m; G,16h,1h,1.5;
F,4d,6h
begin rewrite
begin authenticators
auth_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT id FROM users
WHERE id = '${quote_mysql:${local_part:$2}}'
AND mbox_host = '${quote_mysql:${domain:$2}}'
AND passwd = '${quote_mysql:$3}'
AND active = 'Y'}{yes}{no}}
server_prompts = :
server_set_id = $2
auth_login:
driver = plaintext
public_name = LOGIN
server_condition = ${lookup mysql{SELECT id FROM users
WHERE id = '${quote_mysql:${local_part:$1}}'
AND mbox_host = '${quote_mysql:${domain:$1}}'
AND passwd = '${quote_mysql:$2}'
AND active = 'Y'}{yes}{no}}
server_prompts = Username:: : Password::
server_set_id = $1
auth_cram_md5:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup mysql{SELECT passwd FROM users
WHERE id = '${quote_mysql:${local_part:$1}}'
AND mbox_host = '${quote_mysql:${domain:$1}}'
AND active = 'Y'}{$value}fail}
server_set_id = $1
### /etc/mail/exim.conf ###
где,
* primary_hostname - полное имя хоста (FQDN);
* domainlist local_domains - список доменов, для которых принимаем почту как для локальных;
* domainlist relay_to_domains - список доменов, для которых разрешено принимать почту;
* hostlist relay_from_hosts - список адресов (IP) с которых разрешено принимать почту;
* acl_smtp_rcpt = acl_check_rcpt - вызов правил доступа при проверке адреса получателя;
* acl_smtp_data = acl_check_data - вызов правил доступа при проверке пересылаемых данных;
* qualify_domain - определение имени домена из FQDN сетевого узла или из адреса отправителя;
* log_selector - указываем события, которые необходимо протоколировать;
* host_lookup - поиск имени по адресу или наоборот;
* auto_thaw - указываем время, по истечению которого будет возобновлена попытка доставить frozen сообщение(я);
* message_size_limit - указываем максимальный размер сообщения;
* smtp_accept_max - указываем максимально возможное число одновременных smtp сессий.
После этого создаем файл запуска. Для этого проделаем следующее:
Теперь необходимо проверить правильность синтаксиса файла конфигурации
/etc/mail/exim.conf. Для этого выполним:
su-2.05a# exim -bV
Exim version 4.20 #1 built 22-May-2003 14:22:20
Copyright (c) University of Cambridge 2003
Probably Berkeley DB version 1.8x (native mode)
Support for: Perl OpenSSL
Authenticators: cram_md5 plaintext
Routers: accept dnslookup ipliteral manualroute
queryprogram redirect
Transports: appendfile/maildir/mbx autoreply pipe smtp
Configuration file is /etc/mail/exim.conf
Если ошибок не обнаружено, идем дальше.
Теперь требуется проверить, будет ли осуществляться распознование
сообщений для локальных пользователей. Для этого выполним:
This is a test message.
^D
LOG: MAIN
<= root@example.ru U=root P=local S=303
su-2.05a# LOG: MAIN
=> ginger R=mysqluser
T=mysql_delivery
LOG: MAIN
Completed
^C
Если ошибок не обнаружено, идем дальше - проверим, будет ли
осуществляться доставка сообщений внешним пользователям:
This is a test message.
^D
LOG: MAIN
<= root@example.ru U=root P=local S=303
su-2.05a# LOG: MAIN
=> someuser R=dnslookup
T=remote_smtp
LOG: MAIN
Completed
^C
На данном этапе мы убедились, что Exim правильно настроен и работает.
Осталось проверить SMTP аутентификацию. Для этого сделаем следующее.