Hace unos días monté un servidor de correo para una pequeña empresa. Querían una solución basada en software libre, que pudiera trabajar con multiples buzones virtuales y utilizando IMAP de forma segura.

Despues de ver y comparar diferentes opciones me decidí por la tupla Postfix + Dovecot, el primero servidor de transporte SMTP y el segundo servidor IMAP y POP3 para obtener los correos. Hasta donde he leído y probado me han parecido más seguros y rápidos que otras opciones como Sendmail, Exim, Courier, etc.

Los dominios y usuarios virtuales los tendré en una BD MySql, ayudandome de la pequeña utilidad php Virtual Mail Manager para gestionarlos.

Y por último ofrezco también a los usuarios la opción de consultar sus buzones con un WebMail, en mi caso me he decantado por útilizar Roundcubemail.

roundcubemail_listing

A continuación dejo algunas indicaciones de como lo instalé, pero esto ni es una guia ni mucho menos un manual. Os recomiendo por completo que sigais esta gúia de workaround, en la que me base yo en mi instalación. Es de lo mejorcito que podeis encontrar para instalar lo que os comento sobre Debian.

Instalo Debian Lenny 5.0 con la selección de paquetes de sistema base, sin nada mas.

Añadimos al sources.list el repositorio non-free:

deb http://ftp.es.debian.org/debian/ lenny main non-free
deb-src http://ftp.es.debian.org/debian/ lenny main non-free


aptitude update
aptitude upgrade
aptitude install ssh vim

Instalación
Instalamos los paquetes necesarios para el mailserver:


aptitude install postfix-mysql mysql-server-5.0 phpmyadmin
aptitude install dovecot-pop3d dovecot-imapd openssl
aptitude install amavisd-new libclass-dbi-mysql-perl
aptitude install spamassassin clamav-daemon cpio arj zoo nomarch lzop cabextract pax lha unrar

Configuración

Refinar la configuración de Posfix

# dpkg-reconfigure postfix

He dejado el tamaño máximo de los buzones a 500 MB (524288000).

– MySQL

En nuestro servidor MySQL crearemos una nueva bdd llamada mailserver, con acceso para el usuario mailuser. Y creamos 3 tablas: virtual_domains, virtual_users, virtual_aliases y 2 vistas: view_users, view_aliases.

# mysqladmin -p

mysql>

CREATE DATABASE mailserver ;

GRANT SELECT ON mailserver.*
TO mailuser@localhost
IDENTIFIED BY 'mailuserPASSWORD';

USE mailserver ;

CREATE TABLE `virtual_domains` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB;

CREATE TABLE `virtual_users` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
user VARCHAR(40) NOT NULL,
password VARCHAR(32) NOT NULL,
CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;

CREATE TABLE `virtual_aliases` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
source VARCHAR(40) NOT NULL,
destination VARCHAR(80) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;

CREATE VIEW view_users AS
SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email,
virtual_users.password
FROM virtual_users
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;

CREATE VIEW view_aliases AS
SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email,
destination
FROM virtual_aliases
LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;

Creamos los mapping-files:

# vi /etc/postfix/mysql-virtual-mailbox-domains.cf

user = mailuser
password = miP@ss
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'


# vi /etc/postfix/mysql-virtual-mailbox-maps.cf

user = mailuser
password = miP@ss
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email='%s'


# vi /etc/postfix/mysql-virtual-alias-maps.cf

user = mailuser
password = miP@ss
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email='%s'


# vi /etc/postfix/mysql-email2email.cf

user = mailuser
password = miP@ss
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email='%s'

Tras esto configuramos postfix con estos mapeos

# postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /home/vmail -m
# postconf -e virtual_uid_maps=static:5000
# postconf -e virtual_gid_maps=static:5000
# postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
# postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
# chgrp postfix /etc/postfix/mysql-*.cf
# chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

PENDIENTE

Documentación:
http://workaround.org/articles/ispmail-etch/
http://workaround.org/ispmail/lenny/amavis-filtering-spam-and-viruses

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s