Почтовая система провайдера
Дата публикации: 2007-01-06
В этой статье я опишу как можно создать почтовую систему уровня провайдера.
Система будет включать в себя полноценную поддержку множества доменов,
пользователи виртуальные - хранятся в базе MySQL,
поддержка антивирусной проверки почты и система антиспама.
В этой статье я опишу как можно создать почтовую систему уровня провайдера.
Система будет включать в себя полноценную поддержку множества доменов,
пользователи виртуальные - хранятся в базе MySQL,
поддержка антивирусной проверки почты и система антиспама.
Используемые компоненты/программное обеспечение:
1. сервер БД - MySQL
2. POP3 сервер - QPopper с патчем для работы с MySQL
3. SMTP сервер - Exim
4. Антивирус - DrWeb
5. Антиспам - SpamAssassin
Как всегда ( ;) ) при написании статьи я буду сразу устанавливать систему на сервер и писать статью.
Ссылки на весь используемый софт будут указаны в конце статьи
Имеем сервер с установленной Slackware 11.0. МySQL специально не устанавливал из дистрибутива,
ибо хотел на момент написания статьи версию 5.1 (свои причины - связанны с тем что сервер этот должен будет заниматся репликацией данных с другим сервером).
Итак скачали MySQL, распаковываем, компилируем:
./configure --prefix=/usr/local/mysql-5.1.14 --sysconfdir=/etc --enable-assembler --with-charset=cp1251 --with-extra-charsets=all --with-plugins=all
make
make install
Теперь надо инсталлировать служебные базы и запустить собственно сам MySQL.
В Slackware есть уже готовые файлы для конфигов мускула и для запуска при старте системы - воспользуемся этим для быстрого старта.
root@www:/usr/local/src/mysql-5.1.14-beta# cp /etc/my-large.cnf /etc/my.cnf
root@www:/usr/local/src/mysql-5.1.14-beta# chown +x /etc/rc.d/rc.mysqld
Поскольку я хочу чтобы у меня мускул держал базы в /var/lib/mysql в /etc/my.cnf добавляю строчку datadir=/var/lib/mysql и даю права
root@www:/usr/local/src/mysql-5.1.14-beta# chown mysql.mysql /var/lib/mysql
root@www:/usr/local/src/mysql-5.1.14-beta# su - mysql
mysql@www:~$ /usr/local/mysql-5.1.14/bin/mysql_install_db
изменяем /etc/rc.d/rc.mysqld на предмет правильного пути к mysqld_safe (я просто изменил /usr/bin/mysqld_safe на /usr/local/mysql-5.1.14/bin/mysqld_safe) и запускаем
Пока с мускулом все.
Переходим к QPopper'у.
Скачиваем, распакавываем все в /usr/local/src/qpopper4.0.9.
Затем скачиваем и туда же кидаем патч qpopper-mysql-0.15-test.patch.
Применяем его
root@www:/etc/rc.d# root@www:/usr/local/src/qpopper4.0.9# patch -p1 < qpopper-mysql-0.15-test.patch
Внимательно читаем появившийся файлик README.MYSQL
Из этой документации вырезаем кусок SQL-команд сохраняем его в файл (например mail.sql) и немного "дорабатывем", получаем в результате:
CREATE DATABASE mail;
GRANT SELECT,UPDATE on mail.* to 'mail_db_user'@'localhost' identified by 'mail_db_password';
flush privileges;
use mail;
CREATE TABLE relay_ip (
ip char(15) NOT NULL default '',
ts int(11) NOT NULL default '0',
KEY ip(ip)
);
CREATE TABLE email (
username varchar(128) NOT NULL,
domain varchar(64),
password varchar(64) NOT NULL,
is_alias char(1) default 'N',
alias varchar(250) default '',
quota int(11) default 5000000,
status int(2) DEFAULT '0',
key is_alias(is_alias),
key username(username),
key domain(domain)
);
и "загоняем" все эти команды в мускул.
Теперь приступаем к компиляции QPopper'а
./configure --enable-log-login-mysql --enable-mysql --with-mysqlconfig=/etc/mail/mysql-popper.conf \
--enable-servermode --enable-shy --enable-spool-dir=/var/spool/mail --enable-log-facility=LOG_MAIL \
--enable-old-spool-loc --enable-standalone --enable-fast-update --enable-chunky-writes=1 --prefix=/usr \
--disable-status --enable-cache-dir=/var/spool/mail/cache --enable-temp-drop-dir=/var/spool/mail/pop \
--disable-check-pw-max --disable-hash-dir-check --without-pam --enable-nonauth-file=/etc/mail/deny.users \
--with-openssl
Вот так страшно выглядить configure :)
Затем стандартно:
make
make install
Конфигурационный файл надо скопировать вручную
cp /usr/local/src/qpopper4.0.9/mysql-popper.conf /etc/mail
После редактирования получаем
MysqlAuthHost localhost
MysqlAuthPort 3306
MysqlAuthDb mail
MysqlUsername mail_db_user
MysqlPassword mail_db_password
MysqlAuthTable email
MysqlAuthPasswordMethod any
MysqlAuthUsernameField username
MysqlAuthDomainField domain
MysqlAuthDefaultDomain rus21.ru
MysqlAuthPasswordField password
MysqlAuthUidName mail
MysqlAuthGidName mail
MysqlAuthAcctStatusField status
Рисуем такой скрипт /etc/rc.d/rc.popper для запуска QPopper'а
#!/bin/sh
start() {
if [ -x /usr/sbin/popper ]; then
echo "Starting Qpopper: /usr/sbin/popper"
/usr/sbin/popper
fi
}
stop() {
killall popper
}
restart() {
stop
sleep 1
start
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
*)
echo "usage $0 start|stop|restart"
esac
в /etc/rc.d/rc.M добавляем строки
# Start the Qpopper name server daemon:
if [ -x /etc/rc.d/rc.popper ]; then
. /etc/rc.d/rc.popper start
fi
дабы не было проблем надо вручную создать каталог для временных файлов и назначить правильные права
mkdir /var/spool/mail/pop
chown mail.mail /var/spool/mail/pop
Делаем небольшой тест
mysql> \u mail
Database changed
mysql> insert into email values('ibz','rus21.ru','123','N','',5000000,1);
Query OK, 1 row affected (0.00 sec)
root@www:/etc/mail# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK ready
user ibz
+OK Password required for ibz.
pass 123
+OK ibz has 0 visible messages (0 hidden) in 0 octets.
quit
+OK Pop server at www.rus21.ru signing off.
Connection closed by foreign host.
root@www:/etc/mail#
Все ок, теперь начинаем настраивать связку exim+drweb+spamassassin
Распаковываем в /usr/local/src/exim-4.66
Стандартным привычным движением копируем файлик /usr/local/src/exim-4.66/src/EDITME в нужное место (кто не понял - надо
нудно и долго читать README* - тяжело в учении легко в бою)
root@www:/usr/local/src/exim-4.66# cp src/EDITME Local/Makefile
Далее редактируем Local/Makefile
Я сделал следующие изменения
CONFIGURE_FILE=/etc/mail/exim-4.66.conf
EXIM_USER=mail
расскоментировал и исправил
LOOKUP_MYSQL=yes
LOOKUP_INCLUDE=-I /usr/include/mysql
LOOKUP_LIBS=-L/usr/lib -lmysqlclient
закоментировал #EXIM_MONITOR=eximon.bin
WITH_CONTENT_SCAN=yes
AUTH_CRAM_MD5=yes
AUTH_PLAINTEXT=yes
LOG_FILE_PATH=/var/log/exim/%slog
SYSTEM_ALIASES_FILE=/etc/mail/aliases
ну а дальше
cd /usr/local/src/exim-4.66; make; make install
mv /usr/sbin/sendmail /usr/sbin/sendmail.original
ln -s /usr/exim/bin/exim /usr/sbin/sendmail
mkdir /var/log/exim
chown mail.mail /var/log/exim
теперь надо установить DrWeb. Тут я особенно не мудрствовал - просто распаковал все архивы как было. Нужны три компонента
- Демон DrWeb для линукса (подходящий к вашему libc)
- Клиент-фильтр для Exim'а
- Ключ для DrWeba (У меня была лицензия на 50 почтовых ящиков, раз в год обновляемая)
Что я еще сделал - так это создал пользователя и группу drweb, в группу drweb дополнительно добавил юзера mail, и сделал
chown -R drweb.drweb /var/drweb
Далее с сайта http://spamassassin.apache.org/ утягиваем последнюю версию СпамАсасина
Распаковываем, с разгону пробуем запустить
root@www:/usr/local/src/Mail-SpamAssassin-3.1.7# perl Makefile.PL
Получаем предупреждение что мол нет нужных библиотек, примерно так:
...
***************************************************************************
NOTE: the optional Archive::Tar (version 1.23) module is not installed.
The "sa-update" script requires this module to access tar update
archive files.
***************************************************************************
NOTE: the optional IO::Zlib (version 1.04) module is not installed.
The "sa-update" script requires this module to access compressed
update archive files.
REQUIRED module missing: Digest::SHA1
REQUIRED module missing: HTML::Parser
optional module missing: Net::DNS
optional module missing: Mail::SPF::Query
optional module missing: IP::Country
optional module missing: Razor2
optional module missing: Net::Ident
optional module missing: IO::Socket::INET6
optional module missing: IO::Socket::SSL
optional module missing: LWP::UserAgent
optional module missing: HTTP::Date
optional module missing: Archive::Tar
optional module missing: IO::Zlib
warning: some functionality may not be available,
please read the above report before continuing!
Нас это не устраивает. Быстро ваяем такой шелл скрипт
perl -MCPAN -e 'install SNMP'
perl -MCPAN -e 'install Digest::SHA1'
perl -MCPAN -e 'install HTML::Parser'
perl -MCPAN -e 'install Net::DNS'
perl -MCPAN -e 'install Mail::SPF::Query'
perl -MCPAN -e 'install IP::Country'
perl -MCPAN -e 'install Razor2'
perl -MCPAN -e 'install Net::Ident'
perl -MCPAN -e 'install IO::Socket::INET6'
perl -MCPAN -e 'install IO::Socket::SSL'
perl -MCPAN -e 'install LWP::UserAgent'
perl -MCPAN -e 'install HTTP::Date'
perl -MCPAN -e 'install Archive::Tar'
perl -MCPAN -e 'install IO::Zlib'
отвечаем на вопросы, долго и нудно, выбираю все в основном по умолчанию.
После того как закончится снова делаю
root@www:/usr/local/src/Mail-SpamAssassin-3.1.7# perl Makefile.PL
на этот раз удачно, дальше стандартно
make; make install
Конфиги SpamAssassin'а в /etc/mail/spamassassin пока не трогаем
Одна особенность для Slackware - в /etc/passwd домашний каталог для юзера mail изменяем с "/" на "/var/spool/mail"
создаем rc.файл для запуска, нечто вроде такого:
#!/bin/sh
start() {
if [ -x /usr/bin/spamd ]; then
echo "Starting Spamd: /usr/bin/spamd -d -s /var/log/exim/spamd.log -u mail"
/usr/bin/spamd -d -s /var/log/exim/spamd.log -u mail
fi
}
stop() {
killall spamd
}
restart() {
stop
sleep 1
start
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
*)
echo "usage $0 start|stop|restart"
esac
запускаем его, вроде в логах ничего криминального нет. Приступаем к запуску Exim.
Для начала нарисуем rc.файл:
#!/bin/sh
start() {
if [ -x /usr/sbin/exim ]; then
echo "Starting Exim: /usr/sbin/exim -bd -q2h"
/usr/sbin/exim -bd -q2h
fi
}
stop() {
killall exim
}
restart() {
stop
sleep 1
start
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
*)
echo "usage $0 start|stop|restart"
esac
теперь надо править конфиг-файл для exim
Ссылки
http://www.mysql.org/downloads/ - MySQL
http://www.eudora.com/products/unsupported/qpopper/index.html - QPopper
http://asteroid-b612.org/software/qpopper-mysql/qpopper-mysql-0.15-test.patch - Патч для QPopper'а для работы с MySQL