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-utils

Para 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 * none

Un 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 none

La ú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 restart

Tenemos 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/dovecotpopper
exim4/eximmta 

Para alimentar el directorio escriba:

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

Aquí 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: gmail
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.