7 votos

Servicios de correo del servidor Mac OS X y notificaciones push para dispositivos iOS

  • Estoy ejecutando OS X 10.9 con Server 3.0.1 en un Mac que reside en una subred privada situada detrás de un router cuyo puerto WAN está conectado a un módem por cable, de ahí que el ISP sea un conocido proveedor de servicios de Internet por cable.

  • Este servidor tiene sus DNS correctamente configurados (es decir, el resultado de "sudo changeip -checkhostname" en el servidor a través de la línea de comandos arroja resultados perfectos).

  • Este servidor está ejecutando un Open Directory Master.

  • El DNS dinámico está correctamente configurado para el router, y resuelve la dirección IP pública asignada por mi ISP al mismo nombre de dominio que el servidor (reenvío los puertos necesarios para los servicios que ejecuto).

  • Este servidor también tiene instalado un certificado de servidor firmado por una CA de confianza (es decir, Go Daddy) y funciona perfectamente para todos los servicios de OS X Server, incluido Open Directory.

  • Este servidor también tiene configurado el servicio de Correo (SMTP e IMAP) sin problemas (puedo enviar y recibir correo a/desde el servidor.

  • Este servidor también tiene activadas las notificaciones push y tiene perfectamente instalado un certificado de notificaciones push (obtenido del portal de certificados de notificaciones push de Apple, recién renovado hace unos días).

  • Tengo algunos dispositivos iOS con iOS 7.0.4. He configurado Mail en estos dispositivos iOS para enviar y recibir correo a/desde el servidor mencionado para algunas cuentas de usuario diferentes en el servidor. Esto funciona bien (probado, puede enviar y recibir correo sin problemas).

  • Los ajustes de correo de los dispositivos iOS mencionados para el servidor mencionado se han configurado para recibir notificaciones push cuando se reciba correo a dichas cuentas de usuario en el servidor.

Dicho todo esto, los dispositivos iOS son a veces recibir notificaciones push del Servicio de notificaciones push de Apple (APNS "nube") en situaciones en las que los dispositivos iOS residen en la misma subred privada que el servidor Mac (a través de Wi-Fi), y cuando residen en la Internet pública (a través de redes de datos celulares o redes Wi-Fi públicas como cafeterías).

Así, las notificaciones push do funcionan cuando se reciben mensajes de correo en el servidor, pero no siempre. Una vez transcurrido un periodo de tiempo en el servidor en el que no se han recibido mensajes de correo electrónico (parece ser de varias horas, pero aún no he podido precisarlo), el servidor pierde aparentemente lo que se supone que es un persistente conexión con la pasarela APNS. Lamentablemente, OS X Server no registra cuándo se pierde esta conexión. Entonces, cuando un nuevo mensaje de correo electrónico finalmente llega de nuevo después de varias horas y es recibido por el servidor, los dispositivos iOS hacen no reciben las notificaciones push esperadas y, en su lugar, OS X Server registra sistemáticamente un mensaje de error como éste (las únicas diferencias son, por supuesto, el ID del proceso y la marca de fecha y hora):

11/26/13 5:48:11.762 AM push_notify[181]: stream: received error: The operation couldn’t be completed. Connection reset by peer on: incoming stream: APN to host: gateway.push.apple.com:2195

Una vez que el tipo de error anterior se registra en los registros, un mensaje de correo electrónico posterior enviado al servidor genera correctamente un mensaje de notificación push en los dispositivos iOS configurados siempre que el mensaje posterior se envíe antes de que transcurra un tiempo mínimo (es decir, varias horas). No reenvío los puertos 2195 o 2196 desde el router al servidor Mac porque Apple documento de apoyo implica que estos puertos son para el tráfico saliente (del servidor a la pasarela APNS) a menos que lo haya entendido mal.

Un extracto de la nota técnica TN2265 de la Mac Developer Library de Apple me llamó la atención con respecto a inactivo :

Una desconexión ocasional mientras su proveedor está inactivo es n restablecer la conexión y continuar. Si uno uno de los servidores push está caído, el mecanismo de equilibrio de carga dirigirá de forma transparente su nueva conexión a otro servidor suponiendo que que te conectas por nombre de host y no por dirección IP estática.

¿Está OS X Server (el "proveedor" en este contexto) esencialmente "continuando" al "restablecer" la conexión con APNS después de haber estado "inactivo" durante varias horas, como se observa en los registros por el error de flujo antes mencionado?

Una persona con la que hablé de esto me dijo que los problemas anteriores podían deberse a que mi ISP no había asignado una dirección IP estática al puerto WAN del router, pero en toda la documentación para desarrolladores y de soporte de Apple que he consultado sobre las notificaciones push con OS X Server no se indica que sea necesaria una dirección IP estática.

nota: También he probado esto con el mismo hardware y configuración, pero ejecutando OS X 10.8.5 Mountain Lion con Server app 2.2.1 con esencialmente los mismos resultados, pero IMHO mejor verbosidad de registro, como en:

11/29/13 11:16:55.713 PM push_notify[11951]: stream: received error: The operation couldn’t be completed. Connection reset by peer on: incoming stream: APN to host: gateway.push.apple.com:2195

11/29/13 11:16:55.722 PM push_notify[11951]: Disconnected from apn server gateway.push.apple.com for topic com.apple.mail.XServer.2a132c32-dda4-45a1-68e1-b3cca3865c12: error Connection reset by peer

11/29/13 11:16:55.722 PM push_notify[11951]: will attempt to reconnect stream APN to host gateway.push.apple.com:2195 in 15 seconds

Cualquier ayuda o sugerencia para resolver esto sería muy apreciada, puede ser algo simple que he pasado por alto.

1voto

Cameron Puntos 1371

Este problema se ha resuelto. El router ASUS "Dark Knight" que estaba proporcionando la LAN privada (NAT) y el reenvío de puertos al Mac que ejecuta OS X Server tiene un error de firmware. El error se manifiesta por la CAÍDA de la conexión TCP ESTABLECIDA en el puerto 2195 entre el Mac que ejecuta OS X Server y APNS, después de dos horas de inactividad. El router no debería haber caído esta conexión, no había ninguna regla de firewall que le ordenara hacerlo. La lección aprendida es que hay que ser mucho más selectivo y prudente a la hora de elegir los routers (especialmente los de consumo) para su uso con servidores, incluso para los que se ejecutan en un contexto de pequeña empresa (como un Mac Mini Server).

Rúbrica

0voto

Tony Williams Puntos 4903

Mis primeros pasos en el diagnóstico serían reenviar esos dos puertos y ver qué pasa (incluso podría poner la máquina en una DMZ durante un par de horas).

Entonces pondría un sniffer de paquetes en el bloque de direcciones 17.0.0.0/8 y vería qué tráfico en qué puertos está atravesando la red cuando funciona y cuando no.

0voto

Dom Puntos 646

Creo que @user3051849 tiene la causa root, pero en mi caso no puedo cambiar el router. Así que adjunto mis dos soluciones. A partir de OSX Server 3.1.2 este problema persiste.

Utiliza launchctl de Apple para crear una tarea que se ejecute cada 2 horas para reiniciar el servidor de correo. Por lo tanto, esto sólo debe utilizarse en servidores de correo que no estén ocupados. Cree un archivo plist en /Library/LaunchDaemons/MailRestart.plist, el contenido debe ser:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>mailrestart</string>
    <key>ProgramArguments</key>
    <array>
        <string>/etc/periodic/daily/500.restart-mail</string>
    </array>
    <key>StartInterval</key>
    <integer>7200</integer> <!-- Every 2 hours -->
    <key>StandardOutPath</key>
    <string>/var/log/daily.out</string>
</dict>
</plist>

Tenga en cuenta que este agente de lanzamiento ejecuta el /etc/periodic/daily/500.restart-mail script cada 2 horas (7200 segundos). En caso de que Apple elimine el correo de reinicio script, aquí hay un copia para su comodidad.

Como apunte, parece que Apple es consciente de los problemas de conexión con su servicio push, ya que crearon el script periódico para reiniciar el servidor de correo durante la ejecución diaria del periodic servicio. Sin embargo, su solución es bastante débil, porque en mi caso el servicio periódico se ejecuta diariamente, pero mi conexión con el servicio push se corta después de 2 horas de inactividad. Por lo tanto, necesito algo más frecuente que un reinicio diario del servidor de correo.

Siguiente desde una invocación shell:

sudo launchctl load /Library/LaunchDaemons/MailRestart.plist

Este comando carga el script en el servicio Launch Control haciendo que el script se ejecute cada 2 horas, registrándose en /var/log/daily.out (el mismo destino en el que se registra el servicio periódico). En mi caso necesitaba cambiar esto a menos de una hora, en lugar de cada 2.

Un enfoque mejor Una solución alternativa es dejar solo el demonio de correo y matar el proceso que gestiona las notificaciones push, es decir, push_notify. Esto tiene el beneficio añadido de no matar a los demonios de correo que pueden interrumpir las conexiones imap. Por ejemplo, el comando:

sudo launchctl stop com.apple.push_notify

Detiene el servicio push_notify, launchd reinicia inmediatamente el servicio después. Así, el nuevo proceso tendrá una conexión fresca a los servidores de notificación de Apple. Dejaré como ejercicio al lector envolver lo anterior en un script e invocarlo desde un plist modificado como arriba.

0voto

Cameron Puntos 1371

En un principio, enviamos un informe de error sobre este problema a Apple (en aquel momento no estábamos seguros de que se tratara de un error, pero teniendo en cuenta los esfuerzos que hicimos para resolverlo con el soporte de Apple Enterprise, parecía probable que se tratara de un error). Recientemente, el departamento de ingeniería de Apple nos ha respondido afirmando que han intentado solucionar este error en la versión 4 de la aplicación Server. Server 4 requiere ser ejecutado en OS X 10.10 Yosemite. Hemos probado con Server 4.0.3 ejecutándose en OS X 10.10.2 Yosemite con dos iPhones cada uno ejecutando iOS 8.1.3 y nuestro router sigue siendo un Ubiquiti EdgeRouter (sin cambios en la configuración del router). Para versiones anteriores de Server, suponiendo que este error sigue sin corregirse en esas versiones, la solución ofrecida por Josh puede ser su mejor mejor.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X