Почтовый сервер (postfix, dovecot, squirrelmail)
План:
1. Введение2. Чего хотим добиться
3. Что нам понадобится
4. Составляем план действий
5. Настройка согласно плану
6. Администрирование системы
7. Популярные ошибки и ЧАВО
8. Приложение. Порядок отправки/приёма писем.
9. Используемая и рекомендуемая литература
1. Введение
Мало кто будет спорить, что широкому развитию глобальной сети Интернет поспособствовала возможность мгновенного обмена электронной почтой.
Материал из Википедии — свободной энциклопедии
Электронная почта (англ. email, e-mail, от англ. electronic mail) — технология и предоставляемые ею услуги по пересылке и получению электронных сообщений (называемых «письма» или «электронные письма») по распределённой (в том числе глобальной) компьютерной сети. Основным отличием от прочих систем передачи сообщений (например, служб мгновенных сообщений) является возможность отложенной доставки и развитая (и запутанная из-за длительного времени развития) система взаимодействия между независимыми почтовыми серверами.
Трудно себе представить уважающую себя коммерческую организацию, не имеющую собственного почтового сервера, обрабатывающего почтовые ящики своего домена. Почтовый сервер, работающий под операционной системой GNU/Linux - признак хорошего тона со стороны системного администратора такой компании. О настройке такой системы мы и поговорим в этой статье.
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. Нам его хватит за глаза.
Пункт 8. Чтобы все письма (как входящие, так и исходящие) дублировались на определенный адрес (например, admin@domain.ru)
Это бывает необходимо, например, для контроля переписки менеджеров с клиентами.
3. Что нам понадобится
Пункт 1. Нам нужен компьютер с установленной операционной системой GNU|Linux Ubuntu 8.04 LTS желательно со всеми обновлениями и права администратора на нём.
Код: Выделить всё
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)
Пункт №2. На этом компьютере должен быть доступ в интернет. Любой: dhcp, pppoe, pptp, через шлюз, WiMax, WiFi - что угодно.
Код: Выделить всё
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
Пункт №3. Открытые в файерволе порты для smtp (tcp 25), pop3 (tcp 110), imap (tcp 143) и http (tcp 80) для доступа через web-интерфейс
Код: Выделить всё
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
Пункт №4. Доступ к нашему компьютеру на перечисленные выше порты из Интернета. Для этого необходим внешний статический (постоянный) ip-адрес на нашем компьютере, либо на компьютере (маршрутизаторе, модеме), который является шлюзом для нашего компьютера, и на котором нужно будет настроить переброс перечисленных портов на внутренний ip-адрес нашего компьютера. Либо динамический (меняющийся время от времени) внешний ip-адрес, но при этом необходимо пользоваться услугами сервисов динамических dns. Файервол провайдера не должен резать соединения по этим портам.
Код: Выделить всё
user@client:~# host -t mx domain.ru
domain.ru mail is handled by 10 cluster.relay.agava.net.
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
Показаны только те порты, на которых висят службы. В этом примере я еще не поднял pop3 и imap.
Пункт №5. FQDN. Доменное имя, привязанное к нашему внешнему ip-адресу, или mx-запись в dns-зоне на dns-сервере вида
Код: Выделить всё
user@client:~# host -t mx domain.ru
domain.ru mail is handled by 10 62.5.246.190
Код: Выделить всё
user@client:~# nslookup domain.ru
Non-authoritative answer:
Name: domain.ru
Address: 62.5.246.190
Пункт №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, настраиваем пересылку всех писем на адрес admin@domain.ru.
Пункт №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
helo localhost
mail from:<>
rcpt to:<user@computername>
data
тут пишем текст, например hello
. (просто точка)
quit
Получаем в ответ
Код: Выделить всё
250 2.0.0 Ok: queued as 2AB015121B3
После чего проверяем, доставлено ли письмо адресату
Код: Выделить всё
cat /var/log/mail.log|grep 2AB015121B3
В выводе должно быть
Код: Выделить всё
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
Проверяем
Код: Выделить всё
cat /var/mail/user
From MAILER-DAEMON Sat Jan 16 17:02:34 2010
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
Далее, устанавливаем пакет mailutils и получаем этим пользователем почту.
Код: Выделить всё
root@computername:~/# su user
user@computername:~/# mail
"/var/mail/user": 1 сообщение 1 новое
>N 1 MAILER-DAEMON Сбт Янв 16 12/416 MAILER-DAEMON
&
Код: Выделить всё
1
Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
From: MAILER-DAEMON
To: undisclosed-recipients:;
hello
&
Код: Выделить всё
q
1 сообщение удержано в /var/mail/user
Отлично, письмо получено. Попробуем отправить письмо:
Код: Выделить всё
echo "hello"|mail -s "Subject" user
Этой командой мы вывели слово hello, но вывод перенаправили в программу mail, которая завернула это слово в текст сообщения (так уж она работает, и это логично), темой сообщения обозначили "Subject" и отправили это все пользователю user. Если мы от его имени проверим почту еще раз - увидим и это сообщение в списке писем. Почтовая система работает, но только внутри системы. Осталось её настроить на нормальную работу.
Забэкапим оригинал конфига
Код: Выделить всё
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
и можно приступать.
Идем в 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
myhostname = $myorigin
mydestination = computername, localhost.localdomain, , localhost, $myorigin
Перезагружаем postfix, теперь можем проверить отправку почты внешним адресатам:
Код: Выделить всё
telnet localhost 25
helo localhost
mail from:<user@domain.ru>
rcpt to:<admin@mail.ru>
data
Subject: helloworld
Good mornong
.
Получаем в ответ
Код: Выделить всё
250 2.0.0 Ok: queued as 97B365121B0
или же
Код: Выделить всё
echo "Good job"|mail -s "test message" admin@mail.ru
но тогда мы не узнаем идентификатор письма (97B365121B0) для поиска и устранения ошибок.
На мэйле проверяем письмо через секунд 5-10. Если ничего нет, то выполняем
Код: Выделить всё
cat /var/log/mail.log |grep 97B365121B0
В моем случае все прошло нормально, и в логах об этом сообщают вот что:
Код: Выделить всё
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
Ключевое словосочетание 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-ом. В логах это видно так:
Код: Выделить всё
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)
Подмена ящика видна из слов to=<user@domain.ru>, orig_to=<root@domain.ru>.
Если нам понадобится добавить еще один алиас, например
user2: root
postmaster: user2
то после сохранения файла /etc/aliases необходимо выполнить
Код: Выделить всё
postalias /etc/aliases
или просто
Код: Выделить всё
newaliases
потому что postfix работает не с этим файлом напрямую, а с /etc/aliases.db, который получается путем преобразования исходного файла. Причем пользователи postmaster и user2 не обязательно должны присутствовать в системе. Письма для них все равно пересылаются от одного другому, от другого руту, а от рута нашему user-у. Так что алиасы добавляются намного проще, чем пользователи в нашу почтовую систему.
Для настройки пересылки всех писем на адрес admin@domain.ru необходимо в конфигурационный файл /etc/postfix/main.cf добавить опции
always_bcc=admin@domain.ru
receive_override_options=no_address_mappings
Первая отвечает за адрес, куда будут принудительно пересылаться все проходящие через наш сервер письма. Учитывая то, что я выставил always_bcc=admin@domain.ru (т.е. в этом же домене, который обслуживает наш сервер), то ему (пользователю admin) помимо того, что отправляется копия, еще отправляются 2 копии этой копии. Для решения этой проблемы и нужна вторая строчка.
Пока что все отлично. Письма уходят и приходят. Что еще для счастья нужно?
Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.
Устанавливаем dovecot-pop3d и dovecot-imapd. Конфигурационный файл /etc/dovecot/dovecot.conf по-умолчанию такой:
protocols = imap imaps pop3 pop3s
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 {
}
Бэкапим и редактируем, добавив 1 опцию и отредактировав 1 опцию
# imaps и pop3s нам не нужны
protocols = imap pop3
# разрешаем принимать пароли открытым текстом
disable_plaintext_auth = no
После этого перезапускаем dovecot и проверяем почтовым клиентом pop3 и imap.
Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности.
Для общего развития нам необходимо добавить возможность отправлять письма через наш почтовый сервер без авторизации всем, чьи компьютеры расположены в локальной сети сервера. Для этого необходимо в main.cf добавить 1 строку и изменить 1 строку:
mynetworks = 127.0.0.0/8 192.168.0.0/24
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Очевидно, что если мы туда же запишем наш домашний ip-адрес, то и из дома мы сможем отправлять письма через сервер без пароля. Во второй строке разрешается отправлять письма не только тем, кто находится в "моих сетях", но и прошедшим аутентификацию. Прикрутим её сюда.
Пункт №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 {
mechanisms = plain login
socket listen {
client {
path = /var/spool/postfix/private/auth
user = postfix
}
}
перезапускаем postfix и dovecot.
Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.
Добавляем в /etc/postfix/main.cf:
# прописываем домены, для чьих пользователей будет принимать письма наш сервер
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
Добавляем пользователя в систему, под чьим именем будет храниться вся почта
Код: Выделить всё
groupadd -g 1001 vmail
useradd -u 1001 -g 1001 vmail
Создаем папку /var/mail/virtual и назначаем ей права указанного пользователя и группы
Код: Выделить всё
mkdir /var/mail/virtual
chown 1001:1001 /var/mail/virtual
создем файл /etc/postfix/virtual_mailbox_maps с содержимым:
Код: Выделить всё
user@domain111.ru domain111.ru/user/
выполняем:
Код: Выделить всё
postmap /etc/postfix/virtual_mailbox_maps
С smtp-сервером закончили. Теперь идем к pop3/imap. Правим /etc/dovecot/dovecot.conf:
# Тут будет лежать почта виртуальных пользователей
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
}
Добавляем пользователя в /etc/dovecot/users:
user@domain111.ru::1001:1001
Генерируем пароль для пользователя
Код: Выделить всё
dovecotpw -s DIGEST-MD5 -u user@domain111.ru
И кладем его в файл паролей /etc/dovecot/passwd:
user@domain111.ru:{DIGEST-MD5}583d7d41e60ae44911cdb4b3d800aafc
Проверяем - должно все работать.
После этого мои системные пользователи локального домена (domain.ru) работать перестали (не получают и не отправляют почту). Копал-копал и решил, что dovecot-у для проверки пользователя необходимо указать "логин@домен", а системные пользователи у нас работали только через "логин". Я ломать голову не стал и, учитывая что все пользователи все равно у меня будут виртуальными, начал переносить исходный домен с пользователями.
Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.
Подправим конфиг постфикса /etc/postfix/main.cf:
# возвращаем обратно
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
Подправим ряды виртуальных пользователей /etc/postfix/virtual_mailbox_maps:
user@domain111.ru domain111.ru/user/
user@domain.ru domain.ru/user/
Код: Выделить всё
postmap /etc/postfix/virtual_mailbox_maps
Создадим файлы с UID-ами и GID-ами /etc/postfix/virtual_uid_maps (virtual_gid_maps в моем случае такой же):
user@domain111.ru 1001
user@domain.ru 1001
Код: Выделить всё
postmap /etc/postfix/virtual_uid_maps
postmap /etc/postfix/virtual_gid_maps
Укажем UID и GID переносимого пользователя для довекота /etc/dovecot/users:
user@domain111.ru::1001:1001
user@domain.ru::1001:1001
Зашифруем пароль пользователя
Код: Выделить всё
dovecotpw -s DIGEST-MD5 -u user@domain.ru
Добавим пользователя с его зашифрованным паролем в базу паролей /etc/dovecot/passwd:
user@domain111.ru:{DIGEST-MD5}582d7341460se47911cdb4b3d800aafc
user@domain.ru:{DIGEST-MD5}4fe5g32cb1at8a13b64cfj4d894e7ae2
Перезапускаем dovecot и postfix, проверяем отправку и получение писем перенесенным пользователем. Теперь его почтовый ящик находится по адресу /var/mail/virtual/domain.ru/user/
Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).
Устанавливаем mysql-сервер (mysql-server-5.0) и связующее звено между ним и postfix-ом (postfix-mysql).
Переходим в mysql
Код: Выделить всё
mysql -p
Создаем базу
Код: Выделить всё
mysql> create database mail;
В ней создаем таблицу, в зависимости от того, какие значения мы хотим хранить в базе.
Код: Выделить всё
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';
Назначаем пользователя, которому можно только делать выборку из баз (только чтение), от имени которого будут получать информацию из базы наши postfix и dovecot.
Код: Выделить всё
mysql> GRANT SELECT ON mail.mail_users TO 'mailuser'@'localhost' IDENTIFIED BY 'password';
Заменяем значение в файле /etc/postfix/main.cf:
#virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf
Создаем файл /etc/postfix/virtual_mailbox_maps.cf , в котором будет храниться информация о том, как из базы mysql получить необходимую информацию:
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.
Проверяем, работает ли эта связка. Отправляем себе письмо с другого ящика и смотрим логи. Еще можно проверять размер ящика:
Код: Выделить всё
du -s /var/mail/virtual/domain.ru/user
У меня он меняется килобайта на 4 при приеме тестового письма.
С SMTP закончили, теперь нам нужно изменить dovecot (pop3, imap) на использование данных из mysql. Вносим изменения в файл /etc/dovecot/dovecot.conf:
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
Теперь редактируем файл /etc/dovecot/dovecot-sql.conf:
# Драйвер - к какой базе данных подключаемся.
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'
%u - это полностью имя пользователя, как его передали, а %n - только его первая часть, в случае если был использован вид user@domain.
Проверяем почту по обоим протоколам 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*****
Остальное можно оставить по-умолчанию. Если попытаемся запустить службу
Код: Выделить всё
root@computername:~# /etc/init.d/spamassassin restart
то увидим ошибку
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
-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
Каждая вторая строчка из приведенных должны начинаться в этом файле с двух пробелов. Только в этом случае она будет считаться продолжением предыдущей. virtual - пользователь, которого мы создали. Перезапускаем postfix, spamassassin и пытаемся сами себе отправить письмо с содержанием сигнатуры спама:
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
Через несколько секунд нам придет письмо с темой *****SPAM*****, в котором будет рассказано (к сожалению на английском), что нам пытались отправить спам-письмо, которое будет прикреплено вложением и мы его сможем прочитать. Можно настроить, чтобы уведомление приходило на русском языке. Для этого берем шаблон, переводим на русский, переводим в другую кодировку (из utf8 в koi8-r, чтобы русский был, а не крокозябры) и добавляем к конфигу /etc/spamassassin/local.cf
Код: Выделить всё
root@computername:~# cp /usr/share/spamassassin/10_10_default_prefs.cf /tmp/text1
report_charset ru_RU.KOI8-R
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 это с помощью любого текстового редактора, например "блокнот".
Код: Выделить всё
cat /tmp/text1 |iconv -f utf8 -t koi8-r>/tmp/text2
root@computername:~# cat /tmp/text2 >> /etc/spamassassin/local.cf
Перезагружаем 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
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
Который так же как и в случае со спамом перекодируем
Код: Выделить всё
cat /tmp/text3|iconv -f utf8 -t koi8-r>/etc/virusaction.sh
делаем его запускным
Код: Выделить всё
chmod +x /etc/virusaction.sh
Добавляем в файл /etc/clamsmtpd.conf строку:
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
Вы просто копируете файл-карантин в его папку
Код: Выделить всё
cp /var/spool/clamsmtp/virus.MQYlXX /var/mail/virtual/domain.ru/user/new/
После чего он благополучно получит свое письмецо.
6. Администрирование системы
Администрирование почтовой системы (во всяком случае у меня) сводится к следующим действиям:
а) управление почтовыми ящиками (добавление, удаление, изменение пароля, алиас и пр.)
б) резервное архивирование почтовых ящиков с их письмами
в) восстановление писем и ящиков из резервных копий
г) вытаскивать из карантина зараженные вирусами письма, которые просят пользователи
Управление почтовыми ящиками (добавление, удаление, изменение пароля, алиас и пр.)
Так как все почтовые ящики с их зашифрованными паролями в конечном счете у нас хранятся в базе mysql, то и управление этими почтовыми ящиками сводится к редактированию этой базы. Для себя я набросал небольшой скрипт:
#!/bin/bash
LOGIN="mysqluser"
PASS="password"
DATABASE="mail"
COMMAND="mysql -u$LOGIN -p$PASS $DATABASE -e "
case "$1" in
show)
$COMMAND " SELECT id, CONCAT(user,'@',domain) AS mailbox,alias as resend_to,active FROM mail_users ORDER BY mailbox"
;;
add)
$COMMAND "INSERT INTO mail_users (user,domain,password,active,alias) VALUES ('$2','$3',MD5('$4'),'1','$5')"
echo -e "Welcome to mail server $3!\nyour login: $2@$3\nyour password: $4"|mail -s "$3 - Добро пожаловать" $2@$3;
;;
del)
$COMMAND "DELETE FROM mail_users WHERE id = $2";
;;
off)
$COMMAND "UPDATE mail_users SET active = '0' WHERE id = $2";
$COMMAND " SELECT id, CONCAT(user,'@',domain) AS mailbox,alias as resend_to,active FROM mail_users WHERE id = $2"
;;
on)
$COMMAND "UPDATE mail_users SET active = '1' WHERE id = $2";
$COMMAND " SELECT id, CONCAT(user,'@',domain) AS mailbox,alias as resend_to,active FROM mail_users WHERE id = $2"
;;
alias)
$COMMAND "UPDATE mail_users SET alias = '$3' WHERE id = $2";
$COMMAND " SELECT id, CONCAT(user,'@',domain) AS mailbox,alias as resend_to,active FROM mail_users WHERE id = $2"
;;
password)
$COMMAND "UPDATE mail_users SET password = MD5('$3') WHERE id = $2";
;;
*)
echo -e "\n $0 - postfix useradministration mysql-script\nUsage:\n$0 show\n$0 add 'user' 'domain' 'password' ['alias1','alias2']\n$0 del 'id'\n$0 off 'id'\n$0 on 'id'\n$0 alias id 'alias1'[,'alias2','alias3']\n$0 password id 'newpassword'\n"
exit 1
;;
esac
exit 0
Попробуем запустить этот скрипт
Код: Выделить всё
./mailbox.sh
Usage:
./mailbox.sh show
./mailbox.sh add 'user' 'domain' 'password' ['alias1','alias2']
./mailbox.sh del 'id'
./mailbox.sh off 'id'
./mailbox.sh on 'id'
./mailbox.sh alias id 'alias1'[,'alias2','alias3']
./mailbox.sh password id 'newpassword'
Должно быть удобно.
Резервное архивирование почтовых ящиков с их письмами
Резервирование почтовых ящиков - это mysqldump базы mail. А резервирование почтовых ящиков - архивирование /var/mail/virtual. Но я решил копнуть чуть дальше, и выполняю архивирование не всего каталога, а каждого почтового ящика по-отдельности. Это кому-то может показаться лишним. Скрипт резервного копирования:
#!/bin/bash
LOGIN="mysqluser"
PASS="password"
DATABASE="mail"
DIR=/var/mail/virtual
BACKUPDIR=/backup/mail
TIME=$(date +%Y'-'%m'-'%d'--'%H'-'%M'-'%S)
mysqldump -u$LOGIN -p$PASS $DATABASE > $BACKUPDIR/mysqldump-$DATABASE-$TIME.sql
ls -d1 $DIR/* | while read domain_dir; do
domain=$(echo $domain_dir | awk -F'/' '{print $5}' )
ls -d1 $domain_dir/* | while read user_dir; do
user=$(echo $user_dir | awk -F'/' '{print $6}')
user_bkp_dir=$BACKUPDIR/$domain/$user
if [ ! -d $user_bkp_dir ]; then
mkdir -p $user_bkp_dir
fi
tar cjf $user_bkp_dir/$user'@'$domain-$TIME.tar.bz2 $user_dir 2>/dev/null
done
done
Ставим этот скрипт в крон.
Восстановление писем и ящиков из резервных копий
В данной ситуации нам придется вручную найти резервную копию необходимой даты, разархивировать её и найти в получившемся каталоге необходимые письма. Либо полностью переместить этот каталог в директорию /var/mail/virtual/
Вытаскивать из карантина зараженные вирусами письма, которые просят пользователи
Итак, нам пришло письмо
ВНИМАНИЕ!!!
На почтовый адрес admin@domain.ru пришло сообщение, содержащее ВИРУС!
Не волнуйтесь, вирус обезврежен антивирусным программным обеспечением, установленным на почтовом сервере.
Вашим данным ничто не угражает.
Письмо добавлено в карантин: /var/spool/clamsmtp/virus.ibCKbg
Отправитель: test@domain.ru
Тема сообщения: test
Идентификатор Вируса: Eicar-Test-Signature
Если вы уверены, что письмо не содержит вредоносного содержимого, либо, не смотря ни на что, вы все равно хотите прочитать данное сообщение и готовы взять всю ответственность за возможные компьютерные неисправности и сбои на себя, перешлите это сообщение администратору сервера по адресу admin@domain.ru
Обратите внимание, что в карантине зараженные письма находятся 7 дней, после чего удаляются без возможности восстановления!
С наилучшими пожеланиями,
Ваш администратор.
Сразу замечу, что ни через какие 7 дней у меня письма из карантина не удаляются. Это уведомление было сделано просто для информационно-технологической дисциплины пользователей. Итак, идем по адресу /var/spool/clamsmtp/, находим там файл virus.ibCKbg и копируем его, допустим, в /var/mail/virtual/domain.ru/admin/new
Код: Выделить всё
cp /var/spool/clamsmtp/virus.ibCKbg /var/mail/virtual/domain.ru/admin/new
После чего данное письмо появится у пользователя admin в новых сообщениях. Если нужно кому-то другому его переслать - то тоже вручную копируем
Код: Выделить всё
cp /var/spool/clamsmtp/virus.ibCKbg /var/mail/virtual/domain.ru/masha1986/new
7. Популярные ошибки и ЧАВО
Во-первых, Не удалось подружить 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. Данный раздел будет пополняться
8. Приложение. Порядок отправки/приёма писем.
Порядок отправки писем
В этой цепочке участвуют только клиентская программа (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);
Сервер выдает приглашение к аутентификации, получает данные, сверяет с базой. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Исходя из принятого логина сервер получает полный путь к каталогу, в котором лежит его почта;
Исходя из содержимого этого каталога сервер предоставляет список всех писем клиенту;
Клиентская программа исходя из полученного списка выдает пользователю на экран перечень писем, хранящихся на сервере;
9. Используемая и рекомендуемая литература
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
Комментариев нет:
Отправить комментарий