El escenario es el siguiente: Tenemos una cuenta de correos en G-SUITE con 5 cuentas de correo pagadas, pero la organizacion desea que bajo este mismo dominio se creen mas buzones pero NO en Gsuite, si no en un servidor mas barato (Zimbra), por lo que compartiriamos un dominio en 2 servidores de correo distintos. Mi escenario seria el siguiente:
Dominio: midominio.pe
Cuentas en Gsuite: 5 cuentas con el dominio @midominio.pe (usuario1@midominio.pe , usuario2@midominio.pe , usuario3@midominio.pe , usuario4@midominio.pe , usuario5@midominio.pe)
Cuentas en otro Servidor (Cualquiera): para mi ejemplo ZIMBRA 8.9.9 (usuario6@midominio.pe ….usuario20@midominio.pe)
Flujo de correo 1
1.- Cuando se envia un correo desde internet o desde el mismo Gmail (cualquiera de las 5 cuentas) hacia el dominio midominio.pe, primero llega al servidor de G-suite
2.- G-suite evalua si el buzon esta dentro de su servidor.
3.- Si el buzon esta dentro de su servidor, entrega el correo y acaba la secuencia.
4.- Si el buzon no esta en Gmail (cualquiera de las 5 cuentas pagadas), esta debería hacer un relay al servidor especificado (Zimbra para mi ejemplo).
5.- Si Zimbra encuentra el buzón, el mensaje es entregado, caso contario este servidor avisa a GMAIL que el buzon no existe, y Gmail avisa al destinatario que no existe ese buzón.
Flujo de correo 2
1.- El correo es enviado desde una cuenta local de zimbra. ( usuario6@midominio.pe ….usuario20@midominio.pe )
2.- Zimbra evalua si la cuenta esta dentro de sus buzones. Si esta entrega el correo y acaba.
3.- Si no esta el buzon en zimbra, lo envia hacia G-suite, G-Suite evalua si lo tiene dentro de sus buzones, si lo tiene lo entrega, caso contrario lo vuelve a enviar a Zimbra (Cuidado, aqui ya esta haciendo loop indeterminado)
4.- Zimbra lo recibe y evalua de nuevo si la cuenta esta dentro de sus buzones, si no lo encuentra, debe rechazar el correo y finalizar
Si nos damos cuenta, si no tenemos cuidado, en la configuración, al no existir una cuenta en ninguno de los servidores, podriamos hacer un loop indeterminado y terminar siendo bloqueados por G-Suite (Aplicar :
https://wiki.zimbra.com/wiki/Split_Domain ) La configuracion personalizada lo haremos mas adelante, pues para la versión 8.9.9 no funcionaba.
Asumimos lo siguiente:
- Tu ya tienes comprado una cuenta en G-Suite con al menos un buzon de Pago.
- Tu ya tienes un servidor de correos, ya sea propio como Zimbra o comprado en alguna plataforma virtual como Rackspace, 1and1.com, etc.
- El servidor primario de correos será G-Suite
- El servidor secundario es Zimbra.
Recepcion de Correos
Paso 1.- Crear el dominio y las cuentas de correos necesarias en un servidor distinto al de G-Suite (el dominio debe ser igual al que tenemos en G-Suite). No detallo los pasos de como crear cuentas de usuarios pues es demasiado obvio que lo sabes hacer Creamos cuentas: usuario1@midominio.pe , usuario2@midominio.pe , usuario3@midominio.pe , usuario4@midominio.pe , usuario5@midominio.pe .
Paso 2.- Configurar G-Suite para ruteo hacia los servidores secundarios (https://support.google.com/a/answer/2685650?hl=en)
- Ingresar y Loguear, https://admin.google.com/AdminHome?hl=en&fral=1
- Ir a Apps/G-Suite/GMail/Advance Setiings




Paso 2.- Configurar el routeo

Paso 3.- Configurar Reenvio hacia otro servidor, si no posee el buzon dentro de G-Suite



Probar el envio y repecion del correo.
Hasta este punto, lo que hemos echo, es decirle a G-Suite: Si no encuentras el buzon de destino dentro de tus cuentas, reenvialo hacia el “Servidor Reenvio” y busca alli.
Envio de Correos desde Zimbra a G-Suite
https://support.google.com/a/answer/2956491
Paso 1.- Activar Almacenamiento completo

Paso 2.- Configurar El servicio SMTP Relay de Google

En este paso le estamos diciendo a G-Suite, que acepte todo el correo proveniente de mi servidor Zimbra (Mi servidor es de confianza) y que solo acepte correos de mi dominio.
Paso 3: Redirigir el servidor de correo saliente local de Zimbra a Google (Zimbra como correo secundario)
Modificaremos algunas variables de zimbra para hacer que los correos dirigidos hacia su propio dominio y que no exista en su directorio sean derivadas hacia G-Suite.
1.- Ejecutar estos comandos como usuario zimbra
En los codigos que pongo al final elminar la etiqueta <br>, parece que el nuevo editor de wordpress lo colaca al final
#su - zimbra <br>$ zmprov md midominio.pe zimbraMailCatchAllAddress @midominio.pe<br>$ zmprov md midominio.pe zimbraMailCatchAllForwardingAddress @midominio.pe<br>$ zmprov md midominio.pe zimbraMailTransport smtp:[smtp-relay.gmail.com]:25
Nota: En las pruebas que yo hice, no funcionaba con ese servidor ([smtp-relay.gmail.com]:25) por lo que tenemos varias opciones de configuracion. En mi caso la ultima linea quedó así:
$zmprov md midominio.pe zimbraMailTransport smtp:[aspmx.l.google.com]:25
Configuración en Zimbra para evitar un loop indeterminado al no encontrar una cuenta de correo
Hasta aqui el sistema funcionará a la perfección si las cuentas de correo existen en uno o el otro servidor, pero pongamonos en un escenario en el que alguien (interno o externo) envia a un correo a una direccion de correo que no existe en ninguno de los servidores.
Lo que sucederá es lo siguiente:
- El correo llega a G-mail, este lo evalua y no existe dentro de su lista de buzones, entonces lo deriva al servidor de Zimbra.
- El servidor de Zimbra lo recibe y evalua si existe la cuenta dentro de sus buzones, como no existe lo vuelve a enviar a G-mail.
- G- mail lo evalua y no existe dentro de su lista de buzones, entonces lo deriva al servidor de Zimbra.
- El servidor de Zimbra lo recibe y evalua si existe la cuenta dentro de sus buzones, como no existe lo vuelve a enviar a G-mail.
- Loooooooooooooooooop
Por lo tanto ese correo se mantendra dando infinitas vueltas hasta que posiblemente G-suite invalide tu servidor de correos y ya no te permita seguir enviando correos.
Solución
El protocolo SMTP es lineal, por lo tanto hay que indicarle lo siguiente:
- Quien es el Servidor principal y quien es el servidor secundario.
- El servidor secundario es el que corta el loop al momento de detectar que el buzon no le perteneze Y viene del servidor primario (En mi caso G-suite)
Para indicar quien es el servidor primario, basta con registrar en el servidor DNS de nuestro proveedor y darle como peso “preferencial” el valor 1 o 5 al servidor primario, Para el servidor secundario se tiene que registrar en el servidor DNS de nuestro proveedor y darle como peso 10 ó 20 ó 50
En mi caso quedo así registrado

Configuración en Zimbra para cortar el loop https://wiki.zimbra.com/wiki/Split_Domain#Avoiding_Loops_in_Delivery
Paso 1.- Modificar el archivo smtpd_recipient_restriction
Sacar una copia del archivo antes de modificarlo.
#su - zimbra
$cp /opt/zimbra/conf/zmconfigd/smtpd_recipient_restrictions.cf /opt/zimbra/conf/zmconfigd/smtpd_recipient_restrictions.original <br>
Modificar el archivo: smtpd_recipient_restrictions.cf
nano /opt/zimbra/conf/zmconfigd/smtpd_recipient_restrictions.cf
deberia quedar asi:
%%contains VAR:zimbraServiceEnabled cbpolicyd^ check_policy_service inet:localhost:%%zimbraCBPolicydBindPort%%%%<br> reject_non_fqdn_recipient<br> permit_sasl_authenticated<br> permit_mynetworks<br> reject_unlisted_recipient<br> %%contains VAR:zimbraMtaRestriction reject_invalid_helo_hostname%%<br> %%contains VAR:zimbraMtaRestriction reject_non_fqdn_helo_hostname%%<br> %%contains VAR:zimbraMtaRestriction reject_non_fqdn_sender%%<br> %%contains VAR:zimbraMtaRestriction reject_unknown_client_hostname%%<br> %%contains VAR:zimbraMtaRestriction reject_unknown_reverse_client_hostname%%<br> %%contains VAR:zimbraMtaRestriction reject_unknown_helo_hostname%%<br> %%contains VAR:zimbraMtaRestriction reject_unknown_sender_domain%%<br> %%explode reject_rbl_client VAR:zimbraMtaRestrictionRBLs%%<br> %%explode reject_rhsbl_client VAR:zimbraMtaRestrictionRHSBLCs%%<br> %%explode reject_rhsbl_reverse_client VAR:zimbraMtaRestrictionRHSBLRCs%%<br> %%explode reject_rhsbl_sender VAR:zimbraMtaRestrictionRHSBLSs%%<br> %%contains VAR:zimbraMtaRestriction check_policy_service unix:private/policy%%<br> %%contains VAR:zimbraMtaRestriction check_recipient_access ldap:/opt/zimbra/conf/ldap-emails.cf%%<br> %%contains VAR:zimbraMtaRestriction reject%%<br> permit
Vamos crear un archivo en llamado “ldap-emails.cf” que es el que hara las validaciones
Ese archivo viene de la copia otro archivo llamado ” ldap-vam.cf “
$cp /opt/zimbra/conf/ldap-vam.cf /opt/zimbra/conf/ldap-emails.cf<br>
Configuramos el archivo:
$nano /opt/zimbra/conf/ldap-emails.cf<br>
server_host = ldap://mail.midominio.pe:389<br> server_port = 389<br> search_base =<br> query_filter = (&(|(zimbraMailDeliveryAddress=%s)(zimbraMailAlias=%s)(zimbraMailCatchAllAddress=%s))(zimbraMailStatus=enabled))<br> result_attribute = zimbraMailDeliveryAddress,zimbraMailForwardingAddress,zimbraPrefMailForwardingAddress<br> result_filter = permit<br> version = 3<br> start_tls = yes<br> tls_ca_cert_dir = /opt/zimbra/conf/ca<br> bind = yes<br> bind_dn = uid=zmpostfix,cn=appaccts,cn=zimbra<br> bind_pw = 0oms74zhrq<br> timeout = 30<br> special_result_attribute = member
OJO: en TODAS las documentaciones que he revisado, tienen como valor “OK” a la variable “result_filter”, en la version que yo trabajo Zimbra 8.9.9 NO funciona, da errores estuve muchos dias sin salir de ese tema. Por lo que deben poner el valor “permit”. con eso si funcionó.
Finalmente adicionar las variables creadas a las reglas de Zimbra
$zmprov mcf +zimbraMtaRestriction "check_recipient_access ldap:/opt/zimbra/conf/ldap-emails.cf"
$ zmprov mcf +zimbraMtaRestriction reject
Reiniciar Zimbra con el comando ZMCONTROL y LISTO
$zmcontrol restart
Eso es todo. Martin Lugo Palmadera
Referencias:
https://wiki.zimbra.com/wiki/Split_Domain
https://wiki.zimbra.com/wiki/Relay_per_Domain
http://efensys.blogspot.com/2012/01/avoiding-mail-looping-in-split-domain.html
Agregue un comentario