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/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. |
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. |
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.
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_sasl2_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.
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 |
# adduser -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 |
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:
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 |
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 porporcionadas 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:
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.
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). |
Ú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.
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!
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=` |
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.