Inicio Expertise Proyectos Soluciones CV Stack Blog Contacto
Volver al blog
Infraestructura 28 de abril de 2026 7 min lectura

FortiGate bloqueaba mi RTP
y no lo sabía

El trunk SIP registraba. La llamada se establecía. El 200 OK llegaba. Pero a los 18 segundos, silencio y colgado. El sniffer en WAN no mostraba RTP saliente. La causa: una policy de firewall con un service mal definido que bloqueaba el audio de salida silenciosamente.

FortiGate VoIP RTP Asterisk Firewall
Firewall FortiGate bloqueando tráfico RTP de una llamada VoIP
Asterisk PBX 192.168.150.x SIP + RTP SIP ✓ RTP ✗ FortiGate policy: SIP + RTP-Audio RTP-Audio: dst-port only → IMPLICIT DENY SIP ✓ RTP dropped SIP Carrier RTP: 1024-65535 timeout @ 18s FIX: udp-portrange 1024-65535:10000-20000 Flujo RTP bloqueado silenciosamente — diagnóstico

El síntoma

Todo parecía funcionar. El trunk SIP con el carrier estaba registrado. Al marcar desde Asterisk, la señalización corría perfecta: INVITE → 100 Trying → 183 Session Progress → 200 OK → ACK. La llamada "se establecía". Pero en el teléfono: silencio total. Y a los 16-18 segundos, la llamada se colgaba sola.

El carrier terminaba la llamada por timeout de RTP. Su SBC esperaba recibir audio dentro de los primeros 20 segundos y nunca llegó nada.

Síntoma clásico

Llamada se establece, sin audio, se cae en 18 segundos. Siempre el mismo tiempo. Es el timeout RTP del carrier.

Diagnóstico: el sniffer no miente

Lo primero que hice fue correr el sniffer en FortiGate sobre la interfaz WAN. El objetivo era ver si los paquetes RTP salían de la red. El resultado fue revelador:

Revisé en la interfaz LAN (SVR-VLAN150): el RTP salía del Asterisk correctamente. Llegaba al FortiGate. Pero ahí se quedaba. Algo en el firewall lo estaba tirando.

La causa raíz: dst-port vs src-port

La policy outbound de Asterisk hacia el trunk SIP tenía configurados dos services:

config firewall service custom
    edit "SIP"
        set udp-portrange 5060
    next
    edit "RTP-Audio"
        set udp-portrange 10000-20000
    next
end

¿Parece razonable? El problema es sutil pero crítico: udp-portrange en Fortinet filtra por puerto de destino. Pero el RTP saliente tiene como origen el puerto del rango RTP de Asterisk (10000-20000) y como destino un puerto aleatorio que elige el carrier.

El error conceptual

RTP-Audio con udp-portrange 10000-20000 matchea paquetes cuyo dst-port está en 10000-20000. Pero el RTP saliente tiene src-port en ese rango y dst-port random del carrier. Ningún service matcheaba → deny implícito.

Lo más frustrante: el RTP entrante sí pasaba, porque venía con src-port random del carrier y dst-port en 10000-20000 (del Asterisk). Ese sí matcheaba el service. Por eso el síntoma era unidireccional.

El fix

Fortinet tiene una sintaxis específica para definir rangos de src-port: dst:src. Así se crea un service que restringe el tráfico saliente RTP correctamente:

config firewall service custom
    edit "RTP-Audio-OUT"
        set udp-portrange 1024-65535:10000-20000
    next
end

Esta definición significa:

Por qué esto no es "abrir todo UDP"

Restringir por src-port garantiza que solo el tráfico que realmente sale desde el rango RTP de Asterisk pueda usar esta policy. No abre UDP arbitrario — solo matchea si el origen es del pool RTP.

Con ese service agregado a la policy outbound y el RTP-Audio-OUT en lugar del anterior, el audio funcionó inmediatamente en ambas direcciones.

Por qué es difícil de diagnosticar

Este bug tiene varios factores que lo hacen traicionero:

  1. El deny es silencioso. FortiGate no loggea por defecto los paquetes denegados en policies existentes. La llamada "funciona" porque SIP pasa, pero el RTP se descarta sin registro visible.
  2. El RTP entrante sí funciona. Eso genera la falsa impresión de que la policy está bien y el problema es del carrier o del Asterisk.
  3. El timing es consistente. El colgado a los 18 segundos parece un bug de Asterisk o del dialplan. Es el timeout del carrier, no del firewall.
  4. La configuración parece correcta. "Tengo SIP y RTP habilitados". Sí, pero para el tráfico equivocado.

Checklist para VoIP en FortiGate

Si estás integrando Asterisk (o cualquier PBX) con un trunk SIP detrás de un FortiGate, verificá:


Takeaway

En firewalls, los services se definen desde la perspectiva de los paquetes que entran al firewall, no desde la del protocolo. RTP saliente tiene src-port en tu rango y dst-port en el del carrier. Si olvidás eso, bloqueás el audio sin ningún error visible.