El caso del correo de las 500 millas

Todo el mundo ha sufrido alguna vez algún fallo provocado por hardware defectuoso o algún bug en el software. Pero a veces ocurren casos en los que un fallo provoca situaciones absurdas.

La historia del correo de las 500 millas se remonta al año 2002 y viene  de un administrador de sistemas que mantenía el servicio de correo electrónico de una universidad:

Os presento un problema que «sonaba» imposible… Casi me arrepiento de publicar la historia porque es un relato para ser contado entre bebidas en una conferencia. La historia se ha alterado ligeramente para proteger al culpable, para obviar detalles aburridos y sin importancia y para hacer el asunto más interesante.

Trabajaba manteniendo el sistema de correo electrónico del campus hace algunos años cuando recibí una llamada del jefe del departamento de estadística:

– Estamos teniendo problemas cuando enviamos correo electrónico fuera del departamento.

– ¿Cual es el problema?- Pregunté.

– No podemos enviar correo a más de 500 millas- explicó el jefe de departamento.

Me atraganté con el café -¿Puedes repetir?

– No podemos enviar correo a más de 500 millas de aquí- repitió, -en realidad a un poco más. Digamos a 520 millas. Pero no más.

– Um… el correo electrónico en realidad no funciona así- dije intentando mantener la calma. Uno no muestra pánico cuando habla con un jefe de departamento, incluso  si es de un departamento pequeño como el de estadística. -¿Qué te hace pensar que no puedes enviar correos a más de 500 millas?.

– No es lo que yo «crea»- respondió mosqueado, -mira, nos dimos cuenta por primera vez hace unos días.

– ¿Habéis esperado unos DÍAS?- interrumpí con voz temblorosa, -¿y no habéis podido enviar correo durante todo este tiempo?

– Podíamos enviar correo, sólo que no a más de…

– …500 millas, sí- terminé por él,  -lo pillo. Pero ¿por qué no habéis llamado antes?

– Bien, no habíamos recopilado suficientes datos para estar seguros qué estaba ocurriendo hasta ahora-, se trata del jefe del departamento del «estadística». -En fin, que he preguntado a un geoestadista para que echara un vistazo…

– Un geoestadista…

– Sí y ha hecho un mapa mostrando el radio en el que podemos enviar correo electrónico el cual es algo mayor de 500 millas. Hay algunos destinos dentro de ese radio que tampoco lo reciben o lo hacen sólo a veces pero no podemos enviar correo de ninguna forma a más de este radio.

– Ya veo- dije, y me eché las manos a la cabeza. -¿Cuándo comenzó? Has dicho que hace unos días pero ¿ha cambiado algo en vuestros sistemas en ese tiempo?

– Bueno, el asistente vino, parcheó nuestro servidor y lo reinició. Pero le he llamado y dice que no toco nada en el sistema de correo .

– Vale, déjame que eche un vistazo y ahora te llamo- le dije sin apenas creer que me lo había tomado en serio. No era el día de los inocentes. Intenté recordar si alguien me debía una broma.

Me introduje en el servidor del departamento y envié algunos correos de pruebas. Estábamos en el Research Triangle de Carolina del Norte y no hubo problemas cuando me envié a mi mismo un correo de pruebas. Del mismo modo, envié correos a Richmond, Atlanta y Washington. Otro a Princeton (a 400 millas) que llegó.

Pero luego intenté enviar un correo a Memphis (a 600 millas). No llegó. A Boston tampoco. Ni a Destroit. Cogí mi libreta de direcciones y empecé a enviar correos para reducir el círculo. A Nueva York (a 420 millas) llegó pero a Providence (a 580 millas) no.

Me empecé a preguntar si había perdido el juicio. Intenté enviar un correo electrónico a un amigo que vivía en Carolina del Norte pero cuyo ISP estaba en Seattle. Afortunadamente falló. Si el problema hubiera tenido que ver con la geografía del receptor humano y no de su servidor de correo, creo que habría roto a llorar.

Una vez establecido eso, el problema del que me había informado era cierto y reproducible. Eché un vistazo al archivo sendmail.cf. Parecía normal. De hecho me resultaba familiar.

Lo comparé con el archivo sendmail.cf de mi carpeta personal. No había sido alterado; era un sendmail.cf que yo mismo había escrito. Y estaba bastante seguro que no había habilitado la opción «FALLAR_AL_ENVIAR_A_MAS_DE_500_MILLAS». Perplejo por lo que veía, me metí con Telnet en el puerto SMTP. El servidor respondió con un anuncio sendmail de SunOS.

Espera un momento… ¿un anuncio sendmail de SunOS? En aquella época, Sun proporcionaba Sendmail 5 con su sistema operativo a pesar de que Sendmail 8 era ya un producto bastante maduro. Siendo un buen administrador de sistemas, habría usado Sendmail 8. Y siendo un buen administrador de sistemas, habría escrito un archivo sendmail.cf que hubiera usado las bien documentadas opciones y nombres de variables disponibles para Sendmail 8 en vez de ese críptico código a base de signos de puntuación que se usaba en Sendmail 5.

La piezas empezaban a encajar y de nuevo me atraganté con mi café que ya estaba frío. Cuando el asistente «parcheó el servidor», aparentemente actualizó la versión de SunOS, desactualizando de esa forma Sendmail. La actualización dejó sendmail.cf a pesar de que la versión era incorrecta.

Se da la circunstancia de que Sendmail 5, al menos la versión que daba Sun, tenía algunas modificaciones: podía usar el sendmail.cf de Sendmail 8 ya que la mayoría de las reglas no se modificaron. Excepto las nuevas opciones de configuración, aquellas que veía como chatarra y me saltaba. Y el binario de Sendmail no se había compilado para la mayoría de estas opciones así que cuando encontraba configuraciones inadecuadas en el archivo sendmail.cf, estas se ponían a cero.

Una de las configuraciones que se puso a cero fue el tiempo límite para conectarse a un servidor SMTP remoto. Algunas pruebas establecieron que en esta máquina en particular con su nivel típico de carga, un tiempo límite  de 0 cancelaría una conexión en unos 3 milisegundos.

Una características singular de la red de nuestro campus en aquella época era que estaba completamente interconectada con switches. Un paquete saliente no podía incurrir en un retraso del router hasta que llegara al POP y alcanzara el router de la otra parte. Así que el tiempo de conexión a un host remoto con una carga ligera en una red cercana dependería en gran parte de la velocidad de la luz en vez de los retrasos del router.

Mientras me sentía un poco mareado, escribí en mi consola:
$ units
1311 units, 63 prefixes

Tienes: 3 milisegundos-luz
Quieres: millas
        * 558.84719
        / 0.0017893979

«500 millas, o un poco más.»

Trey Harris