Автор: Кузнецов Константин
Почтовый сервер (postfix, dovecot, squirrelmail)
План:
1. Введение
2. Чего хотим добиться
3. Что нам понадобится
4. Составляем план действий
5. Настройка согласно плану
6. Популярные ошибки и ЧАВО
7. Приложение. Порядок отправки/приёма писем.
8. Используемая и рекомендуемая литература
------------------------------------------------------------
1. Введение
Мало кто будет спорить, что широкому развитию глобальной сети Интернет поспособствовала возможность мгновенного обмена электронной почтой.
Материал из Википедии — свободной энциклопедииТрудно себе представить уважающую себя коммерческую организацию, не имеющую собственный почтовый сервер, обрабатывающего почтовые ящики своего домена. Почтовый сервер, работающий под операционной системой GNU/Linux - признак хорошего тона со стороны системного администратора такой компании. О настройке такой системы мы и поговорим в этой статье.
Электронная почта (англ. email, e-mail, от англ. electronic mail) — технология и предоставляемые ею услуги по пересылке и получению электронных сообщений (называемых «письма» или «электронные письма») по распределённой (в том числе глобальной) компьютерной сети. Основным отличием от прочих систем передачи сообщений (например, служб мгновенных сообщений) является возможность отложенной доставки и развитая (и запутанная из-за длительного времени развития) система взаимодействия между независимыми почтовыми серверами.
------------------------------------------------------------
2. Чего хотим добиться
Казалось бы, ответ очевиден:
Хотим настроить почтовую систему, да так, чтобы пользователи могли присылать письма нам, мы их могли получать и отвечать на них.
Но такой ответ не подойдет. Есть множество нюансов, в зависимости от которых процесс настройки пойдет в ту или иную сторону. Еще раз, что мы хотим?
Хотим настроить (научиться настраивать) почтовую систему таким образом:
Пункт 1. Чтобы она могла принимать и хранить письма для пользователей нескольких доменов (user1@domain1.ru, user2@domain2.com и т.д.) с поддержкой переадрессации писем на другие адреса (алиас)
По-умолчанию, почтовая система postfix, которую мы используем, принимает письма только для домена, соответствующего названию компьютера (server или computername). Изменить это можно с помощью добавления опции "virtual_mailbox_domains = " (виртуальные почтовые домены).
Пункт 2. Чтобы список этих доменов и их пользователей с алиасами находился в базе данных.
По-умолчанию, используются системные пользователи (которых добавляют с помощью useradd). Так как мы будем настраивать систему, обслуживающую несколько доменов, то такой подход уже подразумевает разбиение всех пользователей на системных и виртуальных, потому что в разных доменах могут быть разные пользователи с одинаковыми именами (user1@domain1.ru, user1@domain2.ru). Причем удобнее всех пользователей делать виртуальными, отказавшись от системных. Там ими и управлять проще, и запутаться будет труднее при настройке, и вообще не удобно в системе держать несколько десятков или сотен пользователей. Виртуальных пользователей можно хранить в текстовом формате в файле (т.е. "добавить пользователя" - будет означать "просто добавить в файл строчку об этом пользователе"), а можно (так будет удобнее) в базе данных mysql (просто добавляем запись в таблицу и пользователь готов).
Пункт 3. Чтобы пользователь мог получать письма по протоколам pop3 и imap4, находясь в любом месте земного шара, зная пароль (который тоже будет храниться в базе mysql).
По-умолчанию, полученные письма складываются в директорию /var/mail/ и представляют собой текстовый файл, имя которого соответствует имени пользователя, например /var/mail/user. Письма эти соответственно могут читать только системные пользователи, например, с помощью команды mail (необходимо установить дополнительный пакет mailutils). Таким образом, для получения письма системному пользователю, находясь удаленно, необходимо залогиниться в системе, например, через ssh, и получить почту командой mail. Но мы хотим пользоваться удобными средствами для приема почты, такими как thunderbird. А для этого одного postfix будет мало - он лишь smtp-сервер. Для наших целей существует pop3-сервер или imap-сервер (более новый протокол доступа к почтовому ящику). Мы будем использовать dovecot.
Пункт 4. Чтобы пользователь мог отсылать письма находясь в любом месте земного шара, зная этот же самый пароль.
По-умолчанию postfix отправляет письма только если в качестве клиента выступает он же (127.0.0.1). Отправлять письма, полученные для отправки от других компьютеров он не может в связи с политикой безопасности - иначе он будет считаться сервером "open relay", через который можно слать спам и прочий хлам без каких-либо препятствий. По-этому необходимо настраивать разрешения на отправку писем через наш сервер. Сначала мы разрешим отправлять письма только с компьютеров, находящихся в одной локальной сети с нашим сервером (permit_mynetworks), а потом только нашим пользователям и только по паролю. За это отвечает опция smtpd_sasl_auth_enable = yes в конфигурационном файле postfix. А механизм аутентификации мы заимствуем у dovecot, чтобы не плодить сущностей.
Пункт 5. Чтобы письма проверялись на спам.
Письма, которые будут проходить через наш сервер, могут быть разными. Причем 90% из них будут скорее всего содержать ненужную надоедливую рекламу - СПАМ. От них можно отбиваться с помощью программы spamassassin.
Пункт 6. Чтобы письма проверялись на вирусы.
Иногда бывает так, что нам пришло письмо содержащее вирус. Такие письма мы тоже будем блокировать - пакеты clamav и clamsmtpd.
Пункт 7. Чтобы присутствовал web-интерфейс для управления письмами.
Ну тут все понятно. Не у всех под рукой бывает почтовый клиент с необходимыми настройками. Squirrelmail - примитивная пародия на интерфейс почтового сервера, например такого крупного, как mail.ru. Нам его хватит за глаза.
------------------------------------------------------------
3. Что нам понадобится
Пункт 1. Нам нужен компьютер с установленной операционной системой GNU|Linux Ubuntu 8.04 LTS желательно со всеми обновлениями и права администратора на нём.[console]root@computername:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.04.3 LTS
Release: 8.04
Codename: hardy
root@computername:~# whoami
root
root@computername:~# id
uid=0(root) gid=0(root) groups=0(root)[/console]Пункт №2. На этом компьютере должен быть доступ в интернет. Любой: dhcp, pppoe, pptp, через шлюз, WiMax, WiFi - что угодно.[console]root@computername:~# ping -c 1 ya.ru
PING ya.ru (77.88.21.8) 56(84) bytes of data.
64 bytes from ya.ru (77.88.21.8): icmp_seq=1 ttl=60 time=3.89 ms
--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.899/3.899/3.899/0.000 ms[/console]Пункт №3. Открытые в файерволе порты для smtp (tcp 25), pop3 (tcp 110), imap (tcp 143) и http (tcp 80) для доступа через web-интерфейс[console]root@computername:~# iptables -nvL INPUT
Chain INPUT (policy DROP 436K packets, 58M bytes)
pkts bytes target prot opt in out source destination
167K 52M ACCEPT all -- lo * 127.0.0.0/8 127.0.0.1
69M 78G ACCEPT all -- * * 192.168.0.0/24 192.168.0.1
2 168 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 0
421 26628 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8
465 24396 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 236 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
5 236 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110
5 236 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143
10M 9900M ACCEPT all -- eth1 * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED[/console]Пункт №4. Доступ к нашему компьютеру на перечисленные выше порты из Интернета. Для этого необходим внешний статический (постоянный) ip-адрес на нашем компьютере, либо на компьютере (маршрутизаторе, модеме), который является шлюзом для нашего компьютера, и на котором нужно будет настроить переброс перечисленных портов на внутренний ip-адрес нашего компьютера. Либо динамический (меняющийся вреся от времени) внешний ip-адрес, но при этом необходимо пользоваться услугами сервисов динамических dns. Файервол провайдера не должен резать соединения по этим портам.[console]user@client:~# nmap domain.ru
Starting Nmap 4.62 ( http://nmap.org ) at 2010-01-16 23:02 MSK
Interesting ports on 62.5.246.190:
Not shown: 1713 filtered ports
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http[/console]Показаны только те порты, на которых висят службы. В этом примере я еще не поднял pop3 и imap.
Пункт №5. FQDN. Доменное имя, привязанное к нашему внешнему ip-адресу, или mx-запись в dns-зоне на dns-сервере вида[console]user@client:~# host -t mx domain.ru
domain.ru mail is handled by 10 62.5.246.190[/console][console]user@client:~# nslookup domain.ru
Non-authoritative answer:
Name: domain.ru
Address: 62.5.246.190[/console]Пункт №6. Пакеты postfix, postfix-mysql, dovecot-pop3d, dovecot-imapd, mysql-server-5.0, mailutils, clamav, clamsmtp, apache2, squirrelmail, squirrelmail-locales, spamassassin, spamc.
------------------------------------------------------------
4. Составляем план действий
Пункт №1. Настраиваем самый простой вариант почтовой системы - обслуживание одного домена, системные пользователи, отправка и получение писем только локально (с помощью команды mail) без поддержки pop3 или imap.
Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.
Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности (для общего развития, на деле же считаю это бессмысленным).
Пункт №4. Добавляем в SMTP-сервер возможность проверять пользователя через встроенный в dovecot механизм аутентификации (чтобы письма можно было отправлять не только непосредственно с сервера командой mail или из локальной сети, но и удаленно)
Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.
Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.
Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).
Пункт №8. Установка и настройка http-сервера (apache) и подключение к нему почтового web-интерфейса (squirrelmail).
Пункт №9. Установка и подключение Антиспам-фильтра SPAMASSASIN. Пользователю будет приходить уведомление о том, что ему пытались отправить спам. Исходное помеченное как спам сообщение будет вложено в это письмо.
Пункт №10. Устанавливаем и подключаем антивирусную проверку писем. Пользователю, которому пытались прислать письмо с вирусом, будет приходит вместо этого письма уведомление об этом факте и инструкция, как получить зараженное письмо вопреки всему.
P.S. После выполнения каждого пункта настоятельно рекомендую перезагружать все сервисы, относящиеся к электронной почте.
------------------------------------------------------------
5. Настройка согласно плану
Пункт №1. Настраиваем самый простой вариант почтовой системы - обслуживание одного домена, системные пользователи, отправка и получение писем только локально (с помощью команды mail) без поддержки pop3 или imap.
Устанавливаем пакет postfix, на все вопросы отвечаем так, как предлагают. Не поверите, но после этого можно уже проверить свою службу доставки писем
telnet localhost 25Получаем в ответ[console]250 2.0.0 Ok: queued as 2AB015121B3[/console]После чего проверяем, доставлено ли письмо адресату[console]cat /var/log/mail.log|grep 2AB015121B3[/console]В выводе должно быть
helo localhost
mail from:<>
rcpt to:<user@computername>
data
тут пишем текст, например hello
. (просто точка)
quit
[console]Jan 16 22:55:06 computername postfix/smtpd[19361]: 2AB015121B3: client=localhost[127.0.0.1]
Jan 16 22:55:15 computername postfix/cleanup[19371]: 2AB015121B3: message-id=<20100116195506.2AB015121B3@computername>
Jan 16 22:55:15 computername postfix/qmgr[16712]: 2AB015121B3: from=<>, size=338, nrcpt=1 (queue active)
Jan 16 22:55:15 computername postfix/local[19372]: 2AB015121B3: to=<user@computername>, relay=local, delay=24, delays=24/0.01/0/0.04, dsn=2.0.0, status=sent (delivered to mailbox)
Jan 16 22:55:15 computername postfix/qmgr[16712]: 2AB015121B3: removed[/console]Проверяем[console]cat /var/mail/user[/console]
From MAILER-DAEMON Sat Jan 16 17:02:34 2010Далее, устанавливаем пакет mailutils и получаем этим пользователем почту.[console]root@computername:~/# su user
Return-Path: <>
X-Original-To: user@computername
Delivered-To: user@computername
Received: from localhost (localhost [127.0.0.1])
by computername (Postfix) with SMTP id 4C174512135
for <user@computername>; Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
Message-Id: <20100116140225.4C174512135@computername>
Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
From: MAILER-DAEMON
To: undisclosed-recipients:;
hello
user@computername:~/# mail[/console]
"/var/mail/user": 1 сообщение 1 новое[console]1[/console]
>N 1 MAILER-DAEMON Сбт Янв 16 12/416 MAILER-DAEMON
&
Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)[console]q[/console]
From: MAILER-DAEMON
To: undisclosed-recipients:;
hello
&
1 сообщение удержано в /var/mail/userОтлично, письмо получено. Попробуем отправить письмо:[console]echo "hello"|mail -s "Subject" user[/console]Этой командой мы вывели слово hello, но вывод перенаправили в программу mail, которая завернула это слово в текст сообщения (так уж она работает, и это логично), темой сообщения обозначили "Subject" и отправили это все пользователю user. Если мы от его имени проверим почту еще раз - увидим и это сообщение в списке писем. Почтовая система работает, но только внутри системы. Осталось её настроить на нормальную работу.
Забэкапим оригинал конфига[console]cp /etc/postfix/main.cf /etc/postfix/main.cf.orig[/console]и можно приступать.
Идем в main.cf. После установки его содержимое было таким:
#myorigin = /etc/mailnameВносим первые изменения, добавив наш домен для обслуживания почтовой системой
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
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
readme_directory = no
# 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:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_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 = computername
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = computername, localhost.localdomain, , localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
myorigin = domain.ruПерезагружаем postfix, теперь можем проверить отправку почты внешним адресатам:[console]telnet localhost 25
myhostname = $myorigin
mydestination = computername, localhost.localdomain, , localhost, $myorigin
helo localhost
mail from:<user@domain.ru>
rcpt to:<admin@mail.ru>
data
Subject: helloworld
Good mornong
.[/console]Получаем в ответ[console]250 2.0.0 Ok: queued as 97B365121B0[/console]или же[console]echo "Good job"|mail -s "test message" admin@mail.ru[/console]но тогда мы не узнаем идентификатор письма (97B365121B0) для поиска и устранения ошибок.
На мэйле проверяем письмо через секунд 5-10. Если ничего нет, то выполняем[console]cat /var/log/mail.log |grep 97B365121B0[/console]В моем случае все прошло нормально, и в логах об этом сообщают вот что:[console]Jan 16 17:30:43 computername postfix/smtpd[16762]: 97B365121B0: client=localhost[127.0.0.1]
Jan 16 17:30:56 computername postfix/cleanup[16765]: 97B365121B0: message-id=<20100116143043.97B365121B0@domain.ru>
Jan 16 17:30:56 computername postfix/qmgr[16712]: 97B365121B0: from=<user@domain.ru>, size=370, nrcpt=1 (queue active)
Jan 16 17:31:01 computername postfix/smtp[16766]: 97B365121B0: to=<admin@mail.ru>, relay=mx.mail.ru[62.32.54.188]:25, delay=26, delays=20/0.01/5.2/0.12, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B8580C7C9F)
Jan 16 17:31:01 computername postfix/qmgr[16712]: 97B365121B0: removed[/console]Ключевое словосочетание status=sent. После этого мы с мэйла отправляем ответ на это письмо нашему пользователю user@domain.ru. Письмо должно прийти, если всё выполняли правильно.
Теперь обратим внимание на две строки в файле main.cf:
alias_maps = hash:/etc/aliasesвнимательно посмотрим на содержимое этих файлов
alias_database = hash:/etc/aliases
root: userТаким образом мы указали, что письма для пользователя root будут пересылаться пользователю user. Таким образом, user является алиасом для root. Проверим это: отправим письмо для root, а получим его user-ом. В логах это видно так:[console]Jan 17 12:52:57 computername postfix/local[27259]: 24D4E512109: to=<user@domain.ru>, orig_to=<root@domain.ru>, relay=local, delay=0.14, delays=0.13/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)[/console]Подмена ящика видна из слов to=<user@domain.ru>, orig_to=<root@domain.ru>.
Если нам понадобится добавить еще один алиас, например
user2: rootто после сохранения файла /etc/aliases необходимо выполнить [console]postalias /etc/aliases[/console]или просто [console]newaliases[/console]потому что postfix работает не с этим файлом напрямую, а с /etc/aliases.db, который получается путем преобразования исходного файла. Причем пользователи postmaster и user2 не обязательно должны присутствовать в системе. Письма для них все равно пересылаются от одного другому, от другого руту, а от рута нашему user-у. Так что алиасы добавляются намного проще, чем пользователи в нашу почтовую систему.
postmaster: user2
Пока что все отлично. Письма уходят и приходят. Что еще для счастья нужно?
Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.
Устанавливаем dovecot-pop3d и dovecot-imapd. Конфигурационный файл /etc/dovecot/dovecot.conf по-умолчанию такой:
protocols = imap imaps pop3 pop3sБэкапим и редактируем, добавив 1 опцию и отредактировав 1 опцию
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = mail
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth default {
mechanisms = plain
passdb pam {
}
userdb passwd {
}
user = root
}
dict {
}
plugin {
}
# imaps и pop3s нам не нужныПосле этого перезапускаем dovecot и проверяем почтовым клиентом pop3 и imap.
protocols = imap pop3
# разрешаем принимать пароли открытым текстом
disable_plaintext_auth = no
Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности.
Для общего развития нам необходимо добавить возможность отправлять письма через наш почтовый сервер без авторизации всем, чьи компьютеры расположены в локальной сети сервера. Для этого необходимо в main.cf добавить 1 строку и изменить 1 строку:
mynetworks = 127.0.0.0/8 192.168.0.0/24Очевидно, что если мы туда же запишем наш домашний ip-адрес, то и из дома мы сможем отправлять письма через сервер без пароля. Во второй строке разрешается отправлять письма не только тем, кто находится в "моих сетях", но и прошедшим аутентификацию. Прикрутим её сюда.
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Пункт №4. Добавляем в SMTP-сервер возможность проверять пользователя через встроенный в dovecot механизм аутентификации.
/etc/postfix/main.cf:
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
/etc/dovecot/dovecot.conf:
auth default {перезапускаем postfix и dovecot.
mechanisms = plain login
socket listen {
client {
path = /var/spool/postfix/private/auth
user = postfix
}
}
Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.
Добавляем в /etc/postfix/main.cf:
# прописываем домены, для чьих пользователей будет принимать письма наш серверДобавляем пользователя в систему, под чьим именем будет храниться вся почта[console]groupadd -g 1001 vmail
virtual_mailbox_domains = domain1.ru, domain2.net, domain3.org, domain4.com
# Путь к директории, где будут лежать письма пользователей этих доменов
virtual_mailbox_base = /var/mail/virtual/
# Путь к файлу, где указаны пути к почтовым ящикам относительно переменной $virtual_mailbox_base
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
# Указываем user id (владельца), под чьим именем будут храниться файлы почты
virtual_uid_maps = static:1001
# Указываем group id (группы), под чьим именем будут храниться файлы почты
virtual_gid_maps = static:1001
useradd -u 1001 -g 1001 vmail[/console]Создаем папку /var/mail/virtual и назначаем ей права указанного пользователя и группы[console]mkdir /var/mail/virtual
chown 1001:1001 /var/mail/virtual[/console]создем файл /etc/postfix/virtual_mailbox_maps с содержимым:[console]user@domain111.ru domain111.ru/user/[/console]выполняем:[console]postmap /etc/postfix/virtual_mailbox_maps[/console]С smtp-сервером закончили. Теперь идем к pop3/imap. Правим /etc/dovecot/dovecot.conf:
# Тут будет лежать почта виртуальных пользователейДобавляем пользователя в /etc/dovecot/users:
mail_location = maildir:/var/mail/virtual/%d/%n
# Так как у нас могут быть в разных доменах разные пользователи
# с одинаковыми ящиками, то мы меняем аутентификацию на учет
# доменного имени, как части логина (в почтовом клиенте так же
# меняем login:user на login:user@domain
auth_username_format = %Ln@%Ld
# Аутентификация будет происходить на основании паролей, хранящихся в файле
passdb passwd-file {
args = /etc/dovecot/passwd
}
# Пользователи со своими UID и GID будут лежать в другом файле
userdb passwd-file {
args = /etc/dovecot/users
}
user@domain111.ru::1001:1001Генерируем пароль для пользователя
[console]dovecotpw -s DIGEST-MD5 -u user@domain111.ru[/console]И кладем его в файл паролей /etc/dovecot/passwd:
user@domain111.ru:{DIGEST-MD5}583d7d41e60ae44911cdb4b3d800aafcПроверяем - должно все работать.
После этого мои системные пользователи локального домена (domain.ru) работать перестали (не получают и не отправляют почту). Копал-копал и решил, что dovecot-у для проверки пользователя необходимо указать "логин@домен", а системные пользователи у нас работали только через "логин". Я ломать голову не стал и, учитывая что все пользователи все равно у меня будут виртуальными, начал переносить исходный домен с пользователями.
Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.
Подправим конфиг постфикса /etc/postfix/main.cf:
# возвращаем обратноПодправим ряды виртуальных пользователей /etc/postfix/virtual_mailbox_maps:
myorigin = computername
# перечисляем домены, для которых будем принимать почту,
# иначе будет ошибка "relay access denied"
virtual_mailbox_domains = domain.ru, domain111.ru, domain222.ru
# Поменяем это значение для общего развития, хотя можно оставить прежним
virtual_uid_maps = hash:/etc/postfix/virtual_uid_maps
# Поменяем это значение для общего развития, хотя можно оставить прежним
virtual_gid_maps = hash:/etc/postfix/virtual_gid_maps
# а если у нас всегда uid=gid, то можно только один файл
# из них сделать и тут указать его в обоих случаях,
# либо virtual_gid_maps = $virtual_uid_maps
user@domain111.ru domain111.ru/user/[console]postmap /etc/postfix/virtual_mailbox_maps[/console]Создадим файлы с UID-ами и GID-ами /etc/postfix/virtual_uid_maps (virtual_gid_maps в моем случае такой же):
user@domain.ru domain.ru/user/
user@domain111.ru 1001[console]postmap /etc/postfix/virtual_uid_maps
user@domain.ru 1001
postmap /etc/postfix/virtual_gid_maps[/console]Укажем UID и GID переносимого пользователя для довекота /etc/dovecot/users:
user@domain111.ru::1001:1001Зашифруем пароль пользователя[console]dovecotpw -s DIGEST-MD5 -u user@domain.ru[/console]Добавим пользователя с его зашифрованным паролем в базу паролей /etc/dovecot/passwd:
user@domain.ru::1001:1001
user@domain111.ru:{DIGEST-MD5}582d7341460se47911cdb4b3d800aafcПерезапускаем dovecot и postfix, проверяем отправку и получение писем перенесенным пользователем. Теперь его почтовый ящик находится по адресу /var/mail/virtual/domain.ru/user/
user@domain.ru:{DIGEST-MD5}4fe5g32cb1at8a13b64cfj4d894e7ae2
Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).
Устанавливаем mysql-сервер (mysql-server-5.0) и связующее звено между ним и postfix-ом (postfix-mysql).
Переходим в mysql[console]mysql -p[/console]Создаем базу[console]mysql> create database mail;[/console]В ней создаем таблицу, в зависимости от того, какие значения мы хотим хранить в базе.[console]mysql> CREATE TABLE `mail_users` (
`id` int(10) NOT NULL auto_increment,
`user` varchar(128) collate cp1251_general_cs NOT NULL,
`domain` varchar(255) collate cp1251_general_cs NOT NULL default 'squid.cetcoltd.ru',
`password` varchar(64) collate cp1251_general_cs NOT NULL,
`active` tinyint(1) NOT NULL default '1',
`alias` varchar(255) collate cp1251_general_cs NOT NULL default 'info@squid.cetcoltd.ru',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs COMMENT='postfix_dovecot';[/console]
Назначаем пользователя, которому можно только делать выборку из баз (только чтение), от имени которого будут получать информацию из базы наши postfix и dovecot.
[console]mysql> GRANT SELECT ON mail.mail_users TO 'mailuser'@'localhost' IDENTIFIED BY 'password';[/console]Заменяем значение в файле /etc/postfix/main.cf:
#virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_mapsСоздаем файл /etc/postfix/virtual_mailbox_maps.cf , в котором будет храниться информация о том, как из базы mysql получить необходимую информацию:
virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf
user = mailuserСтроку с запросом так же можно записать другим способом:
password = password
dbname = mail
hosts = 127.0.0.1:3306
query = SELECT CONCAT(domain,'/',user,'/') as home FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'
query = SELECT '%d/%u/' as home FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'Тут должно быть понятно. Выбираем объединение домена, /, пользователя, / из таблицы, где пользователь = полученный user, domain = домен. Таким образом запрос должен возвращать ответ вида:
domain.ru/user/Это значение прибавляется к virtual_mailbox_base и получается полный путь к почтовому ящику
/var/mail/virtual/domain.ru/user/Тоже самое делаем и с alias. Правим /etc/postfix/main.cf:
virtual_alias_maps = mysql:/etc/postfix/virtual_alias_maps.cfФайл /etc/postfix/virtual_alias_maps.cf такой же, как и /etc/postfix/virtual_mailbox_maps.cf, за исключением строки запроса:
query = SELECT alias FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'Так же можно поступить с uid и gid, но для этого нужно было в нашу таблицу добавить соответствующие поля. Я предпочетаю вариант uid и gid = static:1001.
Проверяем, работает ли эта связка. Отправляем себе письмо с другого ящика и смотрим логи. Еще можно проверять размер ящика: [console]du -s /var/mail/virtual/domain.ru/user[/console]У меня он меняется килобайта на 4 при приеме тестового письма.
С SMTP закончили, теперь нам нужно изменить dovecot (pop3, imap) на использование данных из mysql. Вносим изменения в файл /etc/dovecot/dovecot.conf:
passdb sql {Теперь редактируем файл /etc/dovecot/dovecot-sql.conf:
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
# Драйвер - к какой базе данных подключаемся.%u - это полностью имя пользователя, как его передали, а %n - только его первая часть, в случае если был использован вид user@domain.
driver = mysql
# Перечисляем базу, имя пользователя и его пароль
connect = host=localhost dbname=mail user=mailuser password=password
# Указываем, в каком виде лежит в базе зашифрованный пароль
default_pass_scheme = PLAIN-MD5
# SQL-Запрос на получение пароля из базы.
password_query = SELECT password FROM mail_users WHERE user = '%n' AND domain = '%d'
# SQL-Запрос на получение пути к почтовому ящику. UID и GID у нас в базе не лежат, по-этому подставляем значение прямо в запрос.
user_query = SELECT '1001' as uid, '1001' as gid FROM mail_users WHERE user = '%n' AND domain = '%d'
Проверяем почту по обоим протоколам pop3 и imap - есть письмо.
Для того, чтобы не было недопонимания, убираем предыдущую поддержку пользователей через passwd-файлы. Для этого нужно закомментировать в файле /etc/dovecot/dovecot.conf строки:
#passdb passwd-file {Готово.
# Path for passwd-file
#args = /etc/dovecot/passwd
#}
#userdb passwd-file {
# Path for passwd-file
#args = /etc/dovecot/users
#}
Пункт №8. Установка и настройка http-сервера (apache) и подключение к нему почтового web-интерфейса (squirrelmail).
Устанавливаем пакеты squirrelmail и squirrelmail-locales. Идем в /etc/squirrelmail/apache2.conf, копируем оттуда верхушку
Alias /squirrelmail /usr/share/squirrelmail
<Directory /usr/share/squirrelmail>
Options Indexes FollowSymLinks
<IfModule mod_php4.c>
php_flag register_globals off
</IfModule>
<IfModule mod_php5.c>
php_flag register_globals off
</IfModule>
<IfModule mod_dir.c>
DirectoryIndex index.php
</IfModule>
# access to configtest is limited by default to prevent information leak
<Files configtest.php>
order deny,allow
deny from all
allow from 127.0.0.1
</Files>
</Directory>
и вставляем в /etc/apache2/apache2.conf или в /etc/apache2/sites-available/default. Куда хотите. Web-интерфейс станет доступен по адресу http://domain.ru/squirrelmail. Можно изменить на http://domain.ru/mail, для этого необходимо в той части, которую копировали изменить первую строку
Alias /mail /usr/share/squirrelmailПерезагружаем apache, заходим браузером на наш domain.ru/squirrelmail, если работает почтовый клиент по imap протоколу, то и squirrelmail заработает без проблем. Вводим логин, пароль и пользуемся. Для изменения языка интерфейса используем утилиту squirrelmail-configure. Выбираем 10. Languages, приводим значения к виду
1. Default Language : ru_RU
2. Default Charset : cp1251
Пункт №9. Установка и подключение Антиспам-фильтра SPAMASSASIN. Пользователю будет приходить уведомление о том, что ему пытались отправить спам. Исходное помеченное как спам сообщение будет вложено в это письмо.
Устанавливаем spamassassin и spamc. Конфигурационный файл - /etc/spamassassin/local.cf:
rewrite_header Subject *****SPAM*****Остальное можно оставить по-умолчанию. Если попытаемся запустить службу[console]root@computername:~# /etc/init.d/spamassassin restart[/console]то увидим ошибку
SpamAssassin Mail Filter Daemon: disabled, see /etc/default/spamassassinИдем в файл /etc/default/spamassassin и исправляем:
ENABLED=1Далее идем в /etc/postfix/master.cf и прикручиваем туда антиспам проверку.
Вместо строки
smtp inet n - - - - smtpdвставляем
smtp inet n - n - - smtpdКаждая вторая строчка из приведенных должны начинаться в этом файле с двух пробелов. Только в этом случае она будет считаться продолжением предыдущей. virtual - пользователь, которого мы создали. Перезапускаем postfix, spamassassin и пытаемся сами себе отправить письмо с содержанием сигнатуры спама:
-o content_filter=spam:dummy
spam unix - n n - - pipe
flags=R user=vmail argv=/usr/bin/spamc -u vmail -e /usr/sbin/sendmail -f $sender $recipient
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34XЧерез несколько секунд нам придет письмо с темой *****SPAM*****, в котором будет рассказано (к сожалению на английском), что нам пытались отправить спам-письмо, которое будет прикреплено вложением и мы его сможем прочитать. Можно настроить, чтобы уведомление приходило на русском языке. Для этого берем шаблон, переводим на русский, переводим в другую кодировку (из utf8 в koi8-r, чтобы русский был, а не крокозябры) и добавляем к конфигу /etc/spamassassin/local.cf[console]root@computername:~# cp /usr/share/spamassassin/10_10_default_prefs.cf /tmp/text1[/console]
report_charset ru_RU.KOI8-R[console]cat /tmp/text1 |iconv -f utf8 -t koi8-r>/tmp/text2
clear_report_template
report Система СПАМ-обороны на сервере "_HOSTNAME_"
report пометила данное сообщение как возможную рекламу. Исходное сообщение
report было присоеденино к данному, так что вы можете его просмотреть
report либо добавить фильтр на его основании. Если у вас есть какие-либо
report вопросы, обратитесь к разделу _CONTACTADDRESS_ для получения
report дополнительной информации
report Предпросмотр исходного сообщения: _PREVIEW_
report
report Content analysis details: (_SCORE_ points, _REQD_ required)
report
report " pts rule name description"
report ---- ---------------------- --------------------------------------------------
report _SUMMARY_
clear_unsafe_report_template
unsafe_report Исходное сообщение не является простым текстом, и открывать его
unsafe_report может быть небезопасно. Оно может содержать подтверждение о том,
unsafe_report что ваш почтовый ящик благополучно получаем спам-сообщения.
unsafe_report Если вы все равно хотите его просмотреть, будет безопасно сделать
unsafe_report это с помощью любого текстового редактора, например "блокнот".
root@computername:~# cat /tmp/text2 >> /etc/spamassassin/local.cf[/console]Перезагружаем spamassassin, шлем себе тестовое спам-письмо и читаем.
Пункт №10. Устанавливаем и подключаем антивирусную проверку писем. Пользователю, которому пытались прислать письмо с вирусом, будет приходит вместо этого письма уведомление об этом факте и инструкция, как получить зараженное письмо вопреки всему.
Устанавливаем пакеты clamav и clamsmtp. После установки пакетов следует сразу же обновить антивирусные базы командой freshclam. Добавляем в файл /etc/postfix/main.cf строку:
content_filter = scan:[127.0.0.1]:10026Которая указывает smtp-серверу, чтобы он проверял содержимое письма с помощью фильтра scan, работающего на локальном порту 10026.
В файл /etc/postfix/master.cf первыми строками (перед спам-проверкой):
scan unix - - n - 16 smtpНапоминаю, что необходимо ставить два пробела впереди строки, чтобы она считалась продолжением предыдущей.
-o smtp_send_xforward_command=yes
-o smtp_tls_security_level=none
127.0.0.1:10025 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
Конфигурационный файл антивирусного фильтра /etc/clamsmtpd.conf оставляем без изменений:
OutAddress: 10025Остальное я оставил так как есть.
Listen: 127.0.0.1:10026
ClamAddress: /var/run/clamav/clamd.ctl
TempDirectory: /var/spool/clamsmtp
PidFile: /var/run/clamsmtp/clamsmtpd.pid
User: clamsmtp
По-умолчанию, антивирусный фильтр будет просто молча отбрасывать все письма, содержащие по его мнению вирусы. Согласитесь, было бы неплохо уметь настраивать его так, чтобы нам приходило уведомление об этом с возможностью таки получить это письмо.
Пишем простенький скриптик /tmp/text3:
#!/bin/shКоторый так же как и в случае со спамом перекодируем[console]cat /tmp/text3|iconv -f utf8 -t koi8-r>/etc/virusaction.sh[/console]делаем его запускным[console]chmod +x /etc/virusaction.sh[/console]Добавляем в файл /etc/clamsmtpd.conf строку:
ADMIN="admin@mail.ru"
MAILTO="$RECIPIENTS,$ADMIN"
SUBJECT=$(cat $EMAIL|grep Subject|awk -F: '{print $2}')
TEXT="ВНИМАНИЕ!!!\n\nНа почтовый адрес $RECIPIENTS пришло сообщение, содержащее ВИРУС!\n"
TEXT=$TEXT"\nНе волнуйтесь, вирус обезврежен антивирусным программным обеспечением, установленным на почтовом сервере."
TEXT=$TEXT"\nВашим данным ничто не угражает."
if [ "x$EMAIL" != "x" ] && [ -f $EMAIL ]
then
TEXT=$TEXT"\nПисьмо добавлено в карантин: $EMAIL \n"
fi
TEXT=$TEXT"\nОтправитель: $SENDER"
TEXT=$TEXT"\nТема сообщения: $SUBJECT"
TEXT=$TEXT"\nИдентификатор Вируса: $VIRUS"
#TEXT=$TEXT"\nПочтовый клиент: $CLIENT"
#TEXT=$TEXT"\nПочтовый сервер: $SERVER"
TEXT=$TEXT"\n\nЕсли вы уверены, что письмо не содержит вредоносного содержимого, либо, не смотря ни на что, вы все равно хотите прочитать данное сообщение и готовы взять всю ответственность за возможные компьютерные неисправности и сбои на себя, перешлите это сообщение администратору сервера по адресу $ADMIN"
TEXT=$TEXT"\nОбратите внимание, что в карантине зараженные письма находятся 7 дней, после чего удаляются без возможности восстановления!"
TEXT=$TEXT"\n\nС наилучшими пожеланиями,\nВаш администратор."
echo "$TEXT" | mail -s "[ВИРУС] $SUBJECT" $MAILTO
VirusAction: /etc/virusaction.shперезапускаем postfix и clamsmtpd, отправляем себе письмо, содержащее в теле сообщения
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*Получаем уведомление на русском. Если ваши пользователи могут захотеть получать свои зараженные письма, вам следует в файле /etc/clamsmtpd.conf добавить опцию
Quarantine: onПосле чего им в уведомлении будет указан файл-карантин, в котором хранится зараженное письмо.
Письмо добавлено в карантин: /var/spool/clamsmtp/virus.MQYlXXВы просто копируете файл-карантин в его папку[console]cp /var/spool/clamsmtp/virus.MQYlXX /var/mail/virtual/domain.ru/user/new/[/console]После чего он благополучно получит свое письмецо.
------------------------------------------------------------
6. Популярные ошибки и ЧАВО
Во-первых, Не удалось подружить squirrelmail и отчет о спам- и вирус- блокировках. Видно все крокозябрами, хотя почтовые клиенты отображают все отлично, и squirrelmail видит другие письма на русском нормально.
Во-вторых, я сначала в файле /etc/dovecot/dovecot-sql.conf запрос пароля указал так:
password_query = SELECT user, password FROM mail_users WHERE user = '%n' AND domain = '%d'После чего испытал такие глюки, каких не ожидал: либо во втором запросе в базу не передавалось значение домена, либо вместо второго запроса подставлялся совершенно другой. Очень удивился, когда все заработало нормально после удаления слова user, из password_query-запроса.
В-третьих, все работало хорошо до некоторых пор. Письма перестали уходить, postqueue -p выдавал большую очередь, у всех зависших писем одна и та же проблема:
(host 127.0.0.1[127.0.0.1] said: 451 Local Error (in reply to end of DATA command))
Начал рыть. Временное решение проблемы - отключить в postfix проверку на вирусы. Для этого необходимо закомментировать в файле /etc/postfix/main.cf строчку content_filter. Письма стали уходить, но без проверки на вирусы. Разбираемся дальше.
tail /var/log/mail.logвыдал
clamsmtpd: 100011: CLAMAV: couldn't connect to: /var/run/clamav/clamd.ctl: No such file or directoryИдем дальше.
/etc/init.d/clamav-daemon status* clamd is not running.
/etc/init.d/clamav-daemon startВидим много слов, среди которых
...Обновляемся
This ClamAV version has reached End of Life! Please upgrade to version 0.95 or later.
...
apt-get update
apt-get install clamav clamav-baseЗапускаем
/etc/init.d/clamav-daemon restart
/etc/init.d/clamsmtp restartИзменяем postfix на использование антивирусной проверки (надо раскомментировать content_filter) и перезапускаемся
/etc/init.d/postfix restartПроверяем - все работает.
P.S. Данный раздел будет пополняться
------------------------------------------------------------
7. Приложение. Порядок отправки/приёма писем.
Порядок отправки писем
В этой цепочке участвуют только клиентская программа (thunderbird, outlook), наш сервер smtp (postfix), другой сервер smtp (postfix, exim, qmail, exchange...)
Наш сервер postfix принимает соединение на 25 порту. Ему все равно, подключился к нему его клиент через почтовую программу, который хочет отправить это письмо кому-то дальше, или удаленный сервер, который хочет передать нашему серверу письмо для его клиента;
Проверяет, для кого предназначено письмо. Если для домена, который он обслуживает - то принимает письмо, ищет у себя в базе пользователей этого домена путь к ящику вида "/var/mail/virtual/domain.ru/user". Если такой пользователь (ящик) есть - перекладывает файл-письмо туда. Если такого пользователя нет, отправителю исходного письма отправляется соответственное уведомление (письмом).
Если письмо предназначено для пользователя из другого домена - запрашивает логин/пароль (иначе наш сервер считался бы OPEN RELAY и мог слать через себя СПАМ);
Полученные данные отправляет механизму аутентификации, заимствованному у dovecot, через файл /var/spool/postfix/private/auth. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Письмо помещается в очередь сообщений.
В это время наш сервер, используя DNS-сервер, прописанный в /etc/resolv.conf, узнает MX-запись (ip-адрес), соответствующую почтовому серверу, обслуживающему домен получателя. При отсутствии MX -записи делается попытка отправить на A запись;
Связывается с полученным ip-адресом на порт 25 (как если бы это был обычный почтовый клиент);
Если этот сервер действительно обслуживает этот домен, то он принимает письмо, проверяет наличие пользователя и помещает его в свою очередь, после чего письмо скорее всего переместится в каталог этого пользователя.
Если же этот сервер ошибочно указан в зоне DNS, как обслуживающий этот домен, то он не станет принимать это сообщение;
Порядок приема писем
В этой цепочке участвуют только сервер pop3/imap (dovecot) и клиентская программа (thunderbird, outlook).
Клиентская программа подключается к серверу на порт 110 (pop3) или imap (143);
Сервер выдает приглашение к аутентификации, получает данные, сверяет с базой. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Исходя из принятого логина сервер получает полный путь к каталогу, в котором лежит его почта;
Исходя из содержимого этого каталога сервер предоставляет список всех писем клиенту;
Клиентская программа исходя из полученного списка выдает пользователю на экран перечень писем, хранящихся на сервере;
------------------------------------------------------------
8. Используемая и рекомендуемая литература
http://ru.wikipedia.org/wiki/Электронная_почта
http://www.postfix.org/documentation.html
http://wiki.dovecot.org/
http://dedicatesupport.com/archives/20
http://dedicatesupport.com/archives/21
http://www.sys-adm.org.ua/mail/postfix-clamsmtp-sa.php#c2