Correo electrónico · 21 min read · Sep 25, 2025

Usuarios y Dominios Virtuales Con Postfix, Courier, MySQL Y SquirrelMail (Ubuntu 13.10)

Este tutorial es Copyright (c) 2014 por Falko Timme & Srijan Kishore. Se deriva de un tutorial de Christoph Haas que puedes encontrar en http://workaround.org. Eres libre de usar este tutorial bajo la licencia Creative Commons 2.5 o cualquier versión posterior.

Este documento describe cómo instalar un servidor de correo Postfix que se basa en usuarios y dominios virtuales, es decir, usuarios y dominios que están en una base de datos MySQL. También demostraré la instalación y configuración de Courier (Courier-POP3, Courier-IMAP), para que Courier pueda autenticar contra la misma base de datos MySQL que utiliza Postfix.

El servidor Postfix resultante es capaz de SMTP-AUTH y TLS y cuota (la cuota no está integrada en Postfix por defecto, mostraré cómo parchear tu Postfix adecuadamente). Las contraseñas se almacenan en forma encriptada en la base de datos (la mayoría de los documentos que encontré trataban con contraseñas en texto plano, lo cual es un riesgo de seguridad). Además de eso, este tutorial cubre la instalación de Amavisd, SpamAssassin y ClamAV para que los correos electrónicos sean escaneados en busca de spam y virus. También mostraré cómo instalar SquirrelMail como una interfaz de webmail para que los usuarios puedan leer y enviar correos electrónicos y cambiar sus contraseñas.

La ventaja de tal configuración “virtual” (usuarios y dominios virtuales en una base de datos MySQL) es que es mucho más eficiente que una configuración basada en usuarios del sistema “reales”. Con esta configuración virtual, tu servidor de correo puede manejar miles de dominios y usuarios. Además, es más fácil de administrar porque solo tienes que lidiar con la base de datos MySQL cuando agregas nuevos usuarios/dominios o editas los existentes. No más comandos postmap para crear archivos db, no más recargas de Postfix, etc. Para la administración de la base de datos MySQL, puedes usar herramientas basadas en web como phpMyAdmin que también se instalarán en este tutorial. La tercera ventaja es que los usuarios tienen una dirección de correo electrónico como nombre de usuario (en lugar de un nombre de usuario + una dirección de correo electrónico) que es más fácil de entender y recordar.

Este tutorial está destinado como una guía práctica; no cubre los antecedentes teóricos. Estos se tratan en muchos otros documentos en la web.

¡Este documento viene sin garantía de ningún tipo! Quiero decir que este no es el único modo de configurar tal sistema. Hay muchas maneras de lograr este objetivo, pero este es el camino que elijo. No emito ninguna garantía de que esto funcionará para ti!

1 Nota Preliminar

Este tutorial se basa en Ubuntu 13.10 Server (Saucy Salamander), así que deberías configurar una instalación básica del servidor Ubuntu 13.10 antes de continuar con este tutorial. El sistema debe tener una dirección IP estática. Uso 192.168.0.100 como mi dirección IP en este tutorial y server1.example.com como el nombre de host.

Asegúrate de que estás conectado como root (escribe

sudo su

para convertirte en root), porque debemos ejecutar todos los pasos de este tutorial como usuario root.

Es muy importante que hagas de /bin/sh un enlace simbólico a /bin/bash…

dpkg-reconfigure dash

¿Usar dash como el shell del sistema por defecto (/bin/sh)? <– No

… y que desactives AppArmor:

/etc/init.d/apparmor stop   
update-rc.d -f apparmor remove   
apt-get remove apparmor apparmor-utils

2 Instalar Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Para instalar Postfix, Courier, Saslauthd, MySQL y phpMyAdmin, simplemente ejecutamos

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

Se te harán algunas preguntas:

Nueva contraseña para el usuario “root” de MySQL: <– tucontraseñarootsql
Repetir contraseña para el usuario “root” de MySQL: <– tucontraseñarootsql
¿Crear directorios para la administración basada en web? <– No
Tipo general de configuración de correo: <– Internet Site
Nombre del correo del sistema: <– server1.example.com
¿Certificado SSL requerido? <– Ok
Servidor web para reconfigurar automáticamente: <– apache2
¿Configurar la base de datos para phpmyadmin con dbconfig-common? <– No

3 Aplicar El Parche de Cuota A Postfix

Tenemos que obtener las fuentes de Postfix, parchearlo con el parche de cuota, construir nuevos paquetes .deb de Postfix e instalar esos paquetes .deb:

apt-get build-dep postfix
cd /usr/src  
apt-get source postfix

(Asegúrate de usar la versión correcta de Postfix en los siguientes comandos. Tengo Postfix 2.10.2 instalado. Puedes averiguar tu versión de Postfix ejecutando

postconf -d | grep mail_version

La salida debería verse así:

root@server1:/usr/src# postconf -d | grep mail_version  
mail_version = 2.10.2  
milter_macro_v = $mail_name $mail_version  
root@server1:/usr/src#
wget http://vda.sourceforge.net/VDA/postfix-vda-v13-2.10.0.patch  
cd postfix-2.10.2  
patch -p1 < ../postfix-vda-v13-2.10.0.patch

A continuación, abre debian/rules y cambia DEB_BUILD_HARDENING de 1 a 0:

vi debian/rules

| [...] export DEB_BUILD_HARDENING=0 [...] |

Si no haces esto, tu compilación fallará con los siguientes mensajes de error:

maildir.c: En la función âdeliver_maildirâ:  
maildir.c:974:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:977:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:983:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:986:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c: En la función âsql2fileâ:  
maildir.c:404:25: warning: ignoring return value of âreadâ, declared with attribute warn_unused_result [-Wunused-result]  
maildir.c:417:26: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result [-Wunused-result]  
cc1: some warnings being treated as errors  
make: * [maildir.o] Error 1  
make: Leaving directory `/usr/src/postfix-2.10.2/src/virtual'  
make[1]: * [update] Error 1  
make[1]: Leaving directory `/usr/src/postfix-2.10.2'  
make: *** [build] Error 2  
dpkg-buildpackage: error: debian/rules build gave error exit status 2  
root@server1:/usr/src/postfix-2.10.2#

Ahora podemos construir los nuevos paquetes .deb de Postfix:

dpkg-buildpackage

Ahora subimos un directorio, ahí es donde se han creado los nuevos paquetes .deb:

cd ..

El comando

ls -l

te muestra los paquetes disponibles:

root@server1:/usr/src# ls -l  
total 7124  
drwxr-xr-x 18 root root    4096 Abr 16 04:29 postfix-2.10.2  
-rw-r--r--  1 root root   48594 Abr 16 04:29 postfix-cdb_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root  161974 Abr 16 04:29 postfix-dev_2.10.2-1_all.deb  
-rw-r--r--  1 root root 1094344 Abr 16 04:29 postfix-doc_2.10.2-1_all.deb  
-rw-r--r--  1 root root   57342 Abr 16 04:29 postfix-ldap_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   50554 Abr 16 04:29 postfix-mysql_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   50804 Abr 16 04:29 postfix-pcre_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   50756 Abr 16 04:29 postfix-pgsql_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   55701 Jun  7  2013 postfix-vda-v13-2.10.0.patch  
-rw-r--r--  1 root root  282175 Abr 16 04:28 postfix_2.10.2-1.diff.gz  
-rw-r--r--  1 root root    1522 Abr 16 04:28 postfix_2.10.2-1.dsc  
-rw-r--r--  1 root root    3899 Abr 16 04:29 postfix_2.10.2-1_amd64.changes  
-rw-r--r--  1 root root 1542368 Abr 16 04:29 postfix_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root 3828326 Sep 12  2013 postfix_2.10.2.orig.tar.gz

Selecciona los paquetes postfix y postfix-mysql e instálalos así:

dpkg -i postfix_2.10.2-1_amd64.deb postfix-mysql_2.10.2-1_amd64.deb

4 Crear La Base De Datos MySQL Para Postfix/Courier

Ahora creamos una base de datos llamada mail:

mysqladmin -u root -p create mail

Se te hará esta pregunta:

Introduce la contraseña: <– tucontraseñarootsql

A continuación, vamos a la consola de MySQL:

mysql -u root -p

En la consola de MySQL, creamos el usuario mail_admin con la contraseña mail_admin_password (reemplázala con tu propia contraseña) que tiene privilegios SELECT, INSERT, UPDATE, DELETE en la base de datos mail. Este usuario será utilizado por Postfix y Courier para conectarse a la base de datos de correo:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Aún en la consola de MySQL, creamos las tablas necesarias para Postfix y Courier:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
ENGINE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
ENGINE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) ENGINE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) ENGINE=MyISAM;
quit;

Como habrás notado, con el comando quit; hemos salido de la consola de MySQL y estamos de vuelta en la consola de Linux.

La tabla domains almacenará cada dominio virtual para el cual Postfix debería recibir correos electrónicos (por ejemplo, example.com).

domain
example.com

La tabla forwardings es para alias de una dirección de correo electrónico a otra, por ejemplo, redirigir correos electrónicos de [email protected] a [email protected].

sourcedestination
[email protected][email protected]

La tabla users almacena todos los usuarios virtuales (es decir, direcciones de correo electrónico, porque la dirección de correo electrónico y el nombre de usuario son los mismos) y contraseñas (¡en forma encriptada!) y un valor de cuota para cada buzón de correo (en este ejemplo, el valor predeterminado es 10485760 bytes, lo que significa 10MB).

emailpasswordquota
[email protected]No9.E4skNvGa. (“secreto” en forma encriptada)10485760

La tabla transport es opcional, es para usuarios avanzados. Permite redirigir correos para usuarios individuales, dominios enteros o todos los correos a otro servidor. Por ejemplo,

domaintransport
example.comsmtp:[1.2.3.4]

redirigiría todos los correos electrónicos para example.com a través del protocolo smtp al servidor con la dirección IP 1.2.3.4 (los corchetes cuadrados [] significan “no hacer una búsqueda del registro MX DNS” (lo cual tiene sentido para direcciones IP…). Si usas un nombre de dominio completamente calificado (FQDN) en su lugar, no usarías los corchetes.).

Por cierto, (asumiendo que la dirección IP de tu sistema de servidor de correo es 192.168.0.100) puedes acceder a phpMyAdmin a través de http://192.168.0.100/phpmyadmin/ en un navegador e iniciar sesión como mail_admin. Luego puedes echar un vistazo a la base de datos. Más adelante puedes usar phpMyAdmin para administrar tu servidor de correo.

5 Configurar Postfix

Ahora tenemos que decirle a Postfix dónde puede encontrar toda la información en la base de datos. Por lo tanto, tenemos que crear seis archivos de texto. Notarás que le digo a Postfix que se conecte a MySQL en la dirección IP 127.0.0.1 en lugar de localhost. Esto se debe a que Postfix se está ejecutando en una cárcel chroot y no tiene acceso al socket de MySQL al que intentaría conectarse si le dijera a Postfix que use localhost. Si uso 127.0.0.1, Postfix utiliza la red TCP para conectarse a MySQL, lo cual no es un problema incluso en una cárcel chroot (la alternativa sería mover el socket de MySQL a la cárcel chroot, lo que causa otros problemas).

Por favor, asegúrate de que /etc/mysql/my.cnf contenga la siguiente línea:

vi /etc/mysql/my.cnf

| [...] # En lugar de skip-networking, el valor predeterminado ahora es escuchar solo en # localhost, lo cual es más compatible y no menos seguro. bind-address = 127.0.0.1 [...] |

Si tuviste que modificar /etc/mysql/my.cnf, por favor reinicia MySQL ahora:

/etc/init.d/mysql restart

Ejecuta

netstat -tap | grep mysql

para asegurarte de que MySQL está escuchando en 127.0.0.1 (localhost.localdomain):

root@server1:~# netstat -tap | grep mysql  
tcp        0      0 localhost.localdo:mysql *:*                      LISTEN      24970/mysqld      
root@server1:~#

Ahora vamos a crear nuestros seis archivos de texto.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

Luego cambia los permisos y el grupo de estos archivos:

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Ahora creamos un usuario y grupo llamado vmail con el directorio home /home/vmail. Aquí es donde se almacenarán todos los buzones de correo.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

A continuación, hacemos alguna configuración de Postfix. Asegúrate de reemplazar server1.example.com con un FQDN válido, ¡de lo contrario, tu Postfix podría no funcionar correctamente!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "El usuario al que intentas alcanzar está sobre cuota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Después creamos el certificado SSL que se necesita para TLS:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Nombre del país (código de 2 letras) [AU]: <– Ingresa el nombre de tu país (por ejemplo, “DE”).
Nombre del estado o provincia (nombre completo) [Some-State]: <– Ingresa el nombre de tu estado o provincia.
Nombre de la localidad (por ejemplo, ciudad) []: <– Ingresa tu ciudad.
Nombre de la organización (por ejemplo, empresa) [Internet Widgits Pty Ltd]: <– Ingresa el nombre de tu organización (por ejemplo, el nombre de tu empresa).
Nombre de la unidad organizativa (por ejemplo, sección) []: <– Ingresa el nombre de tu unidad organizativa (por ejemplo, “Departamento de TI”).
Nombre común (por ejemplo, TU nombre) []: <– Ingresa el nombre de dominio completamente calificado del sistema (por ejemplo, “server1.example.com”).
Dirección de correo electrónico []: <– Ingresa tu dirección de correo electrónico.

Luego cambia los permisos de smtpd.key:

chmod o= /etc/postfix/smtpd.key

6 Configurar Saslauthd

Primero ejecuta

mkdir -p /var/spool/postfix/var/run/saslauthd

Luego edita /etc/default/saslauthd. Establece START en yes y cambia la línea OPTIONS=”-c -m /var/run/saslauthd” a OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”:

vi /etc/default/saslauthd

| # # Configuraciones para el demonio saslauthd # Por favor, lee /usr/share/doc/sasl2-bin/README.Debian para más detalles. # # ¿Debería saslauthd ejecutarse automáticamente al inicio? (predeterminado: no) START=yes # Descripción de esta instancia de saslauthd. Recomendado. # (sugerencia: Demonio de Autenticación SASL) DESC="Demonio de Autenticación SASL" # Nombre corto de esta instancia de saslauthd. Muy recomendado. # (sugerencia: saslauthd) NAME="saslauthd" # ¿Qué mecanismos de autenticación debería usar saslauthd? (predeterminado: pam) # # Opciones disponibles en este paquete de Debian: # getpwent -- usar la función de biblioteca getpwent() # kerberos5 -- usar Kerberos 5 # pam -- usar PAM # rimap -- usar un servidor IMAP remoto # shadow -- usar el archivo de contraseñas local shadow # sasldb -- usar el archivo de base de datos sasldb local # ldap -- usar LDAP (la configuración está en /etc/saslauthd.conf) # # Solo se puede usar una opción a la vez. Consulta la página del manual de saslauthd # para más información. # # Ejemplo: MECHANISMS="pam" MECHANISMS="pam" # Opciones adicionales para este mecanismo. (predeterminado: ninguna) # Consulta la página del manual de saslauthd para información sobre opciones específicas de mech. MECH_OPTIONS="" # ¿Cuántos procesos de saslauthd deberíamos ejecutar? (predeterminado: 5) # Un valor de 0 generará un nuevo proceso para cada conexión. THREADS=5 # Otras opciones (predeterminado: -c -m /var/run/saslauthd) # Nota: ¡DEBES especificar la opción -m o saslauthd no se ejecutará! # # ADVERTENCIA: NO ESPECIFIQUES LA OPCIÓN -d. # La opción -d hará que saslauthd se ejecute en primer plano en lugar de como # un demonio. Esto PREVENIRÁ QUE TU SISTEMA INICIE CORRECTAMENTE. Si deseas # ejecutar saslauthd en modo de depuración, por favor ejecútalo a mano para estar seguro. # # Consulta /usr/share/doc/sasl2-bin/README.Debian para información específica de Debian. # Consulta la página del manual de saslauthd y la salida de 'saslauthd -h' para información # general sobre estas opciones. # # Ejemplo para usuarios de Postfix en chroot: "-c -m /var/spool/postfix/var/run/saslauthd" # Ejemplo para usuarios de Postfix no chroot: "-c -m /var/run/saslauthd" # # Para saber si tu Postfix se está ejecutando en chroot, consulta /etc/postfix/master.cf. # Si tiene la línea "smtp inet n - y - - smtpd" o "smtp inet n - - - - smtpd" # entonces tu Postfix se está ejecutando en una cárcel chroot. # Si tiene la línea "smtp inet n - n - - smtpd" entonces tu Postfix NO # se está ejecutando en una cárcel chroot. #OPTIONS="-c -m /var/run/saslauthd" OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r" |

Luego crea el archivo /etc/pam.d/smtp. Debe contener solo las siguientes dos líneas (asegúrate de completar con los detalles correctos de tu base de datos):

vi /etc/pam.d/smtp

| auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 |

A continuación, crea el archivo /etc/postfix/sasl/smtpd.conf. Debe verse así:

vi /etc/postfix/sasl/smtpd.conf

| pwcheck_method: saslauthd mech_list: plain login allow_plaintext: true auxprop_plugin: sql sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: mail_admin sql_passwd: mail_admin_password sql_database: mail sql_select: select password from users where email = '%u@%r' |

A continuación, agrega el usuario postfix al grupo sasl (esto asegura que Postfix tenga permiso para acceder a saslauthd):

adduser postfix sasl

Luego reinicia Postfix y Saslauthd:

/etc/init.d/postfix restart  
/etc/init.d/saslauthd restart

7 Configurar Courier

Ahora tenemos que decirle a Courier que debe autenticar contra nuestra base de datos MySQL. Primero, edita /etc/courier/authdaemonrc y cambia el valor de authmodulelist para que diga:

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" [...] |

Luego haz una copia de seguridad de /etc/courier/authmysqlrc y vacía el archivo antiguo:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig  
cat /dev/null > /etc/courier/authmysqlrc

Luego abre /etc/courier/authmysqlrc y pon las siguientes líneas en él:

vi /etc/courier/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Durante la instalación, los certificados SSL para IMAP-SSL y POP3-SSL se crean con el nombre de host localhost. Para cambiar esto al nombre de host correcto (server1.example.com en este tutorial), elimina los certificados…

cd /etc/courier  
rm -f /etc/courier/imapd.pem  
rm -f /etc/courier/pop3d.pem

… y modifica los siguientes dos archivos; reemplaza CN=localhost con CN=server1.example.com (también puedes modificar los otros valores, si es necesario):

vi /etc/courier/imapd.cnf

| [...] CN=server1.example.com [...] |

vi /etc/courier/pop3d.cnf

| [...] CN=server1.example.com [...] |

Luego recrea los certificados…

mkimapdcert  
mkpop3dcert

… y reinicia Courier:

/etc/init.d/courier-authdaemon restart  
/etc/init.d/courier-imap restart  
/etc/init.d/courier-imap-ssl restart  
/etc/init.d/courier-pop restart  
/etc/init.d/courier-pop-ssl restart

Al ejecutar

telnet localhost pop3

puedes ver si tu servidor POP3 está funcionando correctamente. Debería devolver +OK Hello there. (Escribe quit para volver a la consola de Linux.)

root@server1:/etc/courier# telnet localhost pop3  
Trying ::1...  
Connected to localhost.localdomain.  
Escape character is '^]'.  
+OK Hello there.  
<-- quit  
+OK Better luck next time.  
Connection closed by foreign host.  
root@server1:/etc/courier#

8 Modificar /etc/aliases

Ahora deberíamos abrir /etc/aliases. Asegúrate de que postmaster apunte a root y root a tu propio nombre de usuario o dirección de correo electrónico, por ejemplo, así:

vi /etc/aliases

| [...] postmaster: root root: [email protected] [...] |

o así (si administrador es tu propio nombre de usuario):

| [...] postmaster: root root: administrator [...] |

Cada vez que modifiques /etc/aliases, debes ejecutar

newaliases

despues y reiniciar Postfix:

/etc/init.d/postfix restart

9 Instalar amavisd-new, SpamAssassin, Y ClamAV

Para instalar amavisd-new, spamassassin y clamav, ejecuta el siguiente comando:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

Después debemos configurar amavisd-new. La configuración se divide en varios archivos que residen en el directorio /etc/amavis/conf.d. Echa un vistazo a cada uno de ellos para familiarizarte con la configuración. La mayoría de las configuraciones están bien, sin embargo, debemos modificar tres archivos:

Primero debemos habilitar ClamAV y SpamAssassin en /etc/amavis/conf.d/15-content_filter_mode descomentando las líneas @bypass_virus_checks_maps y @bypass_spam_checks_maps:

vi /etc/amavis/conf.d/15-content_filter_mode

El archivo debería verse así:

| use strict; # Puedes modificar este archivo para re-habilitar la verificación de SPAM a través de spamassassin # y para re-habilitar la verificación de antivirus. # # Modo de verificación de antivirus predeterminado # Ten en cuenta que la verificación de antivirus está DESHABILITADA por # defecto. # Si deseas habilitarla, por favor descomenta las siguientes líneas: @bypass_virus_checks_maps = ( \\%bypass_virus_checks, \\@bypass_virus_checks_acl, \\$bypass_virus_checks_re); # # Modo de verificación de SPAM predeterminado # Ten en cuenta que la verificación de anti-spam está DESHABILITADA por # defecto. # Si deseas habilitarla, por favor descomenta las siguientes líneas: @bypass_spam_checks_maps = ( \\%bypass_spam_checks, \\@bypass_spam_checks_acl, \\$bypass_spam_checks_re); 1; # asegurar un retorno definido |

Y luego deberías echar un vistazo a la configuración de spam y las acciones para correos de spam/virus en /etc/amavis/conf.d/20-debian_defaults. No hay necesidad de cambiar nada si las configuraciones predeterminadas están bien para ti. El archivo contiene muchas explicaciones, así que no hay necesidad de explicar las configuraciones aquí:

vi /etc/amavis/conf.d/20-debian_defaults

| [...] $QUARANTINEDIR = "$MYHOME/virusmails"; $quarantine_subdir_levels = 1; # habilitar el hashing del directorio de cuarentena $log_recip_templ = undef; # deshabilitar entradas de registro de nivel-0 por destinatario $DO_SYSLOG = 1; # registrar a través de syslogd (preferido) $syslog_ident = 'amavis'; # etiqueta de identificación de syslog, precedida a todos los mensajes $syslog_facility = 'mail'; $syslog_priority = 'debug'; # cambiar a info para eliminar la salida de depuración, etc $enable_db = 1; # habilitar el uso de BerkeleyDB/libdb (SNMP y nanny) $enable_global_cache = 1; # habilitar el uso de caché basada en libdb si $enable_db=1 $inet_socket_port = 10024; # socket de escucha predeterminado $sa_spam_subject_tag = '*SPAM* '; $sa_tag_level_deflt = 2.0; # agregar encabezados de información de spam si está, o por encima de ese nivel $sa_tag2_level_deflt = 6.31; # agregar encabezados de 'spam detectado' a ese nivel $sa_kill_level_deflt = 6.31; # activa acciones evasivas de spam $sa_dsn_cutoff_level = 10; # nivel de spam más allá del cual no se envía un DSN [...] $final_virus_destiny = D_DISCARD; # (los datos no se pierden, ver cuarentena de virus) $final_banned_destiny = D_BOUNCE; # D_REJECT cuando MTA frontal $final_spam_destiny = D_BOUNCE; $final_bad_header_destiny = D_PASS; # Propenso a falsos positivos (para spam) [...] |

Finalmente, edita /etc/amavis/conf.d/50-user y agrega la línea $pax=’pax’; en el medio:

vi /etc/amavis/conf.d/50-user

| use strict; # # Coloca tus directivas de configuración aquí. Sobrescribirán las de # archivos anteriores. # # Consulta /usr/share/doc/amavisd-new/ para documentación y ejemplos de # las directivas que puedes usar en este archivo # $pax='pax'; #------------ No modifiques nada debajo de esta línea ------------- 1; # asegurar un retorno definido |

Después, ejecuta estos comandos para agregar el usuario clamav al grupo amavis y reiniciar amavisd-new y ClamAV:

adduser clamav amavis  
/etc/init.d/amavis restart  
/etc/init.d/clamav-freshclam restart  
/etc/init.d/clamav-daemon restart

Ahora tenemos que configurar Postfix para canalizar el correo electrónico entrante a través de amavisd-new:

postconf -e 'content_filter = amavis:[127.0.0.1]:10024'  
postconf -e 'receive_override_options = no_address_mappings'

Después, agrega las siguientes líneas a /etc/postfix/master.cf:

vi /etc/postfix/master.cf

| [...] amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks |

Luego reinicia Postfix:

/etc/init.d/postfix restart

Ahora ejecuta

netstat -tap

y deberías ver a Postfix (master) escuchando en el puerto 25 (smtp) y 10025, y a amavisd-new en el puerto 10024:

root@server1:/etc/courier# netstat -tap  
Conexiones de Internet activas (servidores y establecidas)  
Proto Recv-Q Send-Q Dirección Local           Dirección Extranjera          Estado       PID/Nombre del Programa  
tcp        0      0 *:http                  *:*                     LISTEN      6134/apache2  
tcp        0      0 *:ssh                   *:*                     LISTEN      610/sshd  
tcp        0      0 *:smtp                  *:*                     LISTEN      23128/master  
tcp        0      0 localhost.localdo:10024 *:*                     LISTEN      21937/amavisd-new (  
tcp        0      0 localhost.localdo:10025 *:*                     LISTEN      23128/master  
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      4308/mysqld  
tcp        0      52 server1.example.com:ssh 192.168.0.206:57597     ESTABLISHED 976/0  
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      610/sshd  
tcp6       0      0 [::]:smtp               [::]:*                  LISTEN      23128/master  
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN      18191/couriertcpd  
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN      18259/couriertcpd  
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN      18222/couriertcpd  
tcp6       0      0 [::]:imap2              [::]:*                  LISTEN      18154/couriertcpd  
root@server1:/etc/courier#
 

10 Instalar Razor, Pyzor Y DCC Y Configurar SpamAssassin

Razor, Pyzor y DCC son filtros de spam que utilizan una red de filtrado colaborativo. Para instalar Razor y Pyzor, ejecuta

apt-get install razor pyzor

DCC no está disponible en los repositorios de Ubuntu 13.10, así que lo instalamos de la siguiente manera:

cd /tmp  
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z   
tar xzvf dcc-dccproc.tar.Z  
cd dcc-dccproc-1.3.1.154  
./configure --with-uid=amavis  
make  
make install  
chown -R amavis:amavis /var/dcc  
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Ahora tenemos que decirle a SpamAssassin que use estos tres programas. Edita /etc/spamassassin/local.cf y agrega las siguientes líneas:

vi /etc/spamassassin/local.cf

| [...] #dcc use_dcc 1 dcc_path /usr/local/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /etc/razor/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Luego debemos habilitar el plugin DCC en SpamAssassin. Abre /etc/spamassassin/v310.pre y descomenta la línea loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/spamassassin/v310.pre

| [...] # DCC - realizar verificaciones de mensajes DCC. # # DCC está deshabilitado aquí porque no es de código abierto. Consulta la licencia de DCC para más detalles. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Puedes verificar tu configuración de SpamAssassin ejecutando:

spamassassin --lint

No debería mostrar ningún error.

Reinicia amavisd-new después:

/etc/init.d/amavis restart

Ahora actualizamos nuestros conjuntos de reglas de SpamAssassin de la siguiente manera:

sa-update --no-gpg

Creamos un trabajo cron para que los conjuntos de reglas se actualicen regularmente. Ejecuta

crontab -e

para abrir el editor de trabajos cron. Crea el siguiente trabajo cron:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

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