18.09.2012

Установка почтового сервера Exim4 и Dovecot и проксирование IMAP через Nginx

Отличная подборка информации: Exim 4.70 (lissyara)


Сначала капельку терминологии:

MTA - mail transfer agent. Это сервис, который передает почту между серверами, используя протокол SMTP. (эту задачу будет выполнять Exim4).

MSA - mail submission agent. Этот сервис используется для отправки почты пользователем с сервера наружу. Именно он получает запрос на обработку исходящего письма от нашего пользователя по протоколу SMTP на портах 25 или 587 и передает ее MTA для дальнейшей транспортировки. То есть это сервис для исходящей почты. (эту задачу будет выполнять Exim4).

MDA - mail delivery agent. Это сервис, который раскладывает почту по папкам, после того как MTA принял какую-то почту извне сервера для нашего пользователя. То есть это сервис для входящей почты. (эту задачу будет выполнять Exim4).

MRA - mail retrieval agent. Это сервис, который достает почту из папок для клиента, пришедшего по протоколам POP/IMAP. (эту задачу будет выполнять Dovecot).

MUA - mail user agent. Это программа, предоставляющая человеческий интерфейс для обращения к MRA по протоколу POP/IMAP. Она может быть исполнена как вэб-приложение на том же сервере (RoundCube, Squirrel, Horde, etc.) так и быть десктопным приложением (Outlook, Thunderbird, The Bat). В любом случае это приложение подключается к MRA на порт 110/143 и работает по протоколу POP/IMAP. (эту задачу будет выполнять десктопный клиент на стороне пользователя).


Цепочка отправки письма выглядит так:
MUA(Outlook, отсылка, ivanov@abc.com)-->MSA-->MTA(abc.com)-->
>-----интернет----->
-->MTA(xyz.com)-->MDA-->MRA-->MUA(Outlook, прием, petrov@xyz.com)

Любой из вышеперечисленных сервисов может работать не только по обычным протоколам, но и по шифрованным. Такие протоколы обозначаются буквами S в конце. Например IMAPS. Номера портов соответственно тоже меняются.

Итак приступим...


Все будет делаться на моем любимом Debian, поэтому Exim4 у нас уже стоит. Надо поставить еще Dovecot и два его модуля, по одному на каждый протокол:
apt-get install dovecot-common dovecot-imapd dovecot-pop3d


С настройки Dovecot и начнем.

Сохраняем конфигурационный файл и редактируем текущий:
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
chattr +i /etc/dovecot/dovecot.conf.orig
vi /etc/dovecot/dovecot.conf

В принципе лучше его пока не сильно трогать. Только перечислим протоколы да место, куда Exim4 будет складывать пришедшую почту для Dovcot'а:
protocols = imap imaps pop3 pop3s
mail_location = maildir:/var/mail/%u

Все остальное заведется из коробки. Можно будет принять и отправить почту. А остальное уже по желанию регулируется со временем. Намного проще

Так как у нас Dovecot будет искать пользователей через PAM (что очень по фэн-шую), то мы будем добавлять их в системе. В pam.d уже есть конфиг dovecot, в котором поиск ведется только по файлам unix.
В моем случае пользователи не должны ходить на сервер никак кроме почты, так что мы им сделаем несуществующий шелл. Создадим первого пользователя:
useradd -m -s /bin/false -p veph2Fei7u john.smith
Теперь мы можем запустить на своем десктопе почтового клиента и попробовать настроить.
Логин будет john.smith, пароль veph2Fei7u
Внимание, у Вас получится подключиться и по POP и по IMAP только если Вы поставите SSL-шифрование. Потому что в dovecot по умолчанию запрещено аутентифицироваться через plain-пароль. И пока мы не меняли конфиг так оно и есть:







Итак по сути у нас уже есть рабочий Dovecot.


Но создать учетную запись в почтовой программе пока не получится из-за ошибки SMTP. Ведь мы его еще не настроили.


Теперь перейдем к настройке Exim4.



Поменяем устанавливаемую по умолчанию light версию на heavy:
apt-get install exim4-daemon-heavy

Затем переконфигурируем Exim4 заново:
dpkg-reconfigure exim4-config
В процессе диалога мы выберем:
General type of mail configuration: internet site;
System mail name (ну тут понятно, на свой надо поменять): example.com
IP-addresses to listen on for incoming SMTP connections: <стираем все и оставляем пустое>
Other destinations for which mail is accepted: example.com
Domains to relay mail for: <стираем все и оставляем пустое>
Machines to relay mail for: <стираем все и оставляем пустое>
Keep number of DNS-queries minimal: NO
Delivery method for local mail (это религиозный момент): Maildir format in home directory
Split configuration into small files: YES





Обязательно надо создать сертификаты. И тут милейший сюрприз. Пакет exim4-base содержит генератор сертификатов.... замаскированный под документацию. Прямо как пасхальное яйцо. Запустим его:
/usr/share/doc/exim4-base/examples/exim-gencert
После нескольких несложных вопросов у нас появятся сертификаты в директории /etc/exim4:
# ls -l /etc/exim4 | egrep 'crt|key'
-rw-r----- 1 root Debian-exim   912 Sep 17 22:13 exim.crt
-rw-r----- 1 root Debian-exim   887 Sep 17 22:13 exim.key
Создадим дополнительный конфиг. Все его опции достаточно очевидны из названия, кроме последней. Она запрещает проверять пароль, отосланный в открытом виде (без TLS):
tee > /etc/exim4/conf.d/main/00_exim4-config_local_options

CHECK_RCPT_REVERSE_DNS = no
CHECK_RCPT_IP_DNSBL = zen.spamhaus.org:dnsbl.sorbs.net:cbl.abuseat.org:bl.spamcop.net
CHECK_RCPT_VERIFY_SENDER = yes
CHECK_DATA_VERIFY_HEADER_SENDER = yes
MAILDIR_HOME_MAILDIR_LOCATION = /var/mail/$local_part
MAIN_TLS_ENABLE = yes
tls_on_connect_ports = 465:587
daemon_smtp_ports = 25:465:587
AUTH_SERVER_ALLOW_NOTLS_PASSWORDS = no
Порт 587 используется теми клиентами, которым провайдер Интернета запретил исхождение на 25-й. И если 25-й порт используется и MTA и MSA, то на 587-м MTA не будет, а значит там можно жестко навязать аутентификацию, а раз так, то и шифрование TLS. 465 - это порт изначально для тех, кто любит шифрование - SMTPS.

Так как содержать почту в домашнем каталоге не совсем удобно, и мы уже указали выше, что она будет в /var/mail/имя_пользователя, то скажем Exim'у, что работать с директорией /var/mail надо от имени группы mail:
perl -i -pe 'print "  group = mail\n" if $. == 30' /etc/exim4/conf.d/transport/30_exim4-config_maildir_home
Раз у нас пользователи будут аутентифицироваться, то надо как и для Dovecot иметь конфиг в PAM. Но у Dovecot он идет из коробки, а для Exim4 придется создать самостоятельно:
cat > /etc/pam.d/exim
#%PAM-1.0

@include common-auth
@include common-account
@include common-session

На последок в раскомментируем секции аутентификации:
vi /etc/exim4/conf.d/auth/30_exim4-config_examples


plain_server:
  driver = plaintext
  public_name = PLAIN
  server_condition = "${if pam{$2:$3}{1}{0}}"
  #server_condition = "${if crypteq{$auth3}{${extract{1}{:}{${lookup{$auth2}lsearch{CONFDIR/passwd}{$value}{*:*}}}}}{1}{0}}"
  server_set_id = $auth2
  server_prompts = :
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}
  .endif

и там же чуть ниже:

login_server:
  driver = plaintext
  public_name = LOGIN
  server_prompts = "Username:: : Password::"
  server_condition = "${if pam {$1:$2}{yes}{no}}"
  #server_condition = "${if crypteq{$auth2}{${extract{1}{:}{${lookup{$auth1}lsearch{CONFDIR/passwd}{$value}{*:*}}}}}{1}{0}}"
  server_set_id = $auth1
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}
  .endif
Теперь обязательно рестартануть Exim4:
service exim4 restart
Главное проверить, что возможность аутентификации появилась:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Exim 4.80 Mon, 17 Sep 2012 22:26:31 +0000
ehlo test.com
250-example.com Hello localhost [127.0.0.1]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
quit
Значит сервер будет принимать аутентификацию.


Если вдруг что-то не завелось, то выключаем Exim4 и запускаем его вручную в отдельном окне в подробным выводом в консоль:
service exim4 stop
exim -bd -d+all
А такой командой можно подробно понять как происходит процесс общения по SMTP:
swaks --tls --server example.com --to john.smith@example.com



Одна из статей, откуда брал инфу: Exim и все-все-все

4 комментария:

  1. Привет, нашел это статью делаю по ней настройку, вроде бы все нормально, почтовый клиент определяет тип соединения, но как только начинает проверку пароля и имени пользователя выдает ошибку.

    Не подскажешь в какую сторону смотреть, как понять в чем дело?

    ОтветитьУдалить
    Ответы
    1. Извиняюсь, только сейчас заметил сообщение.

      Без подробностей ничего не могу сказать. Только лишь повторить последние слова из статьи:

      Если вдруг что-то не завелось, то выключаем Exim4 и запускаем его вручную в отдельном окне в подробным выводом в консоль:
      service exim4 stop
      exim -bd -d+all

      Удалить
  2. SMTP protocol synchronization error (next input sent too soon: pipelining was not advertised): rejected "EHLO we-guess.mozilla.org" H=[192.168.0.2] next input="QUIT\r\n"
    2015-03-04 11:12:45 SMTP protocol synchronization error (next input sent too soon: pipelining was not advertised): rejected "EHLO we-guess.mozilla.org" H=[192.168.0.2] next input="QUIT\r\n"
    2015-03-04 11:12:45 SMTP protocol synchronization error (next input sent too soon: pipelining was not advertised): rejected "EHLO we-guess.mozilla.org" H=[192.168.0.2] next input="QUIT\r\n"

    ОтветитьУдалить
    Ответы
    1. Вам надо более детально описывать ошибку, а не только выкидывать стэк.
      Но вообще описание тут:
      http://serverfault.com/questions/515149/exim-smtp-synchronization-error-when-pipelining

      Удалить