Почтовый сервер · 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/dovecotpopperexim4/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: gmailGet new posts in your inbox
No spam. Unsubscribe anytime.