Redes-Linux.com
Esta página esta optimizada para ser visualizada tanto en navegadores gráficos, como en navegadores de texto.
 
Buscar en:


 
El Servidor
Current bandwidth utilization 0.01 Mbit/s
Ancho de banda utilizado
 
Redes-Linux
 
Tip Today by ugu.com
 
Más cosas
 
Conóceme
 
Nota: Este es un articulo escrito por makko, usuario del foro de esta misma Web.

07/10/2004   Dos servidores de correo sirviendo el mismo dominio   06:23 A.M.
Nuestro amigo makko, nos ha dejado en el foro de Redes-Linux, una interesante receta sobre como tener dos ordenadores diferentes, con un servidor de correo sendmail instalado en cada uno de ellos, sirviendo el mismo dominio, o lo que es lo mismo, como repartir la carga de las cuentas de un dominio, entre dos servidores de correo diferentes (una especie de cluster barato para servir dominios de correo)

Actualización: Se ha actualizado el artículo, con la corrección de un bug encontrado en la configuración de perdition.

Ingredientes que hacen falta para poner en marcha el proyecto:

  1. un dominio tal como mail.midominio.org
  2. un DNS el cual pueda modificar libremente
  3. dos o mas maquinas mas o menos "buenitas"
  4. una distribución Linux (Yo lo hice con Fedora Core 1 updateado)
  5. sendmail 8.12.10 o superior
  6. squirrelmail (optativo) como un webmail.
  7. Clientes, muchos Clientes... (yo tengo + de 500...)
Bien, creo que no se me olvido nada, ahora viene lo interesante:

Preparación:

1.- Create un registro MX en tu archivo de zona de tu DNS (en mi caso /var/named/mizona.cl.zone) :

mail IN MX 5 mail.midominio.cl

Ok, ahora mail.midominio.cl ya no es una sola maquina sino que esta compuesta por mas de una, en mi caso son dos:
mail IN A 10.0.1.10
mail IN A 10.0.1.11

Ahora edítate el archivo reverso (/var/named/1.0.10.rev):
10 IN PTR mail.midominio.cl
11 IN PTR mail.midominio.cl

Ok, primera parte lista, reiniciamos el servicio y hacemos ping a mail.midominio.cl, debería responder una de las dos por cada ping que hagamos.

2.- Ahora configuramos nuestras maquinas, para ello hemos tomado como política de distribución el orden alfabético del nombre del usuario, a-k -> van a la maquina1, l-z -> van a la maquina2, entonces juanito@mail.midominio.cl esta en maquina1 y pedrito@mail.midominio.cl esta en maquina2, por lo que la condición necesaria es que se creen (o se migren) las cuentas de la a-k a maquina1 y el resto en la otra maquina. Ok hasta aquí todo bien, ahora supongamos que enviamos correo a juanito@mail.midominio.cl y el Round-Robin DNS que hicimos anteriormente nos direcciona a maquina2(donde NO esta nuestra cuenta), entonces el correo debe redireccionarse a maquina1, aquí esta lo interesante, entonces editamos en sendmail.cf y agregamos esta maravillosa RuleSet (ojo con los tab):

R$* $: $>makko $1

Smakko
R$* $: $(maquina1 $1 $)
R$* $: $(maquina2 $1 $)


Kmaquina1 regex -s1 a<@maquina1.midominio.cl> ([^a-k][^@]*)<@maquina1.midominio.cl.>
Kmaquina2 regex -s1 -a<@maquina2.midominio.cl.> (^[^a-k][^@]*)<@maquina1.midominio.cl.>

Esto hace que el correo llegue a la maquina correcta, tengo que decir que según el articulo del tipo que ideó esto dice que esta RuleSet se pone en un lugar especifico del sendmail.cf, sin embargo a mi no me funciono porque sencillamente la regla no se ejecutaba, por lo que decidí poner mi regla en otra RuleSet (y esa es del sendmail por lo que siempre la va a ejecutar) que es la $parse=0, entonces cuando sendmail ejecute su Ruleset lo primero que va a ser es mirar mis reglas..., por lo que queda mas o menos así:
######################################
### Ruleset 0 -- Parse Address ###
######################################

Sparse=0

R$* $: $>makko $1 initial parsing
R$* $: $>Parse0 $1 initial parsing
R<@> $#local $: <@> special case error msgs
R$* $: $>ParseLocal $1 handle local hacks
R$* $: $>Parse1 $1 final parsing

Smakko
R$* $: $(maquina1 $1 $)
R$* $: $(maquina2 $1 $)

Kmaquina1 regex -s1 a<@maquina1.umag.cl> (^[a-k][^@]*)<@maquina1.umag.cl.>
Kmaquina2 regex -s1 -a<@maquina2.umag.cl.> (^[^a-k][^@]*)<@maquina2.umag.cl.>

Ok, esto debe estar en cada maquina y se debe agregar manualmente una vez que tenemos nuestro sendmail ya configurado y funcionando como normalmente lo hacemos.
Una vez hecho esto probamos enviar correo a una cuenta desde una de nuestras maquinas o desde otra maquina.
[root@otra_maquina mail]# sendmail -v pedrito@mail.midominio.cl

Si hemos hecho todo bien llegara sin problemas y estamos listos para seguir con lo siguiente que son los clientes. No es mala idea ver los logs para detectar que realmente lo esta haciendo bien (o si hay algún problema), solo hay dos casos:
  • enviamos correo a pedrito y el round-robin dns nos direcciona justo a maquina2(nada que hacer, la cuenta esta ahí!).
  • enviamos correo a pedrito y el round-robin nos direcciona a maquina1, ahí nuestra RuleSet del sendmail debería deliberar a la otra maquina.

3.- Enviamos y recibimos correo sin problemas por lo que ahora debemos preocuparnos de nuestros "queridos" clientes. Existe un programita que se llama perdition que sirve para que nuestros clientes pop/imap se conecten a nuestro server con su MUA favorito, el rpm lo encontramos aquí: http://www.vergenet.net/linux/perdition/, está también para debian y fedora, por supuesto también está el tar.gz. Bueno este programita necesita de otros rpms pero esta todo en esa Web, cuando hice rpm -ivh perdition-1.15-1.fr.c.1.src.rpm me escupió que necesitaba un rpm vannessa_[adt && logger && socket], Creo que son cuatro paquetes en total, no lo recuerdo, pero todos están en la URL esa.
Una vez que instalamos el perdition configuramos esto (en todas las maquinas que sirven a nuestro dominio):

  • Nos vamos a su directorio /etc/perdition y hacemos:
    [root@server perdition]# cp perdition.conf perdition.pop3.conf
    [root@server perdition]# cp perdition.conf perdition.imap4.conf
    [root@server perdition]#
    

    Por defecto el archivo perdition.conf tiene todas sus lineas comentadas, al hacer una copia de perdition.conf a perdition.pop3.conf estamos creando el archivo de configuración para clientes pop, lo mismo sucede con perdition.imap4.conf, servirá para clientes imap, si estos archivos no existen perdition leerá su archivo por defecto: perdition.conf.
  • Ahora editamos los archivos y debemos descomentar ciertas lineas y agregar una. Cada protocolo escucha en un puerto diferente, editamos el archivo perdition.pop3.conf y descomentamos la linea listen_port 7777, map_library_opt /etc/perdition/popmap.re y agregamos la siguiente: M /usr/lib/libperditiondb_posix_regex.so.0.0.0, por lo que parte de nuestro archivo quedará así:
    perdition.pop3.conf:
    # l|listen_port PORT_NUMBER|PORT_NAME:
    # Port to listen on.
    # (default "protocol dependent")
    #l 7777
    listen_port 1100
    
    # login_disabled
    # Do not allow users to log in.
    #login_disabled
    
    # lower_case STATE[,STATE...]:
    # Convert usernames to lower case according the 
    # locale in given state(s).
    # (default "")
    #lower_case servername_lookup
    
    # M|map_library FILENAME:
    # Library to open that provides functions to look 
    # up the server for a user.
    M /usr/lib/libperditiondb_posix_regex.so.0.0.0
    # map_library /usr/lib/libperditiondb_gdbm.so
    # map_library ""
    
    # m|map_library_opt STRING:
    # String option for the map_library.
    # (default "")
    #m /etc/perdition/popmap.re
    map_library_opt /etc/perdition/popmap.re
    #map_library_opt ""
    

    perdition.imap4.conf:
    # l|listen_port PORT_NUMBER|PORT_NAME:
    # Port to listen on.
    # (default "protocol dependent")
    #l 7777
    listen_port 1430
    
    # login_disabled
    # Do not allow users to log in.
    #login_disabled
    
    # lower_case STATE[,STATE...]:
    # Convert usernames to lower case according the 
    # locale in given state(s).
    # (default "")
    #lower_case servername_lookup
    
    # M|map_library FILENAME:
    # Library to open that provides functions to look 
    # up the server for a user.
    M /usr/lib/libperditiondb_posix_regex.so.0.0.0
    # map_library /usr/lib/libperditiondb_gdbm.so
    # map_library ""
    
    # m|map_library_opt STRING:
    # String option for the map_library.
    # (default "")
    #m /etc/perdition/popmap.re
    map_library_opt /etc/perdition/popmap.re
    #map_library_opt ""
    

    Ok, si quieren mas detalles de cada una de las lineas descomentadas consulten la documentación del perdition, pero no es tan difícil de entender:
    listen_port [0-9]+, puerto por el cual va a escuchar peticiones de clientes
    M /usr/lib/libperditiondb_posix_regex.so.0.0.0, una librería necesaria para nuestra configuración
    map_library_opt /etc/perdition/popmap.re, aquí estarán las expresiones regulares para que nuestro servicio pueda discriminar donde re-enviar la petición de conexión.
  • Finalmente editamos el archivo popmap.re y agregamos nuestras conocidas reglas, quedará de la siguiente manera(suponiendo que tenemos dos maquinas):
    En maquina1:
    ^[a-k]: localhost
    ^[^a-k]: maquina2.midominio.cl
    
    En maquina2:
    ^[a-k]: maquina1.midominio.cl
    ^[^a-k]: localhost
    

    Por ejemplo, en maquina2 veríamos esto:
    [root@maquina2 perdition]# cat popmap.re
    #########################################
    # popmap.re
    #
    # Example popmap.re
    # Format: [:] 
    #
    # A single colon _may_ follow a regular_expression Some ammout of white
    # space must follow this colon or the regular_expression if the colon is
    # omitted. Blank lines are ignored, as is anything including and after a #
    # (hash) on a line. If a \ precedes a new line then the lines will be
    # concatenated. If a \ precedes any other character, including a # (hash)
    # it will be treated as a literal. Anything inside single quotes (') will
    # be treated as a litreal. Anything other than a (') inside double quotes
    # (") will be treated as a litreal. Whitespace in a regular_expression must
    # be escaped or quoted. Whitespace in a substitution need not be escaped or
    # quoted.
    #
    # Regular expressions are extended POSIX variety.
    # There is no implcit ^ or $ around the regular expressions.
    #
    # Substitution is of the form
    # [][:]
    #
    # Backreferences may be used by inserting $n in the substitution
    # where n is in the range 1 .. 9.
    #
    # The regular expressions are serached in order, and the first
    # matching regular expression is used.
    #
    #########################################
    
    ^[a-k]: maquina1.midominio.cl
    ^[^a-k]: localhost
    #^user: user2@localhost
    #(.*)@(.*): $1_$2@localhost
    [root@maquina2.midominio.cl perdition]#
    

Ok, si el servicio no estaba arriba lo levantamos:
/etc/init.d/perdition start.

Ahora podemos configurar un cliente pop o imap, entonces nuestro usuario sera pedrito, su servidor de correo entrante sera mail.midominio.cl, su servidor de correo saliente sera el mismo, el puerto smtp sera el 25 pero el pop3 sera 1100 y el imap sera 1430.

Para el caso de un webmail el cuento lo crea uno, en mi caso como uso squirrelmail tengo una maquina exclusiva para recibir las peticiones de los clientes, entonces la idea inicial era tener una base de datos con los clientes y sus respectivas maquinas, y de acuerdo a ello elegía como server imap una u otra maquina, pero esto requería que tenga por cada maquina el puerto 80 arriba y un squirrelmail arriba, entonces lo único que se hacia era hacer una redirección de servidor según sea el cliente, fácil, un código en php con una conexión a una BD en lo que sea y listo. Pero mejor es tener mis maquinitas solamente escuchando por el 143 y bajar el 80 y nada de webmail en cada maquina, pero esta idea requiere que meta mis "manitos" en el código fuente, para que de esa manera tenga una maquina front-end con webmail, y esta se conecte de acuerdo al usuario por el puerto 143 ya sea a la maquina1 o a la maquina2. Entonces lo que hice fue poner un simple if antes que hiciera la conexión:

if (preg_match("/^[a-k]/i", $login_username, $nada)){
$imapServerAddress="maquina1.midominio.cl";
}else{
$imapServerAddress="localhost";
}

y listo!.

Bueno, este es solo el principio, aun falta temitas como LDAP, SSL... pero con el tiempo espero que esto vaya mejorando. seria bueno que sigamos investigando y mejoraramos esto porque realmente es una solución muy escalable y barata.

Gracias Muchachos. Atte Makko.


Si algún lector quiere completar este artículo o bien encuentra algún fallo en él, puede pasar por el canal de sugerencias de la web.