Почтовый сервер · 4 min read · Oct 13, 2025

Настройка почтового сервера с использованием Exim4, Clamav, Dovecot, SpamAssassin и многих других на Debian Lenny

Настройка почтового сервера с использованием Exim4, Clamav, Dovecot, SpamAssassin и многих других на Debian

Этот howto описывает один из способов создания масштабируемой, безопасной, полнофункциональной почтовой платформы. Он предлагает виртуальный хостинг почтовых ящиков в формате maildir с поддержкой квот и фильтрации на стороне сервера, алиасов доменов, алиасов адресов, переадресации адресов, адресов catchall. Пересылка защищена с помощью STARTTLS и SMTP-AUTH. Входящие письма проверяются на вирусы, спам и проверяются на соответствие политике SPF и DNSBL.

Для достижения масштабируемости настройка будет разделена на 3 сервера:

  • 1 MX сервер, на котором находятся большинство функций безопасности (faramir.middle.earth)
  • 1 SMTP реле, чтобы позволить пользователям отправлять письма в внешний мир (ectelion.middle.earth)
  • 1 Mailstore сервер, на котором находится почтовый ящик (denetor.middle.earth)

Конечно, можно добавить больше MX, используя DNS MX записи для ваших доменов, больше реле-серверов, используя DNS round-robin, и больше почтовых хранилищ, используя механизмы, описанные в этом howto. На противоположной стороне вы можете легко объединить MX и реле часть, или реле и часть почтового хранилища. Объединение MX и почтового хранилища требует некоторых модификаций.

Предварительная заметка

В этом howto мы будем предполагать, что у вас есть работающий сервер Debian. Также предполагается, что sudo установлен на системах, и вы должны быть sudoer.

Настройка LDAP

Информация о пользователях будет храниться в каталоге LDAP. Здесь мы установим его на реле-сервере.

Сначала установим необходимые пакеты:

 sudo apt-get install slapd ldap-utils

Для учебника мы будем использовать следующие параметры LDAP:

ldapBase: dc=middle,dc=earth

adminDn: cn=admin,dc=middle,dc=earth

adminPwd: thirdAge

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

Итак, давайте добавим схему в openldap в /etc/ldap/schema/mailMEO.schema:

 attributetype ( 2.16.840.1.113730.3.1.13   
    NAME 'mailLocalAddress'   
    DESC 'RFC822 адрес электронной почты этого получателя'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
attributetype ( 2.16.840.1.113730.3.1.16   
    NAME 'mailQuota'   
    DESC 'Максимальное количество дискового пространства для почтового ящика в килобайтах'   
    EQUALITY integerMatch   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )   
  
attributetype ( 2.16.840.1.113730.3.1.18   
    NAME 'mailHost'   
    DESC 'FQDN SMTP/MTA этого получателя'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}   
    SINGLE-VALUE )   
  
attributetype ( 2.16.840.1.113730.3.1.22   
    NAME 'mailCopyAddress'   
    DESC 'RFC822 адрес теневой копии электронной почты'   
    EQUALITY caseIgnoreIA5Match   
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
attributetype ( 2.16.840.1.113730.3.1.47   
    NAME 'mailRoutingAddress'   
    DESC 'RFC822 адрес маршрутизации этого получателя'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
attributetype ( 2.16.840.1.113730.3.1.49   
    NAME 'spamassassinUserPrefs'   
    DESC 'Настройки пользователя SpamAssassin'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
objectclass ( 2.16.840.1.113730.3.2.147   
    NAME 'inetLocalMailRecipient'   
    DESC 'Интернет локальный почтовый получатель'   
    SUP top AUXILIARY   
    MAY    ( mailLocalAddress $ mailHost $ mailRoutingAddress $ mailCopyAddress $ mailQuota $ spamassassinUserPrefs ) )   
   
objectclass ( 2.16.840.1.113730.3.2.148   
    NAME 'inetMailForwarder'   
    DESC 'Интернет адрес пересылки почты'   
    SUP top AUXILIARY   
    MAY    ( mailHost $ mailRoutingAddress ) )

Затем убедитесь, что вы добавили нужную схему в /etc/ldap/slapd.conf:

...  
include /etc/ldap/schema/inetorgperson.schema  
include /etc/ldap/schema/mailMEO.schema  
...

… и проверьте суффикс (debconf должен был уже настроить его, когда вы устанавливали slapd):

suffix          "dc=middle,dc=earth"

Теперь мы добавим несколько ACL, которые демоны будут нуждаться для подключения к LDAP.

Доступ только для чтения к атрибуту userPassword для dovecot:

access to attrs=userPassword,shadowLastChange   
        by dn="cn=admin,dc=middle,dc=earth" write   
        by dn="uid=dovecot,dc=middle,dc=earth" read   
        by anonymous auth   
        by self write   
        by * none

Доступ только для чтения к другим атрибутам для exim и dovecot:

access to *   
        by dn="cn=admin,dc=middle,dc=earth" write   
        by dn="uid=dovecot,dc=middle,dc=earth" read   
        by dn="uid=exim,dc=middle,dc=earth" read   
        by * read  
        by anonymous none

Последний ACL отключает анонимные чтения, но разрешает чтение (поиск) для каждого аутентифицированного пользователя, что вам может не понравиться.

Теперь мы можем перезапустить slapd, чтобы изменения вступили в силу:

sudo /etc/init.d/slapd restart

Нам нужно создать пользователей предыдущего ACL. Для этого мы будем использовать следующий файл user.ldif:

dn: uid=exim,dc=middle,dc=earth  
objectClass: account  
objectClass: simpleSecurityObject  
objectClass: top  
uid: exim  
userPassword:: e01ENX1hOElTeXAwV2hnVzFSVnhHd0hCNDF3PT0=  
  
dn: uid=dovecot,dc=middle,dc=earth  
objectClass: account  
objectClass: simpleSecurityObject  
objectClass: top  
uid: dovecot  
userPassword:: e01ENX1yZGp2Q1lPNmtDRm1scXAyVWQwa0xBPT0=

Пользователь/пароль:

dovecot/dovecotpopper
exim4/eximmta 

Чтобы заполнить каталог, введите:

ldapadd -x -D cn=admin,dc=middle,dc=earth -W < users.ldif

Вот еще один файл ldif, который содержит пример данных (осторожно, этот пример содержит IP-адреса, которые не подойдут для вашей настройки, измените их вручную):

dn: ou=domains,dc=middle,dc=earth  
objectClass: organizationalUnit  
objectClass: top  
ou: domains  
  
dn: dc=middle.earth,ou=domains,dc=middle,dc=earth  
dc: middle.earth  
objectClass: dNSDomain  
objectClass: top  
objectClass: inetLocalMailRecipient  
objectClass: domainRelatedObject  
objectClass: posixAccount  
mailLocalAddress: [email protected]  
cn: catchall  
gidNumber: 8  
homeDirectory: /var/mail/middle.earth/c/catchall  
uid: catchall  
uidNumber: 8  
userPassword:: e01ENX1EV3RteGErOFROanJKNUFXZWt1Z0tBPT0=  
mailQuota: 102400  
mailHost: denetor.middle.earth  
associatedDomain: middle.earth  
associatedDomain: lotr.middle.earth  
  
dn: uid=sam,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: sam  
displayName: Sam Gamji  
gidNumber: 8  
homeDirectory: /var/mail/middle.earth/s/sam  
mail: [email protected]  
mailHost: 172.16.16.23  
mailQuota: 102400  
objectClass: inetLocalMailRecipient  
objectClass: inetOrgPerson  
objectClass: posixAccount  
objectClass: top  
sn: Gamji  
uidNumber: 8  
uid: sam  
userPassword:: e01ENX1NeVV5M1BxaHkvWWVLaVpyMXlOaExBPT0=  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
  
dn: uid=frodo,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: frodo  
displayName: Frodo Baggins  
gidNumber: 8  
givenName: Frodo  
homeDirectory: /var/mail/middle.earth/f/frodo  
mail: [email protected]  
mailHost: 172.16.16.23  
mailQuota: 102400  
objectClass: inetLocalMailRecipient  
objectClass: inetOrgPerson  
objectClass: posixAccount  
objectClass: top  
sn: Baggins  
uidNumber: 8  
uid: frodo  
userPassword:: e01ENX04UGlDRHVnWEdCMmNhRktnbDljTmpRPT0=  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
  
dn: uid=gmail,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: gmail  
mail: [email protected]  
mailHost: 172.16.16.23  
mailRoutingAddress: [email protected]  
objectClass: inetMailForwarder  
objectClass: inetOrgPerson  
objectClass: top  
sn: alias to Gmail address  
uid: gmail
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.