[LUG.ro] problema de loopback en postfix + ldap + mailHost

x-ip lugro@lugro.org.ar
Mon, 31 Jul 2006 19:50:33 -0300


Buenas, consultando un problemilla que me viene volviendo loco.

Detalles:
---------

Tengo 3 servidores postfix 2.0 filtrando el correo de la mano de
amavis, clamav y spamassassin con el paquete courier-maildrop,
courier-imap, courier-pop, courier-authdaemon.

Llamemosle gauss, euler y pi. Estos servidores son de la empresa y
dominio example.com. Estos servidores atienden las peticiones de los
usuarios unix:passwd ( con relay local ) y cuando no encuentran como
usuarios locales los recipientes, se fijan en openldap para encontrar
donde rutear los emails.

El esquema del árbol de ldap es el siguiente:

dc=example,dc=com
|
-->ou=mailserver,dc=example,dc=com
   |
   -->ou=pi,ou=mailserver,dc=example,dc=com
   |  |
   |  -->ou=people,ou=pi,ou=mailserver,dc=example,dc=com
   |
   |
   -->ou=gauss,ou=mailserver,dc=example,dc=com
   |  |
   |  -->ou=people,ou=gauss,ou=mailserver,dc=example,dc=com
   |
   |
   -->ou=euler,ou=mailserver,dc=example,dc=com
     |
     -->ou=people,ou=euler,ou=mailserver,dc=example,dc=com

En cada people se encuentran el atributo mailHost, mail,
mailLocalAddress los cuales contienen la casilla de email de cada
usuario y mailHost la ip del host que tiene el mailbox del usuario (en
caso de que sea necesario rutear el email).
En ldap estoy utilizando misc.schema y sendmail.schema los cuales me
permiten tener los atributos anteriormente mencionados.

Un diagrama de como se encuentran los servidores:

                                   __ euler
--> internet --> pi --> o -|           |
                                   --- gauss

Con esto quiero decir que dentro del dominio example.com, si
usuario1@euler envia correo a usuario2@euler debe ser tratado con
relay local. Si usuario1@euler envia correo a usuario1@gauss, el email
debe ir directamente a gauss, sin tener que pasar por pi. Si
usuario1@euler envia un email fuera del dominio example.com, el email
deberá ser enviado por smarthost a pi, y pi deberá encargarse de
enviarlo al exterior. Si hay respuesta para el email enviado por
usuario1@euler desde el exterior, pi deberá enviarlo a euler.

Para ello como bien dije, utilizo postfix con ldap que me permite
hacer esto. Pequeño detalle olvido mencionar:

Pi es el servidor master ldap y euler y gauss son servidores slaves
ldap. Con lo cual se cargan todos los datos en pi, y pi replica a
euler y gauss. Como verán en los siguientes archivos de configuración
que les adjuntaré, este esquema me ha presentado el siguiente
problema:

Cuando envio un email desde un usuario de pi a un usuario de euler,
postfix busca en el ldap, encuentra la ip del host que pertenece al
usuario destino y delivera el mail correctamente. Ahora, si envio un
email desde un usuario local a otro usuario local, noto que postfix
encuentra al otro usuario local en el ldap, y delivera el correo como
si fuera otro host (utilizando la ip pública del host local, la cual
está asignada en el ldap). Esto provoca que postfix le ponga un bounce
al email y no llegue.

#cuando amavis reiyecta el email a postfix
Jul 31 19:26:57 pi postfix/smtp[9870]: 8276711FC3: to=<batman@example.com>,
relay=127.0.0.1[127.0.0.1], delay=19, status=sent (250 2.6.0 Ok, id=09227-03, fr
om MTA([127.0.0.1]:10025): 250 Ok: queued as 0C7B011FC6)
Jul 31 19:26:57 pi postfix/qmgr[9853]: 8276711FC3: removed
#vemos como postfix trata al usuario batman con el atributo mailHost
en lugar de reconocerlo
#como usuario local que és y hacer relay local. Osea, lo busca en el
ldap en lugar de
#encontrarlo en /etc/passwd y reconocerlo como local.
Jul 31 19:26:57 pi postfix/smtp[9874]: 0C7B011FC6: to=<batman@example.com>,
relay=none, delay=0, status=bounced (mail for 64.30.80.118 loops back to myself
)

Bien, dicho todo esto, mi pregunta y solución a este problema. Como
puedo lograr que postfix entregue correctamente los emails a los
usuarios locales ?
Se me ocurre que con query_filter podría utilizar mail y
mailLocalAddress para hacerle distinguir a postfix como tratar el
email.
Ejemplo:
mail=user1@example.com
mailLocalAddress=user1@pi.example.com
Si el postfix del servidor pi encuentra que la cuenta
user1@example.com (mail) tiene como
mailLocalAddress=user1@pi.example.com, devolver el valor null en la
busqueda, y según leí en la documentación, postfix al obtener null
debería tratar de hacer relay local.
No estoy seguro y no sé como hacerle distinguir esto con query_filter.
En fin, les adjunto los archivos de configuración main.cf, ldap-aliases.cf


main.cf :

#####////////////////////////////////////////// p o s t f i x  p r 0 //\
#####################################################///////////////////
#////// a n t i v i r u s -->>>>>>>>>>>>>>>>>>>>>>>>>>>>///////////////

content_filter = smtp-amavis:[127.0.0.1]:10024

##\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# c o n t i n u e -->

myorigin = /etc/mailname2
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no

# Oh!, plz configure me, fucktard h4x0r! ^^
###############################################///////////////////////
#//////////////////////////// n e x t -->

myhostname = pi.example.com
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf
alias_database = hash:/etc/aliases
myorigin = /etc/mailname2
mydestination = localhost, example.com
relayhost =
relay_domains = $mydestination
mynetworks = 127.0.0.0/8
mailbox_command = /usr/bin/maildrop
home_mailbox = Maildir/
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
transport_maps = ldap:/etc/postfix/ldap-aliases.cf


ldap-aliases.cf:

#/////// m ai l  r ou ti ng /////
#////////////////////////------/
server_host = 127.0.0.1
server_port = 389
search_base = ou=mailserver,dc=example,dc=com
query_filter = (&(mail=%s)(mailLocalAddress=%s))
result_attribute = mailHost
result_format = smtp:[%s]


Espero haber podido dar detalles del problema que tengo. Desde ya les
agradesco su atención, me despido expectante por una solución,
Emiliano.