Redsys + Cloudflare y ASNs? El pago llega pero tu web no se entera. Esta es la solución

Enviado por christian el

Hace unos días hemos echo un cambio bastante importante en un ecommerce que mantengo. Básicamente añadimos Cloudfare como gestor DNS y por tanto lo metemos como una capa más de protección.

A parte de bastantes errores/incidencias que hemos tenido con los correos (que ya lo contaré en otro momento... jaja). Nos ha pasado una cosa bastante grave... Los clientes pagaban, el dinero salía de su cuenta pero el pedido nunca se completaba!  y claro, esto es un problemón porque teníamos llamadas y correos de varios clientes sobre este problema.

 

El problema: la notificación server-to-server de los pagos

En general, en los pagos, cuando un cliente paga, pasan dos cosas en paralelo:

  1. El navegador del cliente vuelve a la web de la tienda (en la config "URL OK/ URL NO OK").
  2. Por otro lado, y de forma independiente, los servidores de Redsys hacen una petición directa a tu servidor notificando que el pago se ha completado (el webhook o "notificación online").

El punto 1 casi siempre funciona: es un simple redirect en el navegador del usuario. El punto 2 es el que estaba fallando, porque es una petición servidor-a-servidor, sin navegador ni cookies de sesión de por medio, y ahí es donde los WAF de Cloudfare nos estaban bloqueando.

Si Cloudflare no reconoce esa IP o ese user-agent como "tráfico legítimo", la bloquea y tú te quedas mirando para la pantalla esperando a que tu pago se complete.... y ahí estaba el problema.

 

Cómo verlo en los logs de Cloudflare? Es posible?

Aún que tenía mis sospechas de esto, no quería toquetear nada de los WAFs antes de estar seguro al 100%. Para ello Cloudfare (que es muy listo.. jaja) ya tiene dashboards y vistas para validar esto:

Security → Events

Ahí aparece el histórico de peticiones bloqueadas. En mi caso ya lo he visto al momento porque las URLs bloqueadas eran las urls de notificación de pago por que ya estaba seguro del todo. Esto es lo que veía en los registros:

  • Acción: Block o Managed Challenge
  • User-Agent: algo como Java/1.7.0 — Redsys hace estas notificaciones desde un cliente Java, y ese user-agent suele hacer saltar reglas de bots o de "clientes sospechosos"

 

¿Qué es un ASN, para quien no lo tenga claro?

Un ASN (Autonomous System Number) es el identificador de una red autónoma en internet. Básicamente es un conjunto de rangos IP gestionados bajo una misma administración. En vez de whitelistear IPs sueltas (que pueden cambiar), filtras por el "dueño" del bloque completo.

Redsys tiene el suyo propio, el AS31627, con sus rangos de IP asociados por lo que es mucho más fácil de gestionar porque si Redsys rota o amplía sus IPs dentro de su propio rango, el ASN es el mismo y es completamente transparente!

 

La solución: regla de Firewall permitiendo el ASN

Como ya tenía claro que el problema era el WAF de Cloudfare, añadimos una excepción y listo! En Cloudflare:

Security → WAF → Custom rules → Create rule

Configuración de la regla sería algo así:

Campo: ASN
Operador: equals
Valor: 31627

Acción: Skip | Allow
Skip: → todas las reglas gestionadas relevantes (Bot Fight Mode, Managed Rules, Rate Limiting, etc...)

 

El cambio es casi instantáneo porque a los pocos segundos había echo una prueba y el pago ha sido OK (recibo la confirmación del pedido al fin!!!!!)

 

Resumen de lo ocurrido

  • El fallo no está en Redsys ni en tu ecommerce: está en el WAF de Cloudfare que bloquea algunas peticiones.
  • Si filtras en los logs de Cloudflare por ASN 31627 ya puedes verificar esto
  • La solución es una regla de Firewall que permita ese ASN.

 

Si tienes un ecommerce detrás de Cloudflare y alguna vez te ha pasado esto, seguramente esta es la causa!!!! OJo antes de cambiar cosillas jaja

Dinahosting: dominios y alojamiento web
My investor

Regístrate en MyInvestory tendrás un extra de 20€ ! :D

 

Menciona que vienes de mi parte y te llevas un regalo en tu primera inversión :)

Usa el código U048395 y te llevas un regalo en tu primera inversión :)

 

Usa el código 22c80f y te llevas un regalo en tu primera inversión :)