Минимальный почтовый сервер на основе Postfix и Dovecot. Часть 2: Postfix

  • Tutorial
Цель осталась прежней: получить минимально работающий почтовый сервер, используя только Postfix и Dovecot, с минимальным изменением настроек по умолчанию.
Вводная часть и настройка Dovecot.

В обязанности Postfix входит:
  1. Принимать почту от других серверов для обслуживаемых нами пользователей и переправлять ее в почтовые ящики c помощью Dovecot.
  2. Принимать почту от аутентифицированных пользователей и доставлять ее по назначению.
  3. Принимать и доставлять по назначению почту от локальных служб и сервисов, запущенных на нашем сервере. Как правило, она адресована пользователю root, но возможны и другие получатели, в том числе и внешние.

Для определенности обозначим:
  • Основной домен (example1.com) – домен в котором находится наш почтовый сервер.
  • Имя нашего почтового сервера – mail.example1.com.
  • Главный администратор (user1@example1.com) – пользователь почтовой системы, которому будет перенаправлена вся локальная почта, в том числе адресованная root.
  • Все пользователи почтовой системы являются виртуальными, и никак не связаны с локальными пользователями. Место и способ хранения почты описаны в первой части.
  • Локальные пользователи не являются пользователями почтовой системы и не могут ею пользоваться, пока для них не будет создана учетная запись в файле /etc/dovecot/users.

Изменения, внесенные в файл main.cf
 alias_database = hash:/etc/aliases
 alias_maps = hash:/etc/aliases
+append_dot_mydomain = no
+biff = no
 command_directory = /usr/sbin
 config_directory = /etc/postfix
 daemon_directory = /usr/libexec/postfix
 data_directory = /var/lib/postfix
 debug_peer_level = 2
+disable_vrfy_command = yes
 html_directory = no
-inet_interfaces = localhost
+inet_interfaces = all
 inet_protocols = all
+local_recipient_maps = $alias_maps
 mail_owner = postfix
+mailbox_size_limit = 409600000
 mailq_path = /usr/bin/mailq.postfix
 manpage_directory = /usr/share/man
+message_size_limit = 8192000
 mydestination = $myhostname, localhost.$mydomain, localhost
+myhostname = mail.example1.com
+mynetworks = 127.0.0.1/32 [::1]/128
+mynetworks_style = host
 newaliases_path = /usr/bin/newaliases.postfix
 queue_directory = /var/spool/postfix
 readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
 sample_directory = /usr/share/doc/postfix-2.6.6/samples
 sendmail_path = /usr/sbin/sendmail.postfix
 setgid_group = postdrop
+smtp_tls_security_level = may
+smtpd_banner = $myhostname ESMTP
+smtpd_helo_required = yes
+smtpd_recipient_restrictions = reject_unknown_recipient_domain,    permit_mynetworks,    reject_non_fqdn_recipient,    reject_unauth_destination,    reject_unverified_recipient,   permit
+smtpd_sasl_path = private/auth
+smtpd_sasl_type = dovecot
+smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
+smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem
+smtpd_tls_security_level = may
+smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
+strict_rfc821_envelopes = yes
 unknown_local_recipient_reject_code = 550
+virtual_alias_domains = example2.com ...
+virtual_alias_maps = hash:/etc/postfix/virtual
+virtual_mailbox_domains = example1.com, example3.com ....
+virtual_transport = lmtp:unix:private/dovecot-lmtp

  1. Основной параметр, это конечно:
    myhostname = mail.example1.com
    Это даст нам следующие значения для других важных настроек:
    mydomain = example1.com
    mydestination =  mail.example1.com, localhost.example1.com, localhost
    myorigin = mail.example1.com
    нас это устраивает, так что оставим все по умолчанию.
    Желательно, чтобы PTR-запись нашего сервера указывала на mail.example1.com.

    Update. В руководстве есть предупреждение о возможности зацикливания доставки почты.
    Caution: in order to avoid mail delivery loops, you must list all hostnames of the machine, including $myhostname, and localhost.$mydomain.
    На мой взгляд, не совсем понятно, почему нужно прописывать ВСЕ имена хоста в список. Поясню, о чем идет речь на примере.
    Предположим, что в файле /etc/hosts есть запись – «127.0.0.1 localhost4» и кто-то или что-то c нашего сервера, специально или случайно, отправляет письмо по адресу root@localhost4.
    1. Postfix берется за доставку, т.к. отправитель находится в доверенной сети.
    2. Наш сервер не является конечным получателем, т.к. мы не указали домен localhost4 в mydestination.
    3. Postfix пересылает письмо для домена localhost4 по адресу, 127.0.0.1 и переходит к шагу 1.

  2. По умолчанию, Postfix ищет получателей локальной почты в файле /etc/passwd. Или перенаправляет почту используя файл псевдонимов — /etc/aliases. Список локальных пользователей мы использовать не будем, а вот /etc/aliases нам еще пригодится.
    local_recipient_maps = $alias_maps
    Добавим в файле /etc/aliases:
    root:           user1@example1.com
    Тем самым перенаправив почту (получателем которой является псевдоним из файла /etc/aliases) главному администратору. Файл /etc/aliases требует переиндексации, с помощью команды newaliases, после внесения изменений.
    К сожалению, я не нашел простого способа как запретить прием почты для получателей указанных в файле /etc/aliases из Интернета. Для рассматриваемой системы, из Интернета будут доступны адреса: alias@mail.example1.com, alias@localhost.example1.com, alias@[ip.address], где alias – это псевдоним из файла /etc/aliases. Вся почта, отправленная на эти адреса, не только с локальной машины, но и из Интернета, будет попадать по адресу user1@example1.com. Напомню, что псевдоним для postmaster должен быть обязательно.

  3. Настроим возможность отправки почты без аутентификации, только со своего компьютера.
    mynetworks_style = host
    mynetworks = 127.0.0.1/32 [::1]/128

  4. Настроим прием почты для наших доменов.
    virtual_mailbox_domains = example1.com, example3.com …
    virtual_alias_domains = example2.com …
    Для доменов-псевдонимов, Postfix ищет получателей только в файле /etc/postfix/virtual и если не находит, отклоняет почту. Для доменов из «virtual_mailbox_domains», будет также запрошен список обслуживаемых пользователей у Dovecot.
    virtual_transport = lmtp:unix:private/dovecot-lmtp
    virtual_alias_maps = hash:/etc/postfix/virtual
    Файл /etc/postfix/virtual требует переиндексации, с помощью команды postmap, после внесения изменений. Как минимум, для каждого обслуживаемого домена, желательно, завести в нем запись для пользователя postmaster, если у вас нет пользователя с таким именем.

  5. Основная директива, которая ограничивает прием почты из Интернета, в наши почтовые ящики. Порядок указания опций имеет значение. Будем принимать почту из Интернета, только для обслуживаемых нашим сервером пользователей или с локальной машины для кого угодно.
    smtpd_recipient_restrictions =
         reject_unknown_recipient_domain,
         permit_mynetworks,
         reject_non_fqdn_recipient,
         reject_unauth_destination,
         reject_unverified_recipient,
         permit

  6. Настроим аутентификацию.
    Postfix использует общий файл настроек main.cf, но при запуске служб, из файла master.cf, можно переопределить некоторые из них, или указать недостающие. По умолчанию мы не будем разрешать аутентификацию, но внесем необходимые настройки, для уменьшения количества параметров в файле master.cf.
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth

  7. Настроим TLS, упрощенно, воспользовавшись временным сертификатом Dovecot.
    smtpd_tls_cert_file=/etc/pki/dovecot/certs/dovecot.pem
    smtpd_tls_key_file=/etc/pki/dovecot/private/dovecot.pem
    smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
    smtpd_tls_security_level = may
    smtp_tls_security_level = may

  8. Напоследок немного опциональных украшательств.
    smtpd_banner = $myhostname ESMTP
    biff = no
    strict_rfc821_envelopes = yes
    disable_vrfy_command = yes
    smtpd_helo_required = yes

  9. Для того чтобы запустить smtp сервер на 587 порту, с возможностью аутентификации, нам необходимо добавить в файл master.cf следующие строки:
    submission inet n       -       n       -       -       smtpd
      -o smtpd_tls_security_level=encrypt
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

Полный перечень параметров main.cf доступен здесь.

Для управления нашей системой используются следующие файлы:
/etc/dovecot/users – список пользователей и паролей,
/etc/aliases – список псевдонимов, используется для перенаправления почтовых уведомлений от локальных служб, выполняемых на нашей машине, системному администратору,
/etc/postfix/virtual – список псевдонимов, используется для перенаправления почтовых сообщений, предназначенных для наших доменов,
/etc/postfix/main.cf – с помощью параметров «virtual_mailbox_domains», «virtual_alias_domains» указываем список обслуживаемых нашей системой доменов.

Настройка почтовой системы, на мой взгляд, является наисложнейшей задачей в системном администрировании. По этому поводу написаны книги. Я хотел описать каждый параметр более подробно, но, к сожалению, получался просто плохой пересказ руководства. Поэтому, я старался оставить комментарии только к наиболее важным моментам, но еще больше осталось за рамками статьи. В любом случае, прочтение и понимание документации необходимо для настройки системы. А эта статья, как и множество подобных, написана для того, чтобы помочь сделать первый шажок в освоение сложной системы.

Разрешите откланяться.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 18

    +3
    Разрешите предложить продолжение?))
    можно усложнить ведь немного, как насчет вебинтерфейсов к разным частям и аутентификации из БД?
    На мой взгляд отличные статьи для начинающих админов.
      0
      Соглашусь с комментарием. Далеко не всегда (а по большей части — никогда) не хочется лезть в консоль для добавления ящика. Пишите третью статью про PostfixAdmin)
      +5
      Настройка почтовой системы, на мой взгляд, является наисложнейшей задачей в системном администрировании
      Три раза «ха». Видимо, она сложнейшая для тех, кто слаще редьки ничего не пробовал: падения ядра, безопасность (selinux/apparmor), чуть-чуть распределенные системы…
        0
        К сожелению не каждый может объяснить как работает почта, начиная отсылки из почтовый программы.
        Да и сейчас на просторах how-to или устарели или могут содержать настройки вплоть до open relay :)
          0
          К сожелению не каждый может объяснить как работает почта, начиная отсылки из почтовый программы.
          И что? Не каждый может объяснить как работает усилительный каскад на биполярном транзисторе. Но каждый может преобразовать ln(exp(x)) в x. Et cetera.

          Это не делает задачу сколь-нибудь сложной.
            0
            Понимание работы должно быть. Хотя бы элементарных вещей.
              0
              Кажется, вы зашли на второй круг. Я не утверждал, что каждый понимает, как работает почта, или, что этого понимания не нужно.
              Мой тезис был, что почта не является чем-то сложным.
                0
                >Мой тезис был, что почта не является чем-то сложным.

                Если понимание, то все в этом мире просто. Просто у меня буквально несколько дней назад, была очередная боль на тему знаний работы почты.
        +2
        Эх. Такие бы статьи да 10-15 лет назад.
          0
          ну аналогичную статью для дебиана уже лет 5 точно видел (на английском)
          +1
          Всю прошлую неделю провел за настройкой такой же связки:(
          Единственное, для чего я не нашел красивого решения — использование конкретного релея для каждого пользователя. Можно настроить релей для отправителя, но в качестве отправителя может стоять что угодно (тут от правильной настройки клиента зависит). А вот использовать для выбора релея данные аутентификации я так и не придумал как.
            +1
            Я так и не понял, что надо указывать в myhostname. Почему mail.example1.com а не example1.com? Мне поддомен mail не нужен, я хочу, чтобы почта на a@example1.com приходила на сервер example1.com, а не mail.example1.com. Зачем плодить лишние сущности?
              0
              Добавьте пользователя a@example1.com в /etc/dovecot/users. В принципе без разницы, какой домен использовать для локальной доставки. В данном случае важно, что все пользователи, обслуживаемых доменов второго уровня, настраиваются в одном файле. И обслуживаются одним агентом доставки — virtual. Локальная почта – отправитель наш сервер и службы запущенные на нем, обслуживается другим агентом доставки local.
                0
                Локальная почта – отправительполучатель
                0
                про myhostname указать просто 127.0.0.1 выше уже обсудили.

                >Почему mail.example1.com а не example1.com?

                Ну как бы все расписали же?

                Основной домен (example1.com) – домен в котором находится наш почтовый сервер.
                Имя нашего почтового сервера – mail.example1.com.
                Главный администратор (user1@example1.com) – пользователь почтовой системы, которому будет перенаправлена вся локальная почта, в том числе адресованная root.

                Как будет называться ваш почтовый сервер, вообще пофиг. Он может быть вообще на другом домене.
                abrakadabra.porno.net
                Надо только в MX записи домена указать, какие почтовые сервера обслуживают домен.
                0
                Я не знаю, обращал ли кто-то на это внимание — при отправке писем с сайта (PHP функция mail, например ) в заголовках Postfix отправляет id пользователя (это для Linux):
                Предлагаемое решение:
                serverfault.com/questions/333176/remove-userid-from-recieved-header

                Потом есть замечательная опция для mail.cf — маскарадинг (подмена) отправителя:
                masquerade_classes = header_sender
                sender_canonical_maps = hash:/etc/postfix/sender_canonical

                Когда-то переводил (может, немножко коряво) SASL — проверка подлинности в Postfix.
                Нужно было для безопасной отправки писем с сайта на почту Rambler-a
                Может, кому-то пригодится:
                yadi.sk/i/NBueBB2fc5XDy
                Все ссылки на оф. документацию есть.
                Автору спасибо за статью.
                  +2
                  Мануал хорош тем что дает понимание о процессе обработки почты в linux.
                  Для тех же, кому надо что бы работало «в два клика», dovecod+postfix+mysql с веб-доступом подымаются скриптом iRedMail.
                  Даже на хабре было: habrahabr.ru/post/96314
                    0
                    Ребята, не сочтите за рекламу, ресурс не мой. Но меня уже два раза выручил(не хочу запоминать или записывать весь процесс)
                    Почтовый сервер с рюшечками

                    По ссылке не то что бы разжевано, так еще и съедено за вас. Инструкция для домохозяек в чистом виде, даже не для начинающих админов.
                    Один минус, читать много, и стараться не забегать вперед :) а то приходится возвращаться назад.

                    В этой статье можно сразу определить переменные в начале(домен, адреса, порты, .......) и эти настройки автоматически вставятся в команды, которые Вас просят выполнить на сервере.

                    Лично у меня три почтовых сервера по этой статье работают.

                    Only users with full accounts can post comments. Log in, please.