Gentoo Logo

Sistema de correo virtual con postfix

Contenido:

1.  Introducción

Para la mayoría de los usuarios de Gentoo, con un simple cliente de correo y fetchmail bastaría. Sin embargo, si se está hospedando un dominio en el sistema, se necesitará un MTA (Agente de Transporte de Correo) de verdad. Y si se están hospedando varios dominios, definitivamente se necesita algo más robusto para manejar todo el correo de los usuarios. Este sistema fue diseñado para ser una elegante solución a este problema.

Un sistema de correo virtual tiene que ser capaz de manejar correo de numerosos dominios con diferentes usuarios sobre una variedad de interfaces. Esto presenta algunos problemas con los que tendremos que tratar. Por ejemplo, ¿qué ocurre si dos usuarios en diferentes dominios quieren usar el mismo nombre de usuario? Si proveemos acceso imap y smtp-auth, ¿cómo combinamos todos los demonios de autenticación en un solo sistema? ¿Cómo proporcionar seguridad para los numerosos componentes que componen el sistema? ¿Cómo lo maneja todo?

Este documento muestra cómo configurar un sistema capaz de manejar correo para todos los dominios que el equipo pueda manejar, soporte de usuarios virtuales que no necesiten cuentas de shell, que los nombres sean específicos de cada dominio, que los clientes se puedan autenticar por web, imap, smtp, y pop3 contra una base de datos, utilizar ssl para la capa de transporte segura, que tenga una interfaz web, que pueda manejar listas de correo para cualquiera de los dominios, y sea controlado por una bonita, central y simple base de datos mysql.

Hay gran variedad de formas para mantener un sistema de correo virtual. Con tantas opciones, cualquier otra puede ser más adecuada dependiendo de las necesidades que se tengan. Hay que considerar investigar http://www.es.qmail.org/ y http://www.exim.org/ para explorar otras opciones.

Los siguientes paquetes serán usados en este sistema: apache, courier-imap, courier-authlib, postfix, mod_php, phpmyadmin, squirrelmail, cyrus-sasl, mysql, php, y mailman.

Hay que asegurarse de activar las siguientes variables USE en /etc/portage/make.conf antes de compilar los paquetes: USE="mysql imap libwww maildir sasl ssl". De otra forma se necesitarán recompilar cosas para obtener soporte para todos los protocolos. Además, es una buena idea desactivar cualquier otra variable que tenga que ver con correo y red, como ipv6.

Importante: Se necesita un nombre de dominio para ejecutar un servidor de correo público, o al menos un registro MX para un dominio. Lo ideal sería tener control sobre al menos dos dominios para beneficiarse del nuevo sistema de correo virtual.

Importante: Hay que asegurarse de que /etc/conf.d/hostname contiene el nombre de máquina correcto del servidor de correo. Para que tomen efecto los cambios hechos en este archivo ejecute /etc/init.d/hostname restart. Verifique que esté correcto el nombre de su máquina con hostname. También verifique que no hay entradas conflictivas en /etc/hosts.

Nota: Se recomienda la lectura de este documento completo y la familiaridad con todos los pasos antes de ponerse a instalarlo. Si se tienen problemas con alguno de los pasos, puede comprobarse la guía de problemas frecuentes al final de este documento. También, no todos los paquetes aquí referenciados son necesarios, esto es para un sistema muy flexible. Por ejemplo, si no se desea una interfaz web, puede evitarse la sección de squirrelmail.

2.  Postfix Básico

Listado de Código 2.1: Instalar postfix

# emerge postfix

Aviso: Hay que verificar que no se ha instalado otro MTA, como ssmtp, exim, o netqmail, o seguro que se tendrán GRANDES problemas.

Tras la instalación de postfix, es el momento de configurarlo. Vamos a cambiar las siguientes opciones en /etc/postfix/main.cf. Recuerde reemplazar las $variables con sus propios nombres.

Listado de Código 2.2: /etc/postfix/main.cf

myhostname = $host.domain.name
mydomain = $domain.name
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain $mydomain
mynetworks = my.ip.net.work/24, 127.0.0.0/8
home_mailbox = .maildir/
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

Lo siguiente es cambiar /etc/postfix/master.cf. Esto activará que la salida sea detallada para poder depurar:

Listado de Código 2.3: /etc/postfix/master.cf

# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (50)
#
==========================================================================
(Sólo hay que añadir "-v" después de smtpd a la siguiente línea)
smtp      inet  n       -       n       -       -       smtpd -v

Lo siguiente es editar /etc/mail/aliases para añadir los alias locales. Debe haber al menos un alias para root como: root: your@email.address.

Listado de Código 2.4: Iniciar postfix por primera vez

# /usr/bin/newaliases

(Esto instalará el nuevo alias. Sólo se necesita hacer esto cuando se
actualicen o añadan nuevos alias.)


# /etc/init.d/postfix start

Ahora que postfix está corriendo, se ejecuta el cliente de correo de consola y nos enviamos un mensaje. Yo uso mutt para todo mi email. Comprobamos que postfix está repartiendo el correo a los usuarios locales, una vez esto esté hecho, pasaremos al siguiente paso.

Nota: Recomiendo que se verifique que esta configuración básica de postfix está funcionando antes de dar el siguiente paso en esta guía.

3.  Courier-imap

Listado de Código 3.1: Instalar courier-imap

# emerge courier-imap

Listado de Código 3.2: Configuración de Courier-imap

# cd /etc/courier-imap

(Si se quiere usar ssl para imap y pop, hay que crear certificados para este
propósito.
Este paso está recomendado. Si no se quiere ssl, simplemente se puede evitar.)


# nano -w /etc/courier-imap/pop3d.cnf
# nano -w /etc/courier-imap/imapd.cnf

(Se cambian los campos C, ST, L, CN, y email ajustándolos a nuestro
caso.)

# mkpop3dcert
# mkimapdcert

Listado de Código 3.3: Inicie los servicios de courier que necesite.

# /etc/init.d/courier-imapd start
# /etc/init.d/courier-imapd-ssl start
# /etc/init.d/courier-pop3d start
# /etc/init.d/courier-pop3d-ssl start

Se ejecuta nuestro cliente de correo preferido y se comprueba que todas las conexiones para mandar y recibir correo funcionan. Por supuesto, no podrá hacer log on al estos servicios, porque la autentificación no ha sido configurada, pero es buena idea revisar si las conexiones en sí funcionan o no.

Ahora que lo básico funciona, vamos a seguir con el resto del manojo de paquetes para que el sistema funcione. Y otra vez, hay que comprobar que se ha instalado todo y que funciona antes de continuar.

4.  Cyrus-sasl

Ahora vamos a instalar cyrus-sasl. Sasl va a hacer la labor de pasar las variables de autenticación a pam que pasará está información a mysql para autenticar usuarios de smtp. Para este documento no vamos a comprobar si sasl funciona hasta que mysql no esté configurado correctamente con un usuario de prueba; lo que está bien, porque siempre autenticaremos contra una base de datos mysql.

Listado de Código 4.1: Configurar e instalar el ebuild cyrus-sasl

# emerge cyrus-sasl

Ahora, se edita /etc/sasl2/smtpd.conf.

Listado de Código 4.2: Iniciar sasl

# nano -w /etc/sasl2/smtpd.conf
mech_list: PLAIN LOGIN
pwcheck_method: saslauthd
# nano -w /etc/conf.d/saslauthd
SASLAUTHD_OPTS="${SASLAUTH_MECH} -a rimap -r"
SASLAUTHD_OPTS="${SASLAUTHD_OPTS} -O localhost"
# /etc/init.d/saslauthd start

5.  Certificados SSL para Postfix y Apache

Ahora vamos a hacer los certificados SSL para postfix y apache.

Listado de Código 5.1: Certificados ssl

# cd /etc/ssl/
# nano -w openssl.cnf


Hay que ajustar los siguientes valores por defecto para nuestro dominio:

countryName_default
stateOrProvinceName_default
localityName_default
0.organizationName_default
commonName_default
emailAddress_default.


(Si las variables no están presentes, hay que añadirlas.)


# cd misc
# ./CA.pl -newreq-nodes
# ./CA.pl -newca
# ./CA.pl -sign
# cp newcert.pem /etc/postfix
# cp newkey.pem /etc/postfix
# cp demoCA/cacert.pem /etc/postfix

(Ahora hacemos lo mismo para apache.)

# openssl req -new > new.cert.csr
# openssl rsa -in privkey.pem -out new.cert.key
# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 365


(Por ahora dejamos estos certificados ahí. Los agregaremos después de
instalar Apache.)

6.  Añadir a Postfix soporte para SSL y SASL

Ahora se edita el fichero de configuración de Postfix para que utilice ssl y sasl. Se añaden los siguientes parámetros al final del fichero para que serán más sencillos de encontrar.

Listado de Código 6.1: /etc/postfix/main.cf

# nano -w /etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =


(Las opciones broken_sasl_auth_clients y login y auth son para outlook y
outlook express y no están documentadas. ¿No es fantástico tener que hackear
software para estúpidos, rotos, M$ y BS?
smtpd_sasl_local_domain añade un dominio a los clientes que usen smtp-auth.
Hay que asegurarse de que está en blanco o los nombres de usuario serán
manejados por postfix y estos serán incapaces de autenticarse.


smtpd_recipient_restrictions =
 permit_sasl_authenticated,
 permit_mynetworks,
 reject_unauth_destination

(Las siguientes dos opciones activan el cifrado saliente)
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/newkey.pem
smtpd_tls_cert_file = /etc/postfix/newcert.pem
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom


(smtpd_tls_auth_only está comentado para poder probar el sistema. Se puede
habilitar más tarde si se desea.)


# postfix reload

Ahora vamos a comprobar que la configuración es aceptada por postfix. Para esto vamos a usar telnet (proporcionado, por ejemplo, por net-misc/netkit-telnetd), aunque también se podría usar nc (proporcionado por net-analyzer/netcat):

Listado de Código 6.2: Comprobar el soporte para sasl y tls

# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.domain.com ESMTP Postfix
EHLO domain.com
250-mail.domain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN OTP
250-AUTH=LOGIN PLAIN OTP
250-XVERP
250 8BITMIME
^]
telnet> quit

Se comprueba que aparecen las líneas AUTH y STARTTLS. Como dije antes, tal y como está ahora AUTH no funcionará porque sasl intentará autenticar contra sasldb en lugar de hacerlo con el shadow, por alguna extraña razón, que nosotros no hemos configurado. Así que vamos a instalar mysql para que guarde la información sobre autenticación y la información de los dominios virtuales.

7.  El usuario vmail

Antes de configurar nuestro entorno virtual mailhosting, crearemos un usuario bajo el cual los buzones virtuales serán almacenados. Para que sea lo más claro posible, llamaremos a este usuario vmail:

Listado de Código 7.1: Agregando al usuario vmail

# useradd -d /home/vmail -s /bin/false -m vmail

Ahora ha establecido la cuenta vmail. Puede crear múltiples cuentas si lo desea (en caso de manejar una estructura en el conjunto de cuentas virtuales de correo). Los id de usuario, de grupo y directorios home son referenciados en las tablas de MySQL.

Junto con la cuenta del usuario, también necesitamos crear la ubicación donde serán almacenados los buzones:

Listado de Código 7.2: Creando los buzones

# mkdir -p /home/vmail/virt-domain.com/foo
# chown -R vmail:vmail /home/vmail/virt-domain.com
# maildirmake /home/vmail/virt-domain.com/foo/.maildir

8.  MySQL

Ahora vamos a instalar y configurar MySQL. Se necesitará el fichero genericmailsql.sql para este paso.

Listado de Código 8.1: Instalar y configurar MySQL

# emerge mysql

# /usr/bin/mysql_install_db


Después de este comando hay que seguir los pasos en pantalla para
añadir un password para root en mysql, de manera que la
base de datos no esté abierta a todos el mundo.


# /etc/init.d/mysql start
# mysqladmin -u root -p create mailsql
# mysql -u root -p --opt mailsql < genericmailsql.sql

# mysql -u root -p mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE
  ->   ON mailsql.*
  ->   TO mailsql@localhost
  ->   IDENTIFIED BY '$password';
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> quit


(Hay que comprobar que el nuevo usuario (mailsql) puede conectar al servidor
de base de datos.)


# mysql -u mailsql -p mailsql

La nueva base de datos tiene algunos valores por defecto para dos dominios. Las siguientes tablas están incluidas:

  • alias - información sobre los alias locales y los alias de mailman.
  • relocated - mapas de direcciones de correo relocalizadas
  • transport - transporte de correo por defecto para todos los dominios que se hospedan
  • users - información sobre todos los usuarios
  • virtual - información sobre los dominios virtuales

Listado de Código 8.2: Ejemplo de tabla alias

id   alias    destination
1    root     foo@bar.com
2  postmaster foo@bar.com

Listado de Código 8.3: Ejemplo de tabla user


(Línea dividida para una mayor claridad.)


id email            clear     name     uid     gid     homedir     \
  maildir                                quota  postfix
10 foo@virt-domain.org $password realname virtid  virtid  /home/vmail \
  /home/vmail/virt-bar.org/foo/.maildir/        y
13 foo@bar.com      $password realname localid localid /home/foo   \
  /home/foo/.maildir/                           y

Los valores del uid y gid en virtid deben ser los del usuario y el grupo vmail.

Listado de Código 8.4: Ejemplo de tabla transport

id   domain       destination
1    bar.com      local:
2    virt-domain.org virtual:

Listado de Código 8.5: Ejemplo de tabla virtual

id   email            destination
3   root@virt-domain.org other@email.address

9.  Apache y phpMyAdmin

Ahora vamos a configurar apache y una interfaz para trabajar con la base de datos.

Listado de Código 9.1: Configurar apache y phpmyadmin

# emerge apache phpmyadmin

Hay muchas guías sobre cómo configurar apache con php, incluyendo guías proporcionadas por el Proyecto PHP Gentoo. También hay muchos mensajes en http://forums.gentoo.org con información detallada sobre problemas comunes en la instalación (puede buscarse 'apache php'). Así que, no lo cubriremos aquí. Después de instalar y configurar apache y php, se puede continuar con esta guía. Ahora crearemos el .htaccess en el directorio que esté phpMyAdmin. Si no se hace esto, los motores de búsqueda entrarán e indexaran estas páginas y cualquiera podrá obtener información sobre la base de datos buscando en google, lo que es ¡MALO!. Hay muchas guías acerca de esto, como por ejemplo: http://www.csoft.net/docs/micro/htaccess.html.en.

Ahora vamos a instalar los certificados que hicimos para Apache. Las directivas de Apache-SSL que se necesitan son las siguientes:

  • SSLCertificateFile /path/to/certs/new.cert.cert
  • SSLCertificateKeyFile /path/to/certs/new.cert.key

Listado de Código 9.2: Instalar los certificados SSL en Apache

# cp /etc/ssl/misc/new.cert.cert /etc/apache2/ssl/
# cp /etc/ssl/misc/new.cert.key /etc/apache2//ssl/
# cd /etc/apache2/vhosts.d

(revise si tiene una plantilla para un ssl-vhost.
 En ese caso, copie ese en vez del default_vhost)

# cp 00_default_vhost.conf ssl-vhost.conf
# nano -w ssl-vhost.conf

Cambiamos los siguientes parámetros:
NameVirtualHost host.domain.name:443

<VirtualHost host.domain.name:443>
  ServerName host.domain.name
  ServerAdmin your@email.address

  DocumentRoot "/var/www/localhost/htdocs/phpmyadmin";
  <Directory "/var/www/localhost/htdocs/phpmyadmin">
    ...
  </Directory>

  SSLCertificateFile /etc/apache2/ssl/new.cert.cert
  SSLCertificateKeyFile /etc/apache2/ssl/new.cert.key
  SSLEngine on
  ...
</VirtualHost>

# nano -w /etc/conf.d/apache2
(Add -D SSL -D PHP5 to the APACHE2_OPTS)

# /etc/init.d/apache2 restart

Ahora configuremos phpMyAdmin.

Listado de Código 9.3: Configurar phpMyAdmin

# cd /var/www/localhost/htdocs/phpmyadmin
# cp config.sample.inc.php config.inc.php
# nano -w config.inc.php

Hay que cambiar los siguientes parámetros

$cfg['blowfish_secret'] = 'fraseclavesupersecreta';

$cfg['Servers'][$i]['host'] = 'localhost';          // nombre anfitrión MySQL
$cfg['Servers'][$i]['controluser'] = 'mailsql';     // configuración usuario de control MySQL
                                                    // (este usuario debe tener acceso solo
$cfg['Servers'][$i]['controlpass'] = '$password';   // lectura a las tablas "mysql/user"
                                                    // y "mysql/db")
$cfg['Servers'][$i]['user'] = 'mailsql';            // usuario MySQL
$cfg['Servers'][$i]['password'] = '$password';      // clave MySQL

Ahora navegue a la página de phpmyadmin y navegamos por las tablas. Podremos añadir los alias locales, editar la tabla de usuarios para añadir un usuario de prueba, y añadir la información sobre los dominios. Por defecto, las tablas tienen unos valores que servirán de guía. Hay que asegurarse de poner la información correcta en la base de datos. Por ejemplo, hay que asegurarse de que los directorios de los usuarios locales existen y que tienen los valores uid/gid correctos. Los maildirs deberían ser creados automáticamente por postfix cuando el usuario recibe su primer mensaje. Así que, en general, es una buena idea mandar un mensaje de bienvenida tras crear los nuevos usuarios de forma que .maildir sea creado.

10.  Configurar la autenticación MySQL y con dominios virtuales

Ahora vamos a reconfigurar nuestra autenticación para que use la base de datos mailsql en courier-imap y en postfix. En todos los ejemplos que siguen, hay que reemplazar $password por la contraseña que se escogió a la hora de crear el usuario mailsql en MySQL.

Listado de Código 10.1: Configurar la autenticación

# nano -w /etc/courier/authlib/authdaemonrc
authmodulelist="authmysql authpam"

# nano -w /etc/courier/authlib/authmysqlrc
MYSQL_SERVER            localhost
MYSQL_USERNAME          mailsql
MYSQL_PASSWORD          $password
MYSQL_DATABASE          mailsql
MYSQL_USER_TABLE        users

(Hay que asegurarse de que la siguiente línea está comentada, dado que usamos
sólo texto.)

#MYSQL_CRYPT_PWFIELD    crypt
MYSQL_CLEAR_PWFIELD     clear
MYSQL_UID_FIELD         uid
MYSQL_GID_FIELD         gid
MYSQL_LOGIN_FIELD       email
MYSQL_HOME_FIELD        homedir
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir

# /etc/init.d/courier-authlib restart
# /etc/init.d/saslauthd restart

¡Ya casi está! Ahora haremos las configuraciones necesarias para que postfix interactúe con la base de datos para sus demás necesidades de transporte. Recuerde reemplazar cada valor con el nombre del propio usuario, user id, contraseña, alias, dirección de correo electrónico, etc.

Listado de Código 10.2: /etc/postfix/mysql-aliases.cf

# nano -w /etc/postfix/mysql-aliases.cf
# mysql-aliases.cf

user         = mailsql
password     = $password
dbname       = mailsql
table        = alias
select_field = destination
where_field  = alias
hosts        = unix:/var/run/mysqld/mysqld.sock

Listado de Código 10.3: /etc/postfix/mysql-relocated.cf

# nano -w /etc/postfix/mysql-relocated.cf
# mysql-relocated.cf

user         = mailsql
password     = $password
dbname       = mailsql
table        = relocated
select_field = destination
where_field  = email
hosts        = unix:/var/run/mysqld/mysqld.sock

Listado de Código 10.4: /etc/postfix/mysql-transport.cf (opcional)

# nano -w /etc/postfix/mysql-transport.cf
# mysql-transport.cf

user         = mailsql
password     = $password
dbname       = mailsql
table        = transport
select_field = destination
where_field  = domain
hosts        = unix:/var/run/mysqld/mysqld.sock

Listado de Código 10.5: /etc/postfix/mysql-virtual-gid.cf (opcional)

# nano -w /etc/postfix/mysql-virtual-gid.cf
# mysql-virtual-gid.cf

user            = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = gid
where_field     = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Listado de Código 10.6: /etc/postfix/mysql-virtual-maps.cf

# nano -w /etc/postfix/mysql-virtual-maps.cf
# mysql-virtual-maps.cf

user            = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = maildir
where_field     = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Listado de Código 10.7: /etc/postfix/mysql-virtual-uid.cf (opcional)

# nano -w /etc/postfix/mysql-virtual-uid.cf
# mysql-virtual-uid.cf
user            = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = uid
where_field     = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Listado de Código 10.8: /etc/postfix/mysql-virtual.cf

# nano -w /etc/postfix/mysql-virtual.cf
# mysql-virtual.cf
user         = mailsql
password     = $password
dbname       = mailsql
table        = virtual
select_field = destination
where_field  = email
hosts        = unix:/var/run/mysqld/mysqld.sock

Por último, hay que editar /etc/postfix/main.cf una vez más.

Listado de Código 10.9: /etc/postfix/main.cf

# nano -w /etc/postfix/main.cf

(Asegúrese que no haya otras definiciones de alias_maps)

alias_maps = mysql:/etc/postfix/mysql-aliases.cf
relocated_maps = mysql:/etc/postfix/mysql-relocated.cf

local_transport = local
local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname

virtual_transport = virtual
(Los dominios listados por mydestination no deben ser listados en
 el parámetro virtual_mailbox_domains)
virtual_mailbox_domains = virt-domain.com, $other-virtual-domain.com

virtual_minimum_uid = 1000
(Sustituya $vmail-gid con el GID del grupo vmail)

virtual_gid_maps = static:$vmail-gid
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf

(Sustituya $vmail-uid con el UID del usuario vmail)
virtual_uid_maps = static:$vmail-uid
virtual_mailbox_base = /
#virtual_mailbox_limit =

Por razones de seguridad es necesario cambiar los permisos de todos los /etc/mail/mysql-*.cf:

Listado de Código 10.10: Cambiar los permisos de los archivos

# chmod 640 /etc/postfix/mysql-*.cf
# chgrp postfix /etc/postfix/mysql-*.cf

En Postfix 2.0.x, hay cambios significativos desde 1.1.x. Destacando que las tablas transport, virtual-gid y virtual-uid no son necesarias. Las tablas aún se incluyen, por si se quieren usar.

Nota: Se recomienda la lectura de VIRTUAL_README incluido en la documentación de postfix para más información.

Listado de Código 10.11: Hacer a postfix recargar sus tablas

# postfix reload

Ahora, si todo ha ido bien, se debería tener el sistema funcionando. Los usuarios serán capaces de autenticarse contra la base de datos sql, usando su dirección de email completa, para pop3, imap, y smtp. Se recomienda comprobar que todo funciona correctamente en este momento. Si se tienen problemas, siempre puede comprobarse la sección de problemas frecuentes en esta guía.

11.  Squirrelmail

Listado de Código 11.1: Instalar squirrelmail

# emerge squirrelmail


(Si se instala squirrelmail hacia localhost, puede accederse al mismo con
http://localhost/mail)
(Hay que sustituir 1.4.3a-r2 con la versión que se use)


# webapp-config -I -h localhost -d /mail squirrelmail 1.4.3a-r2
# cd /var/www/localhost/htdocs/mail/config
# perl ./conf.pl


(Hay que cambiar las opciones de la Organización, Servidor y
Directorio en squirrelmail. Ahora se debería poder conectar a
squirrelmail, con la dirección de correo completa, y utilizar el nuevo
sistema de webmail).

12.  Mailman

Último paso: mailman. La nueva versión de mailman tiene una buena interfaz para soportar dominios virtuales, que es por lo que lo uso, y sin mencionar que es un muy buen paquete. Para instalar este paquete y hacer que funcione bien con dominios virtuales vamos a necesitar un poco de hacking. Yo recomiendo leer toda la documentación de mailman, incluyendo README.POSTFIX.gz, para entender qué se está haciendo aquí.

Listado de Código 12.1: Instalar mailman

# emerge mailman

Listado de Código 12.2: Configurar los valores predeterminados: Mailman/Defaults.py

#  nano -w /usr/local/mailman/Mailman/Defaults.py
(Cambiar los siguientes valores para reflejar el dominio primario,
configuraremos los virtuales después.)
DEFAULT_EMAIL_HOST = 'domain.com'
DEFAULT_URL_HOST = 'www.domain.com'

Listado de Código 12.3: Configuración de mailman: mm_cfg.py

# nano -w /usr/local/mailman/Mailman/mm_cfg.py
MTA = "Postfix"
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['virt-domain.com', 'virt.domain2.com']
add_virtualhost('www.virt.domain.com', 'virt.domain.com')
add_virtualhost('www.virt.domain2.com', 'virt.domain2.com')
(Esto es necesario para que funcionen los dominios virtuales.)

Listado de Código 12.4: Y por último, pero no menos importante


(Cuando se haya terminado, añadiremos la primera lista.)


# su mailman
# cd ~
# bin/newlist --urlhost='www.virt-domain.com' --emailhost='virt-domain.com' test
Enter the email of the person running the list: your@email.address
Initial test password:
Hit enter to continue with test owner notification...
(Las listas de dominios virtuales pueden ser especificadas también
usando el formato lista@dominio.com.)

# bin/genaliases
(Ahora que los alias han sido regenerados,
veamos si han sido añadidos correctamente.)

# nano -w data/aliases
# STANZA START: test
# CREATED:
test:             "|/usr/local/mailman/mail/mailman post test"
test-admin:       "|/usr/local/mailman/mail/mailman admin test"
test-bounces:     "|/usr/local/mailman/mail/mailman bounces test"
test-confirm:     "|/usr/local/mailman/mail/mailman confirm test"
test-join:        "|/usr/local/mailman/mail/mailman join test"
test-leave:       "|/usr/local/mailman/mail/mailman leave test"
test-owner:       "|/usr/local/mailman/mail/mailman owner test"
test-request:     "|/usr/local/mailman/mail/mailman request test"
test-subscribe:   "|/usr/local/mailman/mail/mailman subscribe test"
test-unsubscribe: "|/usr/local/mailman/mail/mailman unsubscribe test"
# STANZA END: test

(Crear la lista mailman requerida)
# ./bin/newlist mailman
# ./bin/genaliases

(Regresar al usuario root)
# exit

# /etc/init.d/mailman start
# rc-update add mailman default
(Para ejecutar mailman en cada reinicio.)

Listado de Código 12.5: Añadir soporte de alias mailman en postfix

# nano -w /etc/postfix/main.cf
owner_request_special = no
recipient_delimiter = +
(Lea README.POSTFIX.gz para más detalles.)

alias_maps     =
    hash:/usr/local/mailman/data/aliases,
    mysql:/etc/postfix/mysql-aliases.cf

virtual_alias_maps =
    hash:/usr/local/mailman/data/virtual-mailman,
    mysql:/etc/postfix/mysql-virtual.cf

(Esto añade el fichero de alias de mailman a postfix. Se pueden
utilizar tablas de MySQL para esto, pero odio hacer esto a
mano. Además, si no se están usando dominios virtuales, añadir los
mapas de dominios virtuales a postfix causará problemas, avisado).

Ahora se deberían poder configurar listas de correo para cualquier dominio en la máquina. Como última nota sobre el asunto, hay que asegurarse de que se ejecutan todos los comandos de mailman con el usuario mailman (su mailman) o los permisos serán erróneos y habrá que corregirlos. Hay que leer la documentación de mailman para más información sobre cómo configurar y manejar listas de correo con mailman.

13.  Filtrando el contenido y Anti-Virus

Para filtrado de contenido y anti-virus, se puede consultar la Guía Gentoo para el filtrado de correo.

14.  Todo en uno

Ok, ya está todo, editamos /etc/postfix/master.cf y quitamos el modo detallado (verbose) para el uso en producción. Probablemente se quieran añadir los servicios al arranque del sistema para que se inicien cada vez que se reinicie el servidor. Hay que asegurarse de añadir todos los paquetes que se están usando - apache, mysql, saslauthd, postfix, courier-imapd, courier-imapd-ssl, courier-pop3d, y courier-pop3d-ssl, dependiendo de los tipos de acceso que se quieran ofrecer. Normalmente yo los inicio todos.

Listado de Código 14.1: Todo en uno

# postfix reload
# rc-update add $service default

¡A disfrutarlo!

15.  Problemas frecuentes

Introducción

Lidiando con problemas: Esta es una pequeña guía para lidiar con los posibles problemas que puedan surgir para la configuración que hemos hecho. No es exhaustiva, pero puede ser un comienzo para empezar a pelearse con los problemas. Con una configuración complicada como esta, es necesario que se asigne correctamente el problema con el componente que está fallando. En general para hacer esto sirve con seguir los siguientes pasos. Empezar por la base del sistema y empezar a ascender hasta conseguir dar con el componente que tiene el problema.

Paso 1: Comprobar los ficheros de configuración

Los errores al escribir un fichero de configuración son mortales, especialmente cuando se trata de sistemas de autenticación. Han de comprobarse los ficheros de configuración y sql en busca de estos errores. Se puede depurar todo lo que uno quiera, pero si no se le está pasando la información correcta, el sistema de correo no va a funcionar. Si se hace un cambio en un fichero de configuración para un servicio, hay que asegurarse de reiniciar dicho servicio para que los cambios en el fichero tengan efecto.

Listado de Código 15.1: Cómo reiniciar un servicio

# /etc/init.d/servicio restart

Paso 2: ¿Los servicios necesarios están corriendo?

Si no están corriendo, hay que iniciarlos. Es tremendamente difícil depurar un servicio que no está corriendo. A veces un servicio puede actuar como si estuviera iniciado pero puede seguir sin funcionar. A veces, cuando se tiene un fichero incorrecto, o una mala transmisión entra en un componente de correo, el servicio abre un puerto para evitar que sea usado por otro proceso. A veces se puede detectar esto con netstat. Reiniciar la máquina limpiará la lista de puertos abiertos por procesos que no están funcionando bien.

Listado de Código 15.2: Comprobar el estado de un servicio

# /etc/init.d/$service status
# netstat -a | grep $service (o bien: $port)

Paso 3: ¿Están todos los servicios usando los últimos ficheros de configuración?

Si se ha modificado alguno de los ficheros, hay que reiniciar ese servicio para asegurarse de que está utilizando la última versión de dicho fichero. Algunos programas como postfix volcarán su configuración actual.

Listado de Código 15.3: Algunos servicios pueden mostrar su configuración actual

# apachectl fullstatus (necesita lynx instalado)
# apachectl configtest (comprueba el fichero de configuración)
# postconf -n (mostrará los parámetros que está usando postfix)
# /etc/init.d/$service restart

Paso 4: Comprobación de bitácoras (log).

Las bitácoras son mis amigas. El siguiente paso son siempre las bitácoras. A veces es muy útil provocar un fallo en el sistema de correo para, tras esto, comprobar el error en los registros. Ver si hay algo de información que nos ayude a diagnosticar el problema, o quizá, mostrarnos qué componente está fallando.

Listado de Código 15.4: Comprobar las bitácoras

# kill -USR1 `ps -C metalog -o pid=` (para deshabilitar el búfer de metalog)
# nano -w /var/log/mail/current
# cat /var/log/mysql/mysql.log
# tail /var/log/apache2/error_log

Se pueden encontrar útiles los parámetros de debug_peer en main.cf. Añadiendo esto, se incrementará el nivel de depuración.

Listado de Código 15.5: Añadir soporte debug_peer

# nano -w /etc/postfix/main.cf
debug_peer_level = 5
debug_peer_list = $host.domain.name

(Se descomenta también uno de los comandos de depuración sugeridos.)

Paso 5: Hablar con el propio servicio.

SMTP, IMAP y POP3 responden a sesiones telnet. Tal y como vimos cuando comprobamos la configuración de postfix. A veces es útil abrir una sesión telnet a uno de los servicios para ver qué está pasando.

Listado de Código 15.6: Conectar a un servicio con telnet

# telnet localhost $port

(SMTP es 25, IMAP es 143, POP3 es 110. Se debe recibir una cadena OK,
que nos muestre que el servicio se está ejecutando y listo para
aceptar peticiones).


Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.

Paso 6: A veces las grandes armas nos dan la información que se necesita: strace.

Debe tenerse este programa instalado. Es una herramienta muy buena para depurar programas. Se pueden iniciar comandos desde la consola con strace y ver las llamadas al sistema a la vez que ocurren. Muchas veces vuelca una enorme cantidad de información, así que se tendrá que ver en tiempo real mientras que intenta una transacción fallida con el sistema de correo, o bien, mandar la salida a un fichero para luego examinarlo.

Listado de Código 15.7: Usar strace

# emerge strace
# strace $command
# strace -p `ps -C $service -o pid=`

Paso 7: Investigación

Una vez que se tiene la información, si se puede diagnosticar y arreglar el problema, ¡bien! Si no, probablemente se necesite navegar un poco por la red en busca de información que nos ayude a diagnosticar y arreglar el problema. Aquí hay una lista de sitios donde se puede comprobar si el problema ha sido resuelto. También hay una buena guía para configurar smtp-auth que contiene buenas ideas sobre depuración.



Imprimir

Página actualizada 24 de julio, 2012

Sumario: Este documento describe como crear un sistema de correo virtual basado en postfix, mysql, courier-imap, y cyrus-sasl.

Ken Nowack
Autor

Ezra Gorman
Autor

Zack Gilburd
Editor

Scygro
Editor

Sven Vermeulen
Editor

Joshua Saddler
Editor

José Alberto Suárez López
Traductor

John Christian Stoddart
Traductor

José Luis Rivero
Traductor

Fernando J. Pereda Garcimartín
Traductor

Fernando M. Bueno
Traductor

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.