Небольшая хаутушка по настройке почтовика. Собрано из различных источников рунета и не только рунета. Описал по шагам, как делал на своём серваке. Пока работает :) но мог что-то упустить, т.к. писал через несколько дней после настройки. Если будут упущения - пишите в камментах, поправлю.
Почтовая система настраивается на Debian 4 Etch.
Чтобы не заморачиваться с DVD-шкам, снимеме образы с компашек и подключим их в список APT.
# mkdir /var/DVD
# dd if=/dev/cdrom of=/var/DVD/DVD1.iso
# dd if=/dev/cdrom of=/var/DVD/DVD2.iso
# dd if=/dev/cdrom of=/var/DVD/DVD3.iso
Естественно, перед каждой командой dd надо ставить соответствующий ДВД-диск. :) Теперь подключим iso-шники.
# mkdir /mnt/DVD1 /mnt/DVD2 /mnt/DVD3
# mount -o loop /var/DVD/DVD1.iso /mnt/DVD1
# mount -o loop /var/DVD/DVD2.iso /mnt/DVD2
# mount -o loop /var/DVD/DVD3.iso /mnt/DVD3
В /etc/sources.list добавим строчки
deb file:///mnt/DVD1/ etch contrib main
deb file:///mnt/DVD2/ etch contrib main
deb file:///mnt/DVD3/ etch contrib main
Теперь можем приступать к установке непосредственно почтовика. Установим необходимые пакеты (вводить одной строкой):
# apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl postfix-tls libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql
Необходимо будет ответить на несколько вопросов:
Create directories for web-based administration ? <-- No
General type of configuration? <-- Internet Site
Mail name? <-- myserver.ru
SSL certificate required <-- Ok
После установки, MySQL ставится с пустым рутовским паролем. В целях безопасности его необходимо задать:
# mysqladmin -u root password yourrootsqlpassword
Теперь необходимо создать базу данных для хранения почтовой инфы
# mysqladmin -u root -p create mail
Создадим пользователя и необходимые таблицы в базе
# mysql -u root -p
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
USE mail;
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;
INSERT INTO domains VALUES('myserver.ru') ;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;
INSERT INTO forwardings VALUES('user1@myserver.ru','user2@myserver.ru');
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;
INSERT INTO users VALUES('user1@myserver.ru',ENCRYPT('secret'), 10485760);
INSERT INTO users VALUES('user2@myserver.ru',ENCRYPT('secret'), 10485760);
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
INSERT INTO transport VALUES('otherserver.ru','smtp:[123.321.123.321]');
quit;
Рассмотрим, какие данные будут храниться у нас в базе:
Таблица domains:
| domain |
| myserver.ru |
myserver.ru - имя домена (или нескольких доменов), на которые будем принимать почту
Таблица forwardings:
| source | destination |
| user1@myserver.ru | user2@myserver.ru |
В этой таблице указываем от какого пользователя (User1) будем "заворачивать" почту другому (User2) пользователю.
Таблица users:
| email |
password |
quota |
| user1@myserver.ru | No9.E4skNvGa. | 10485760 |
| user2@myserver.ru | No9.E4skNvGa. | 10485760 |
В данной таблице находится информация о почтовых аккаунтах: E-mail, пароль и квота на размер почтового ящика.
Таблица transport:
| domain |
transport |
| otherserver.ru | smtp:[123.321.123.321] |
В данной таблице "вручную" указываем нашему почтовику, куда именно отсылать письма.
Проверим конфиг /etc/mysql/my.cnf Необходимо, чтобы присутствовала строчка:
[...]
bind-address = 127.0.0.1
[...]
Если таковой небыло, внесите её и перестартуйте MySQL. Проверим, работает ли MySQL
# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost.localdo:mysql *:* LISTEN 4556/mysqld
tcp 0 0 *:smtp *:* LISTEN 12994/master
tcp6 0 0 *:imaps *:* LISTEN 4816/couriertcpd
tcp6 0 0 *:pop3s *:* LISTEN 4263/couriertcpd
tcp6 0 0 *:pop3 *:* LISTEN 4198/couriertcpd
tcp6 0 0 *:imap2 *:* LISTEN 4761/couriertcpd
tcp6 0 0 *:www *:* LISTEN 13283/apache2
tcp6 0 0 *:ssh *:* LISTEN 3192/sshd
Создадим несколько файлов для связки постфикса и мускула:
/etc/postfix/mysql-virtual_domains.cf должен содержать следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_transports.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT quota FROM users WHERE email='%s'
hosts = 127.0.0.1
Установим атрибуты и владельца для этих файлов
# chmod o= /etc/postfix/mysql-virtual_*.cf
# chgrp postfix /etc/postfix/mysql-virtual_*.cf
Создадим пользователя vmail, которому и будет сваливаться вся почта
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /home/vmail -m
Теперь отредактируем конфиг постфикса /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = myserver.ru
myorigin = /etc/mailname
mydestination = myserver.ru, localhost.myserver.ru, localhost
relayhost =
mynetworks = 127.0.0.0/8 192.168.0.0/24
inet_interfaces = all
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
transport_maps = mysql:/etc/postfix/mysql-virtual_transports.cf
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "The user you are trying to reach is over quota."
virtual_overquota_bounce = yes
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
smtpd_helo_required = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dnsbl.sorbs.net,
reject_rbl_client relays.visi.com,
reject_rbl_client list.dsbl.org,
reject_rbl_client dynablock.wirehub.net,
reject_rbl_client blackholes.wirehub.net,
reject_rbl_client dnsbl.njabl.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client dul.ru
В smtpd_recipient_restrictions разрешаем отправку из нашей сети и прошедшим аутентификацию. Затем запрещаем непрошедшим аутентификацию, и тем, кто находится в чёрных списках. Количество и источники reject_rbl_client выставляете по своим усмотрениям.
Теперь создадим SSL сертификаты, необходимые для TLS
# cd /etc/postfix
# openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
Для создания сертификата необходимо ответить не некотрые вопросы. После создания необходимо задать нужные права доступа:
# chmod o= /etc/postfix/smtpd.key
Настроим Saslauthd.
Для начала создадим папку:
# mkdir -p /var/spool/postfix/var/run/saslauthd
Отредактируем /etc/default/saslauthd
# This needs to be uncommented before saslauthd will be run automatically
START=yes
PARAMS="-m /var/spool/postfix/var/run/saslauthd -r"
PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"
# You must specify the authentication mechanisms you wish to use.
# This defaults to "pam" for PAM support, but may also include
# "shadow" or "sasldb", like this:
# MECHANISMS="pam shadow"
MECHANISMS="pam"
Создадим /etc/pam.d/smtp
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
Создадим /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: select password from users where email = '%u'
Перезапустим postfix и saslauth
#/etc/init.d/postfix restart
#/etc/init.d/saslauthd restart
Настроим Сourier.
Сейчас необходимо сказать Courier авторизоваться в MySQL. Отредактируем /etc/courier/authdaemonrc
[...]
authmodulelist="authmysql"
[...]
Сделаем бэкап /etc/courier/authmysqlrc и заменим его своим.
#cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
#cat /dev/null > /etc/courier/authmysqlrc
Отредактируем /etc/courier/authmysqlrc следующим образом:
MYSQL_SERVER localhost
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD mail_admin_password
MYSQL_PORT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD quota
Перезапустим курьер:
#/etc/init.d/courier-authdaemon restart
#/etc/init.d/courier-imap restart
#/etc/init.d/courier-imap-ssl restart
#/etc/init.d/courier-pop restart
#/etc/init.d/courier-pop-ssl restart
Теперь можно проверить, работает ли POP3
# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.
quit
+OK Better luck next time.
Connection closed by foreign host.
Можете отредактировать /etc/aliases под свои нужды. После редактирования не забудьте запустить newaliases и перезапустить postfix
# /etc/init.d/postfix restart
Установка SpamAssassin и Clamav
Схема работы выглядит следующим образом:
[SpamAssassin]
^
|
mail --> [(Port 25) Postfix] --> [(10024) amavisd-new] --> [(10025) Postfix] --> Mailbox
|
v
[ClamAV]
Установим необходимые пакеты:
# apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 unzoo libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop
Отредактируем /etc/amavis/conf.d/15-content_filter_mode
use strict;
# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.
#
# Default antivirus checking mode
# Uncomment the two lines below to enable it back
#
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
#
# Default SPAM checking mode
# Uncomment the two lines below to enable it back
#
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1; # insure a defined return
Отредактируем /etc/amavis/conf.d/20-debian_defaults
$QUARANTINEDIR = "$MYHOME/virusmails";
$log_recip_templ = undef; # disable by-recipient level-0 log entries
$DO_SYSLOG = 1; # log via syslogd (preferred)
$syslog_ident = 'amavis'; # syslog ident tag, prepended to all messages
$syslog_facility = 'mail';
$syslog_priority = 'debug'; # switch to info to drop debug output, etc
$enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny)
$enable_global_cache = 1; # enable use of libdb-based cache if $enable_db=1
$inet_socket_port = 10024; # default listenting socket
$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.31; # triggers spam evasive actions
$sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
$sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger
$sa_local_tests_only = 0; # only tests which do not require internet access?
[...]
$final_virus_destiny = D_DISCARD; # (data not lost, see virus quarantine)
$final_banned_destiny = D_BOUNCE; # D_REJECT when front-end MTA
$final_spam_destiny = D_BOUNCE;
$final_bad_header_destiny = D_PASS; # False-positive prone (for spam)
[...]
Добавим пользователя clamav в группу amavis и перезапустим amavisd-new и ClamAV
# adduser clamav amavis
# /etc/init.d/amavis restart
# /etc/init.d/clamav-daemon restart
Необходимо удостовериться, что в etc/clamav/freshclam.conf присутствует строка
[...]
NotifyClamd /etc/clamav/clamd.conf
[...]
Если её небыло - добавьте и перезапустите freshclam
# /etc/init.d/clamav-freshclam restart
Добавьте в файл /etc/postfix/main.cf следующие строки
content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
В файл /etc/postfix/master.cf добавьте следующее:
[...]
amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_bind_address=127.0.0.1
Перезапустим постфикс:
# /etc/init.d/postfix restart
Проверим нетстатом
# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:4069 *:* LISTEN 3457/rpc.statd
tcp 0 0 localhost.localdo:10024 *:* LISTEN 6886/amavisd (maste
tcp 0 0 localhost.localdo:10025 *:* LISTEN 7268/master
tcp 0 0 *:sunrpc *:* LISTEN 3083/portmap
tcp 0 0 *:auth *:* LISTEN 3417/inetd
tcp 0 0 *:smtp *:* LISTEN 7268/master
tcp6 0 0 *:imaps *:* LISTEN 4952/couriertcpd
tcp6 0 0 *:pop3s *:* LISTEN 4872/couriertcpd
tcp6 0 0 *:pop3 *:* LISTEN 4815/couriertcpd
tcp6 0 0 *:imap2 *:* LISTEN 4905/couriertcpd
tcp6 0 0 *:ssh *:* LISTEN 3438/sshd
tcp6 0 0 *:smtp *:* LISTEN 7268/master
tcp6 0 148 server1.example.com:ssh localhost:3117 ESTABLISHED3519/0
Можно установить настроить Razor, Pyzor и DCC.
# apt-get install razor pyzor dcc-client
Отредактируем /etc/spamassassin/local.cf
[...]
# dcc
use_dcc 1
dcc_path /usr/bin/dccproc
dcc_add_header 1
dcc_dccifd_path /usr/sbin/dccifd
#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor
pyzor_add_header 1
#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf
#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
Перезапустим amavisd
# /etc/init.d/amavis restart
Чтобы увидеть, насколько работает наша система, запустим tail
# tail -f /var/log/mail.log
Установим postgrey
# apt-get install postgrey
В файле /etc/default/postgrey отредактируйте параметры по вашему усмотрению
POSTGREY_OPTS="--inet=127.0.0.1:60000 --delay=600"
POSTGREY_TEXT="Sorry, but server is temporarily inaccessible"
В файле /etc/postfix/main.cf добавим к smtpd_recipient_restrictions параметр
check_policy_service inet:127.0.0.1:60000
Анализ статистики
Для анализа постфиксовской статистики воспользуемся парсером pflogsumm.
# apt-get install pflogsumm
Запускается парсер следующим образом:
# pflogsumm /var/log/mail.log
На выхлопе - различная полезная информация.


Несколько вопросов...
Спасибо за статью. Очень интересно написано, но осталось несколько непонятных моментов.
1 Как обучать спамасассин?
2 Как будет обновлятся Clamav?
3 Для чего нужны пакеты Razor, Pyzor и DCC?
Спасибо.
clamav обновляется со своего
clamav обновляется со своего сервера, при инсталляции данного чуда прописывается в автозагрузку, называется как то так: clamav-f [tab]. попробую по этой статейки, думаю это не банальный копи паст =))
не получилась настройка(( на
не получилась настройка(( на каком то шаге отвалился postfix...имеется вопрос - как добавить пользователя в созданую таблицу маил? чтоб у него был пароль и ящик...Спасибо!
Отправить комментарий