Servidor de correo · 4 min read · Oct 13, 2025
Configuración de un servidor de correo utilizando Exim4, Clamav, Dovecot, SpamAssassin y muchos más en Debian Lenny
Configuración de un servidor de correo utilizando Exim4, Clamav, Dovecot, SpamAssassin y muchos más en Debian
Este howto describe una forma de construir una plataforma de correo escalable, segura y con todas las funciones. Ofrece alojamiento virtual de buzones en formato maildir con soporte para cuotas y filtrado del lado del servidor, alias de dominio, alias de dirección, reenvío de direcciones, direcciones catchall. El reenvío está asegurado con STARTTLS y SMTP-AUTH. Los correos entrantes se revisan en busca de virus, spam y se verifican contra la política SPF y DNSBL.
Para lograr escalabilidad, la configuración se dividirá en 3 servidores:
- 1 servidor MX, donde se encuentran la mayoría de las funciones de seguridad (faramir.middle.earth)
- 1 relay SMTP, para permitir a los usuarios enviar correos al mundo exterior (ectelion.middle.earth)
- 1 servidor Mailstore, donde se encuentra el buzón (denetor.middle.earth)
Por supuesto, se pueden agregar más MX utilizando registros MX de DNS a sus dominios, se pueden agregar más servidores de relay utilizando round-robin de DNS, y se pueden agregar más almacenes de correo utilizando mecanismos descritos en este howto. Por el contrario, puede fusionar fácilmente la parte MX y la parte de relay, o la parte de relay y la parte de mailstore. Fusionar MX y mailstore implica algunas modificaciones.
Nota preliminar
En este howto asumiremos que tiene un servidor Debian en funcionamiento. Además, se supone que sudo está instalado en los sistemas y debe ser un sudoer.
Configurando LDAP
La información de los usuarios se almacenará en un directorio LDAP. Aquí lo instalaremos en el servidor de relay.
Primero, instalemos los paquetes necesarios:
sudo apt-get install slapd ldap-utilsPara el tutorial utilizaremos los siguientes parámetros LDAP:
ldapBase: dc=middle,dc=earth
adminDn: cn=admin,dc=middle,dc=earth
adminPwd: thirdAge
Además, utilizaremos un esquema LDAP específico. La mayoría de los atributos y objetos son estándares, excepto uno o dos. Precaución: dado que hay muchos atributos estándar, deberá asegurarse de que ninguno de ellos esté definido dos veces.
Así que agreguemos el esquema en openldap en /etc/ldap/schema/mailMEO.schema:
attributetype ( 2.16.840.1.113730.3.1.13
NAME 'mailLocalAddress'
DESC 'Dirección de correo electrónico RFC822 de este destinatario'
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 'Cantidad máxima de espacio en disco para un buzón en kilobytes'
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 del SMTP/MTA de este destinatario'
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 'Dirección de copia sombra 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 'Dirección de enrutamiento RFC822 de este destinatario'
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 'Preferencias de usuario de 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 'Destinatario de correo local de Internet'
SUP top AUXILIARY
MAY ( mailLocalAddress $ mailHost $ mailRoutingAddress $ mailCopyAddress $ mailQuota $ spamassassinUserPrefs ) )
objectclass ( 2.16.840.1.113730.3.2.148
NAME 'inetMailForwarder'
DESC 'Dirección de reenvío de correo de Internet'
SUP top AUXILIARY
MAY ( mailHost $ mailRoutingAddress ) )Luego asegúrese de agregar el esquema necesario en /etc/ldap/slapd.conf:
...
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/mailMEO.schema
...… y verifique el sufijo (debconf ya debería haberlo configurado cuando instaló slapd):
suffix "dc=middle,dc=earth"Ahora agregamos algunas ACL que los demonios necesitarán para vincularse a LDAP.
Un acceso de solo lectura al atributo userPassword para 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 * noneUn acceso de solo lectura a otros atributos para exim y 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 noneLa última ACL desactiva las lecturas anónimas pero habilita la lectura (búsqueda) para cada usuario autenticado, lo cual puede que no desee.
Ahora podemos reiniciar slapd para que los cambios surtan efecto:
sudo /etc/init.d/slapd restartTenemos que crear los usuarios de la ACL anterior. Para hacerlo, utilizaremos el siguiente archivo 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=El usuario/contraseña son:
dovecot/dovecotpopperexim4/eximmta Para alimentar el directorio escriba:
ldapadd -x -D cn=admin,dc=middle,dc=earth -W < users.ldifAquí hay otro archivo ldif que contiene datos de muestra (precaución, esta muestra contiene direcciones IP que no se adaptarán a su configuración, cámbielas manualmente):
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: gmailRecibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.