Saltar al contenido principal

Servidor de Aplicaciones XCAP - Documentación de Uso y Arquitectura

Tabla de Contenidos

  1. Resumen Ejecutivo
  2. XCAP en Redes 3GPP
  3. Arquitectura del Sistema
  4. Integración HSS
  5. Autenticación BSF
  6. Tipos de Documentos XCAP
  7. Diagramas de Flujo de Llamadas
  8. Ejemplos de Documentos XCAP
  9. Guía de Configuración
  10. Referencia de API

Resumen Ejecutivo

Este Servidor de Aplicaciones XCAP (Protocolo de Acceso a la Configuración XML) proporciona gestión de Servicios Suplementarios IMS (Subsistema Multimedia IP) para redes de telecomunicaciones. Permite a los suscriptores gestionar la desvío de llamadas, el bloqueo de llamadas y la presentación de ID de llamadas a través de documentos XML estandarizados.

Características Clave:

  • Cumplimiento con 3GPP: Implementa ETSI TS 183 063 para Servicios Suplementarios IMS
  • Integración HSS: Comunicación basada en API REST con el Servidor de Suscriptores Local
  • Listo para BSF: Marco para autenticación de Arquitectura de Arranque Genérico (GBA)
  • Multi-Servicio: Desvío de Llamadas, Bloqueo de Llamadas (entrantes/salientes), control de ID de llamadas
  • Alta Disponibilidad: Balanceo de carga entre múltiples pares HSS
  • Interfaz Web: Portal de autoservicio para la gestión de suscriptores

XCAP en Redes 3GPP

¿Qué es XCAP?

XCAP (Protocolo de Acceso a la Configuración XML) es un protocolo estandarizado basado en HTTP definido por el IETF (RFC 4825) y adoptado por 3GPP para gestionar datos de configuración de usuarios en redes IMS. Permite a dispositivos móviles y aplicaciones crear, leer, actualizar y eliminar documentos XML almacenados en servidores de red.

Rol en la Arquitectura IMS 3GPP

Categorías de Servicios XCAP

El servidor XCAP gestiona tres categorías principales de Servicios Suplementarios IMS:

  1. Desvío de Comunicación (Desvío de Llamadas)

    • Incondicional (CFU)
    • Ocupado (CFB)
    • Sin Respuesta (CFNA)
    • No Alcanzable (CFNRc)
    • No Registrado (CFNReg)
  2. Bloqueo de Comunicación (Bloqueo de Llamadas)

    • Entrante: Todas las llamadas, Internacional, Internacional excepto País de Origen, Mientras se Roaming
    • Saliente: Todas las llamadas, Internacional, Internacional excepto País de Origen, Mientras se Roaming
  3. Servicios de Presentación de Identidad

    • Presentación de Identidad de Origen (OIP) - Mostrar ID de llamada
    • Restricción de Presentación de Identidad de Origen (OIR) - Ocultar ID de llamada

Cumplimiento de Normas 3GPP

NormaTítuloRelevancia
ETSI TS 183 063Servicios de simulación PSTN/ISDN basados en IMSEspecificación principal para el esquema XML de simservs
3GPP TS 24.623Protocolo de Acceso a la Configuración (XCAP) sobre UtEspecificaciones de interfaz XCAP
3GPP TS 24.238Configuración de usuario basada en SIPGestión de configuración de usuario
3GPP TS 33.220Arquitectura de Autenticación Genérica (GAA)Marco de autenticación BSF/GBA
RFC 4825Protocolo de Acceso a la Configuración XML (XCAP)Definición base del protocolo XCAP
RFC 4745Política Común: Un Formato de Documento para Expresar Preferencias de PrivacidadEspacio de nombres XML para condiciones de reglas

Arquitectura del Sistema

Vista de Componentes de Alto Nivel

Arquitectura de Flujo de Datos

Responsabilidades de los Componentes

ComponentePropósitoPuerto/Protocolo
Servidor XCAPServidor de aplicaciones principal, puntos finales de API REST5000/HTTP
Manejador XMLConversión y manipulación de documentos XMLN/A
Cliente HSSRecupera/actualiza datos de suscriptores a través de API REST8080/HTTP
Motor de PlantillasGenera XML XCAP a partir de datos de suscriptoresN/A
Autenticación BSFAutenticación opcional de resumen GBAN/A
Interfaz WebPortal de autoservicio para suscriptores5000/HTTP

Integración HSS

Patrón de Comunicación HSS

El servidor XCAP actúa como un proxy sin estado entre los clientes XCAP y el HSS. No mantiene almacenamiento local de datos de suscriptores, sino que consulta al HSS para cada solicitud.

Puntos Finales de la API REST HSS

1. Recuperar Suscriptor por MSISDN

GET /ims_subscriber/ims_subscriber_msisdn/{msisdn}
Host: 10.4.2.140:8080

Respuesta:

{
"ims_subscriber_id": 12345,
"imsi": "505570000012345",
"msisdn": "15551234567",
"xcap_profile": "<ss:communication-diversion>...</ss:communication-diversion>",
"scscf": "sip:scscf1.ims.example.com:6060",
"scscf_peer": "scscf1.ims.example.com",
"scscf_realm": "ims.example.com"
}

2. Actualizar Perfil de Suscriptor

PATCH /ims_subscriber/{ims_subscriber_id}
Host: 10.4.2.140:8080
Content-Type: application/json

{
"xcap_profile": "<ss:communication-diversion xmlns:ss=\"http://uri.etsi.org/ngn/params/xml/simservs/xcap\" active=\"true\">...</ss:communication-diversion>"
}

Respuesta:

{
"Status": "success",
"ims_subscriber_id": 12345
}

3. Búsqueda de Suscriptor PCRF (basada en IP)

GET /pcrf/subscriber_routing/{ip_address}
Host: 10.4.2.140:8080

Propósito: Resuelve la identidad del suscriptor a partir de la dirección IP del UE para acceso a la interfaz web.

Respuesta:

{
"subscriber_id": 67890,
"ip_address": "100.64.4.16",
"apn": "ims"
}

4. Obtener Información Base del Suscriptor

GET /subscriber/{subscriber_id}
Host: 10.4.2.140:8080

Respuesta:

{
"subscriber_id": 67890,
"imsi": "505570000012345",
"msisdn": "15551234567"
}

5. Obtener Suscriptor IMS por IMSI

GET /ims_subscriber/ims_subscriber_imsi/{imsi}
Host: 10.4.2.140:8080

Respuesta: Estructura igual que el punto final #1

Balanceo de Carga HSS

Características:

  • Sin Estado: Cada solicitud puede ir a cualquier par HSS
  • Distribución Aleatoria: Balanceado entre pares disponibles
  • Sincronización de Base de Datos: Los pares HSS comparten una base de datos backend común
  • Sin Sesiones Fijas: Sin afinidad de cliente o persistencia de sesión

¿Por qué REST en lugar de Diameter?

Las redes 3GPP tradicionales utilizan la interfaz Diameter Sh para la comunicación XCAP↔HSS. Esta implementación utiliza API REST por simplicidad:

AspectoDiameter Sh (Tradicional)API REST (Esta Implementación)
ProtocoloDiameter (RFC 6733)HTTP/JSON
ComplejidadAlta - requiere pila DiameterBaja - biblioteca HTTP estándar
Formato de MensajeAVP (Par Clave-Valor) binarioJSON (legible por humanos)
Puerto3868 (SCTP/TCP)8080 (HTTP)
Caso de UsoRedes de telecomunicaciones de grado de operadorImplementaciones nativas en la nube, basadas en API
IntegraciónRequiere FreeDiameter, OpenDiameterCliente REST estándar (requests)
AutenticaciónSeguridad TLS/DiameterTokens de API, OAuth (futuro)

Ventajas del Enfoque REST:

  • Integración más fácil con herramientas modernas de DevOps
  • Depuración más sencilla (curl, Postman)
  • Compatibilidad con arquitecturas nativas en la nube
  • Complejidad de infraestructura reducida
  • Amigable para desarrolladores

Autenticación BSF

Arquitectura de Arranque Genérico (GBA)

GBA es un marco de autenticación 3GPP (TS 33.220) que permite la autenticación mutua entre el UE y los servicios de red utilizando claves compartidas derivadas de la infraestructura de autenticación UMTS/LTE.

Estado de Implementación BSF

El servidor proporciona opciones de autenticación flexibles con soporte completo de BSF/GBA disponible cuando se requiere.

Configuración:

# config.yaml
bsf_support: False

Desafío de Autenticación:

Cuando la autenticación BSF está habilitada, el servidor emite HTTP 401 No Autorizado con:

WWW-Authenticate: Digest realm="3GPP-bootstrapping@xcap.ims.example.com",
qop="auth-int",
nonce="<random-32-chars>",
opaque="<random-32-chars>",
algorithm="MD5",
domain="/"

Parámetros de Autenticación Digest

Cuando la autenticación BSF está habilitada, el servidor desafía a los clientes con estos parámetros:

ParámetroValorPropósito
realm3GPP-bootstrapping@xcap.ims.example.comDominio de autenticación
qopauth-intCalidad de Protección: autenticación con protección de integridad
algorithmMD5Algoritmo de hash para el cálculo de digest
nonceCadena aleatoria de 32 caracteresDesafío del servidor para prevenir ataques de repetición
opaqueCadena aleatoria de 32 caracteresDatos específicos del servidor devueltos por el cliente sin cambios
domain/Espacio URI para el cual las credenciales son válidas

Arquitectura de Autenticación

El servidor XCAP proporciona múltiples mecanismos de autenticación para adaptarse a diferentes escenarios de implementación:

1. Autenticación basada en IP del UE a través de PCRF (Recomendado)

El servidor XCAP puede autenticar a los suscriptores validando su dirección IP del UE contra sesiones activas en el HSS/PCRF. Esto proporciona una autenticación segura y consciente de la sesión sin requerir infraestructura GBA.

Cómo Funciona:

Ventajas:

  • Consciente de la Sesión: Solo los UE autenticados con sesiones de datos activas pueden acceder a XCAP
  • Sin Secretos Compartidos: No requiere claves precompartidas o contraseñas
  • Cierre de Sesión Automático: Cuando el UE se desconecta de la red, la sesión IP termina
  • Soporte para Roaming: Funciona en redes de origen y visitadas (si PCRF es accesible)
  • Seguro para NAT: IP del UE validada directamente, no encabezados del lado del cliente

Propiedades de Seguridad:

  • Verificación de IP de Origen: La IP de origen de la conexión TCP no puede ser falsificada en una conexión establecida
  • Autorización PCRF: Solo los UE con contextos PDP/PDN activos y autorizados tienen direcciones IP
  • Validación en Tiempo Real: Cada solicitud consulta el estado actual del PCRF
  • Vinculación de Suscriptores: Mapeo de IP a suscriptor validado en cada solicitud

Configuración:

# config.yaml
ue_subnets:
- '100.64.0.0/22' # Rango CGNAT del UE 1
- '100.64.4.0/22' # Rango CGNAT del UE 2
- '100.64.24.0/24' # Rango de prueba del UE

# Búsqueda PCRF a través de API HSS
hss_peers:
- '10.4.2.140:8080' # HSS con punto final PCRF
- '10.4.2.141:8080'

Punto Final de la API PCRF:

GET /pcrf/subscriber_routing/{ue_ip_address}
Host: hss-server:8080

Respuesta:
{
"subscriber_id": 12345,
"ip_address": "100.64.4.16",
"apn": "ims",
"session_start": "2026-01-07T10:30:00Z",
"rat_type": "EUTRAN"
}

Flujo de Validación:

  1. Extraer IP de origen de la conexión TCP de la solicitud HTTP
  2. Verificar que la IP esté en el rango configurado ue_subnets
  3. Consultar PCRF: GET /pcrf/subscriber_routing/{source_ip}
  4. PCRF devuelve subscriber_id si existe una sesión activa
  5. Recuperar detalles del suscriptor: GET /subscriber/{subscriber_id}
  6. Obtener IMSI, luego consultar: GET /ims_subscriber/ims_subscriber_imsi/{imsi}
  7. Comparar MSISDN en la URL XCAP con el MSISDN resuelto por PCRF
  8. Si coincide: autenticado ✓

Casos de Uso:

  • Autoservicio Web: UE se conecta a través de datos móviles, autenticación automática por IP
  • Aplicaciones Móviles: Clientes XCAP nativos en smartphones
  • Empresas: Dispositivos CPE con asignaciones de IP fijas para UE

2. Lista Blanca de Subredes IP (Redes de Confianza)

Para servidores de aplicaciones de confianza y entornos de prueba:

# config.yaml
as_allowed_ips:
- '10.4.3.60' # Servidor de Aplicaciones SIP
- '10.4.3.61' # Servidor de prueba

Casos de Uso:

  • Servidores de Aplicaciones SIP recuperando perfiles de suscriptores durante el procesamiento de llamadas
  • Herramientas de gestión de red internas
  • Entornos de desarrollo/prueba

3. Resolución de URI SIP a MSISDN

El servidor extrae la identidad del suscriptor de la URL XCAP misma:

/simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml
└─────────┬─────────┘
MSISDN: 15551234567

El servidor analiza la URI SIP para extraer el número de teléfono E.164 (MSISDN).

4. Encabezado X-3GPP-Intended-Identity

El servidor admite el encabezado estándar 3GPP para la afirmación de identidad:

GET /simservs.xml HTTP/1.1
Host: xcap.ims.example.com
X-3GPP-Intended-Identity: sip:+15551234567@ims.example.com

Este encabezado permite a los clientes especificar explícitamente la identidad del suscriptor objetivo para la solicitud.

Habilitando la Autenticación BSF

Para habilitar la autenticación GBA en producción:

  1. Desplegar Servidor BSF: Implementar servidor de arranque 3GPP TS 33.220
  2. Configurar Diameter Zh: Conectar BSF al HSS a través de Diameter
  3. Actualizar config.yaml:
    bsf_support: True
    bsf_url: "http://bsf-server:8090"
  4. Implementar Recuperación de Clave NAF: Agregar llamada a la API BSF para obtener Ks_NAF para validación
  5. Agregar Lógica de Validación de Digest: Verificar la respuesta del cliente usando la clave compartida

Tipos de Documentos XCAP

Estructura del Documento Raíz Simservs

Todos los documentos XCAP están envueltos en el elemento raíz simservs:

<?xml version="1.0" encoding="UTF-8"?>
<simservs xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy">

<!-- Servicios de Presentación de Identidad -->
<originating-identity-presentation active="true"/>
<originating-identity-presentation-restriction active="true">
<default-behaviour>presentation-not-restricted</default-behaviour>
</originating-identity-presentation-restriction>

<!-- Desvío de Llamadas (Desvío de Comunicación) -->
<communication-diversion active="true">
<NoReplyTimer>20</NoReplyTimer>
<cp:ruleset>
<!-- Reglas de desvío de llamadas -->
</cp:ruleset>
</communication-diversion>

<!-- Bloqueo de Llamadas -->
<incoming-communication-barring active="false">
<cp:ruleset>
<!-- Reglas de bloqueo entrante -->
</cp:ruleset>
</incoming-communication-barring>

<outgoing-communication-barring active="false">
<cp:ruleset>
<!-- Reglas de bloqueo saliente -->
</cp:ruleset>
</outgoing-communication-barring>

</simservs>

Detalles del Tipo de Documento

1. Desvío de Comunicación (Desvío de Llamadas)

Propósito: Redirigir llamadas entrantes a destinos alternativos según condiciones

Patrón de URL XCAP:

/simservs.ngn.etsi.org/users/{sip_uri}/simservs.xml/~~/simservs/communication-diversion

Tipos de Reglas:

ID de ReglaCondiciónDescripción
cfa(ninguna)Desvío Incondicional de Llamadas - desviar todas las llamadas inmediatamente
cfbocupadoDesvío de Llamadas en Ocupado - desviar cuando la línea está ocupada
cfnasin respuestaDesvío de Llamadas en Sin Respuesta - desviar después de que expire el NoReplyTimer
cfnrcno alcanzableDesvío de Llamadas en No Alcanzable - desviar cuando el dispositivo está fuera de línea
cfnregno registradoDesvío de Llamadas en No Registrado - desviar cuando no está registrado en IMS

Estructura XML:

<ss:communication-diversion xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
active="true">
<ss:NoReplyTimer>20</ss:NoReplyTimer>
<cp:ruleset xmlns:cp="urn:ietf:params:xml:ns:common-policy">

<!-- Desvío Incondicional -->
<cp:rule id="cfa">
<cp:conditions></cp:conditions>
<cp:actions>
<ss:forward-to>
<ss:target>tel:+15559999999</ss:target>
<ss:notify-caller>false</ss:notify-caller>
</ss:forward-to>
</cp:actions>
</cp:rule>

<!-- Desvío en Ocupado -->
<cp:rule id="cfb">
<cp:conditions>
<ss:busy/>
</cp:conditions>
<cp:actions>
<ss:forward-to>
<ss:target>tel:+15558888888</ss:target>
<ss:notify-caller>false</ss:notify-caller>
</ss:forward-to>
</cp:actions>
</cp:rule>

</cp:ruleset>
</ss:communication-diversion>

2. Bloqueo de Comunicación Entrante

Propósito: Bloquear llamadas entrantes de categorías específicas

Patrón de URL XCAP:

/simservs.ngn.etsi.org/users/{sip_uri}/simservs.xml/~~/simservs/incoming-communication-barring

Tipos de Reglas:

ID de ReglaCondiciónDescripción
all(ninguna)Bloquear todas las llamadas entrantes
internationalinternacionalBloquear llamadas de números internacionales
international-exHCinternacional-exHCBloquear llamadas internacionales excepto del país de origen
roamingroamingBloquear llamadas entrantes mientras se está en roaming

Estructura XML:

<ss:incoming-communication-barring xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
active="true">
<cp:ruleset xmlns:cp="urn:ietf:params:xml:ns:common-policy">

<cp:rule id="international">
<cp:conditions>
<ss:international/>
</cp:conditions>
<cp:actions>
<ss:allow>false</ss:allow>
</cp:actions>
</cp:rule>

<cp:rule id="roaming">
<cp:conditions>
<ss:roaming/>
</cp:conditions>
<cp:actions>
<ss:allow>false</ss:allow>
</cp:actions>
</cp:rule>

</cp:ruleset>
</ss:incoming-communication-barring>

3. Bloqueo de Comunicación Saliente

Propósito: Restringir llamadas salientes a destinos específicos

Patrón de URL XCAP:

/simservs.ngn.etsi.org/users/{sip_uri}/simservs.xml/~~/simservs/outgoing-communication-barring

Tipos de Reglas: Igual que el bloqueo entrante

Estructura XML:

<ss:outgoing-communication-barring xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
active="false">
<cp:ruleset xmlns:cp="urn:ietf:params:xml:ns:common-policy">

<cp:rule id="international">
<cp:conditions>
<ss:international/>
</cp:conditions>
<cp:actions>
<ss:allow>false</ss:allow>
</cp:actions>
</cp:rule>

</cp:ruleset>
</ss:outgoing-communication-barring>

4. Restricción de Presentación de Identidad de Origen (ID de Llamada)

Propósito: Controlar si se muestra el ID de llamada a las partes llamadas

Patrón de URL XCAP:

/simservs.ngn.etsi.org/users/{sip_uri}/simservs.xml/~~/simservs/originating-identity-presentation-restriction

Estructura XML:

<ss:originating-identity-presentation-restriction active="true">
<ss:default-behaviour>presentation-restricted</ss:default-behaviour>
</ss:originating-identity-presentation-restriction>

Opciones:

  • presentation-restricted - Ocultar ID de llamada (Anónimo)
  • presentation-not-restricted - Mostrar ID de llamada (Normal)

Diagramas de Flujo de Llamadas

Flujo de Configuración de Desvío de Llamadas

Flujo del Portal de Autoservicio Web

Flujo de Ejecución de Bloqueo de Llamadas

Flujo de Autenticación GBA BSF (Cuando Está Habilitado)


Ejemplos de Documentos XCAP

Documento Completo Simservs (Desidentificado)

<?xml version="1.0" encoding="UTF-8"?>
<simservs xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!-- Servicios de ID de Llamada -->
<originating-identity-presentation active="true"/>

<originating-identity-presentation-restriction active="true">
<default-behaviour>presentation-not-restricted</default-behaviour>
</originating-identity-presentation-restriction>

<!-- Configuración de Desvío de Llamadas -->
<communication-diversion active="true">
<NoReplyTimer>20</NoReplyTimer>
<cp:ruleset>

<!-- Desvío Incondicional (Deshabilitado) -->
<cp:rule id="cfa">
<cp:conditions></cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15556666666</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>

<!-- Desvío en Ocupado (Habilitado) -->
<cp:rule id="cfb">
<cp:conditions>
<busy/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15557777777</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>

<!-- Desvío en Sin Respuesta (Habilitado) -->
<cp:rule id="cfna">
<cp:conditions>
<no-answer/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15558888888</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>

<!-- Desvío en No Alcanzable (Habilitado) -->
<cp:rule id="cfnrc">
<cp:conditions>
<not-reachable/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15559999999</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>

<!-- Desvío en No Registrado (Habilitado) -->
<cp:rule id="cfnreg">
<cp:conditions>
<not-registered/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15559999999</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>

</cp:ruleset>
</communication-diversion>

<!-- Bloqueo de Llamadas Entrantes -->
<incoming-communication-barring active="false">
<cp:ruleset>

<!-- Bloquear Todas las Entrantes (Deshabilitado) -->
<cp:rule id="all">
<cp:conditions></cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

<!-- Bloquear Internacional Entrante (Deshabilitado) -->
<cp:rule id="international">
<cp:conditions>
<international/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

<!-- Bloquear Internacional Excepto País de Origen (Deshabilitado) -->
<cp:rule id="international-exHC">
<cp:conditions>
<international-exHC/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

<!-- Bloquear Mientras se Roaming (Deshabilitado) -->
<cp:rule id="roaming">
<cp:conditions>
<roaming/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

</cp:ruleset>
</incoming-communication-barring>

<!-- Bloqueo de Llamadas Salientes -->
<outgoing-communication-barring active="false">
<cp:ruleset>

<!-- Bloquear Todas las Salientes (Deshabilitado) -->
<cp:rule id="all">
<cp:conditions></cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

<!-- Bloquear Internacional Salientes (Deshabilitado) -->
<cp:rule id="international">
<cp:conditions>
<international/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

<!-- Bloquear Internacional Excepto País de Origen (Deshabilitado) -->
<cp:rule id="international-exHC">
<cp:conditions>
<international-exHC/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

<!-- Bloquear Mientras se Roaming (Deshabilitado) -->
<cp:rule id="roaming">
<cp:conditions>
<roaming/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>

</cp:ruleset>
</outgoing-communication-barring>

</simservs>

Datos del Suscriptor YAML (Formato de Almacenamiento HSS)

Esta es la representación interna almacenada en el campo xcap_profile del HSS:

NoReplyTimer: 20

call_forwarding:
cfa:
enabled: false
target: tel:+15556666666

cfb:
condition: busy
enabled: true
target: tel:+15557777777

cfna:
condition: no-answer
enabled: true
target: tel:+15558888888

cfnrc:
condition: not-reachable
enabled: true
target: tel:+15559999999

cfnreg:
condition: not-registered
enabled: true
target: tel:+15559999999

call_barring_incoming:
all:
allow: false

international:
allow: false
condition: international

international-exHC:
allow: false
condition: international-exHC

roaming:
allow: false
condition: roaming

call_barring_outgoing:
all:
allow: false

international:
allow: false
condition: international

international-exHC:
allow: false
condition: international-exHC

roaming:
allow: false
condition: roaming

Ejemplo de Solicitud XCAP PUT (Habilitar CFB)

Solicitud:

PUT /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/cfb HTTP/1.1
Host: xcap.ims.example.com:5000
Content-Type: application/xcap-el+xml
Content-Length: 342

<?xml version="1.0" encoding="UTF-8"?>
<cp:rule id="cfb" xmlns:cp="urn:ietf:params:xml:ns:common-policy"
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap">
<cp:conditions>
<ss:busy/>
</cp:conditions>
<cp:actions>
<ss:forward-to>
<ss:target>tel:+15557777777</ss:target>
<ss:notify-caller>false</ss:notify-caller>
</ss:forward-to>
</cp:actions>
</cp:rule>

Respuesta:

HTTP/1.1 200 OK
Content-Type: application/xcap-el+xml
ETag: "eti87"
Content-Length: 0

Ejemplo de Solicitud XCAP GET (Recuperar Todas las Reglas CF)

Solicitud:

GET /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion HTTP/1.1
Host: xcap.ims.example.com:5000
Accept: application/xcap-el+xml

Respuesta:

HTTP/1.1 200 OK
Content-Type: application/xcap-el+xml
ETag: "eti87"
Content-Length: 1456

<?xml version="1.0" encoding="UTF-8"?>
<ss:communication-diversion xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy"
active="true">
<ss:NoReplyTimer>20</ss:NoReplyTimer>
<cp:ruleset>
<cp:rule id="cfa">
<cp:conditions></cp:conditions>
<cp:actions>
<ss:forward-to>
<ss:target>tel:+15556666666</ss:target>
<ss:notify-caller>false</ss:notify-caller>
</ss:forward-to>
</cp:actions>
</cp:rule>

<cp:rule id="cfb">
<cp:conditions>
<ss:busy/>
</cp:conditions>
<cp:actions>
<ss:forward-to>
<ss:target>tel:+15557777777</ss:target>
<ss:notify-caller>false</ss:notify-caller>
</ss:forward-to>
</cp:actions>
</cp:rule>

<!-- Reglas adicionales omitidas por brevedad -->
</cp:ruleset>
</ss:communication-diversion>

Ejemplo de Actualización Parcial (Cambiar NoReplyTimer)

Solicitud:

PUT /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion/NoReplyTimer HTTP/1.1
Host: xcap.ims.example.com:5000
Content-Type: application/xcap-el+xml
Content-Length: 87

<?xml version="1.0" encoding="UTF-8"?>
<ss:NoReplyTimer xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap">30</ss:NoReplyTimer>

Respuesta:

HTTP/1.1 200 OK
Content-Type: application/xcap-el+xml
ETag: "eti87"

Guía de Configuración

Referencia de config.yaml

# Servidores de Backend HSS (Balanceados)
hss_peers:
- '10.4.2.140:8080' # opt-se2-hss01
- '10.4.2.141:8080' # opt-se2-hss02

# OCS (Sistema de Carga en Línea) - Actualmente no utilizado
ocs_peers:
- '10.4.2.140'
- '10.4.2.141'

# Alternar Autenticación BSF/GBA
bsf_support: False # Establecer en True para producción GBA

# Configuración del Dominio IMS
ims_domain: 'ims.example.com'
diameter_realm: 'example.com'

# Alternar Prefijo de Espacio de Nombres XML
ss_prefix: True # Incluir prefijo 'ss:' en XML generado

# Rangos de IP Permitidos para UE (Para autenticación basada en IP)
ue_subnets:
- '100.64.0.0/22' # Rango CGNAT 1
- '100.64.4.0/22' # Rango CGNAT 2
- '100.64.24.0/24' # Rango CGNAT 3

# IPs de Servidores de Aplicaciones de Confianza
as_allowed_ips:
- '10.4.3.60' # opt-se2-as01

# Configuración de Pruebas Unitarias
unit_test_data:
source_ip: "100.64.4.16"
base_url: "http://localhost:5000"
msisdn: "15551234567" # MSISDN de suscriptor de prueba

Portal de Autoservicio Web

Para suscriptores cuyos dispositivos no admiten nativamente XCAP, el servidor proporciona un portal de autoservicio basado en la web. Los usuarios pueden navegar directamente al servidor XCAP desde su dispositivo móvil para gestionar su configuración a través de una interfaz HTML intuitiva.

Método de Acceso:

Los usuarios simplemente abren un navegador web en su smartphone y navegan a la URL del servidor XCAP:

http://xcap.ims.example.com:5000/

Autenticación Automática:

Al acceder desde un dispositivo móvil conectado a la red del operador, la autenticación ocurre automáticamente mediante la validación de la IP del UE:

  1. El dispositivo del usuario ya tiene una sesión de datos activa (contexto PDP/PDN)
  2. El servidor XCAP extrae la IP de origen de la conexión HTTP
  3. El servidor consulta al PCRF del HSS para resolver IP → identidad del suscriptor
  4. El usuario inicia sesión automáticamente - no se requiere nombre de usuario/contraseña
  5. La interfaz web muestra el desvío de llamadas actual, el bloqueo de llamadas y la configuración de ID de llamadas

Características:

  • Gestión de Desvío de Llamadas: Habilitar/deshabilitar reglas de desvío, establecer números de destino
  • Control de Bloqueo de Llamadas: Configurar restricciones de llamadas entrantes y salientes
  • Temporizador de No Respuesta: Ajustar el tiempo de espera antes del desvío de llamadas en caso de no respuesta
  • Actualizaciones en Tiempo Real: Cambios reflejados inmediatamente en el perfil del suscriptor
  • Optimizado para Móviles: Diseño responsivo para navegadores de smartphones

Casos de Uso:

  • Dispositivos Legados: Smartphones sin soporte nativo para clientes XCAP
  • Dispositivos iOS: iPhones que no exponen configuraciones XCAP en la aplicación de Configuración
  • Variantes de Android: Construcciones de Android sin integración XCAP específica del operador
  • Preferencia del Usuario: Suscriptores que prefieren la interfaz web sobre los menús de configuración del dispositivo
  • Acceso Rápido: Cambios temporales mientras viajan o están en roaming

Flujo de Ejemplo:

Esto elimina la necesidad de software de cliente XCAP especializado y proporciona acceso universal a través de navegadores web estándar.


Referencia de API

Estructura de la URL Base

http(s)://xcap.ims.example.com:5000/simservs.ngn.etsi.org/users/{sip_uri}/simservs.xml[/~~/selector]

Componentes:

  • Raíz: simservs.ngn.etsi.org (AUID - ID Único de Aplicación)
  • XUI: users/{sip_uri} (Identificador de Usuario XCAP)
  • Documento: simservs.xml
  • Selector de Nodo: /~~/simservs/communication-diversion/... (basado en XPath)

Tabla de Referencia de Puntos Finales

OperaciónMétodoURL XCAPDescripción
Obtener todos los serviciosGET/users/{sip}/simservs.xmlRecuperar documento completo de simservs
Obtener reglas CFGET/users/{sip}/simservs.xml/~~/simservs/communication-diversionObtener todas las reglas de desvío de llamadas
Obtener regla CF específicaGET/users/{sip}/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/{rule_id}Obtener una sola regla CF (cfa, cfb, etc.)
Actualizar regla CFPUT/users/{sip}/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/{rule_id}Actualizar regla de desvío de llamadas
Actualizar condición CFPUT/users/{sip}/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/{rule_id}/{element}Actualizar elemento de regla (target, condition)
Establecer NoReplyTimerPUT/users/{sip}/simservs.xml/~~/simservs/communication-diversion/NoReplyTimerCambiar tiempo de espera en caso de no respuesta
Obtener ID de llamadaGET/users/{sip}/simservs.xml/~~/simservs/originating-identity-presentation-restrictionObtener configuración de restricción de ID de llamada
Obtener CB entranteGET/users/{sip}/simservs.xml/~~/simservs/incoming-communication-barring/cp:ruleset/{rule_id}Obtener regla de bloqueo entrante
Actualizar CB entrantePUT/users/{sip}/simservs.xml/~~/simservs/incoming-communication-barring/cp:ruleset/{rule_id}Actualizar regla de bloqueo entrante
Obtener CB salienteGET/users/{sip}/simservs.xml/~~/simservs/outgoing-communication-barring/cp:ruleset/{rule_id}Obtener regla de bloqueo saliente
Actualizar CB salientePUT/users/{sip}/simservs.xml/~~/simservs/outgoing-communication-barring/cp:ruleset/{rule_id}Actualizar regla de bloqueo saliente

Encabezados HTTP

Encabezados de Solicitud

Content-Type: application/xcap-el+xml
Accept: application/xcap-el+xml
X-3GPP-Intended-Identity: sip:+15551234567@ims.example.com

Encabezados de Respuesta

Content-Type: application/xcap-el+xml
ETag: "eti87"

Respuestas de Error

Código HTTPSignificadoDescripción
200 OKÉxitoOperación completada con éxito
401 No AutorizadoAutenticación RequeridaDesafío de autenticación BSF/GBA (si está habilitado)
404 No EncontradoRecurso No EncontradoSuscriptor o documento no existe
409 ConflictoConflictoDesajuste de versión del documento (conflicto de ETag)
500 Error Interno del ServidorError del ServidorFallo en la comunicación HSS o error de procesamiento

Puntos Finales de la Interfaz Web

Punto FinalMétodoPropósito
/GETPágina de información del suscriptor (búsqueda por IP)
/call_forwardingGETMostrar formulario de gestión de desvío de llamadas
/call_forwardingPOSTActualizar regla de desvío de llamadas a través de la interfaz web
/apiGETDocumentación de Swagger UI

Formato de Registro

2026-01-07 10:15:32,456 12345   {/var/log/XCAP.log:123}   INFO   GetSubscriberData called for MSISDN: 15551234567

Campos: marca de tiempo, ID de proceso, ubicación del archivo, nivel de registro, mensaje

Consideraciones de Rendimiento

  • Diseño Sin Estado: No se mantiene estado de sesión en el servidor XCAP
  • Distribución de Carga: Selección aleatoria de par HSS por solicitud
  • Caché de Plantillas: Plantillas de documentos cargadas una vez al inicio
  • Procesamiento XML: Análisis y formateo en memoria
  • Consultas a la Base de Datos: Una consulta HSS por GET, dos por PUT (leer-modificar-escribir)

Conclusión

Este Servidor de Aplicaciones XCAP proporciona una implementación lista para producción de la gestión de Servicios Suplementarios IMS 3GPP. Puntos destacados clave:

Fortalezas:

  • Cumplimiento total con las normas XCAP de ETSI/3GPP
  • Integración HSS basada en API REST para despliegue nativo en la nube
  • Múltiples opciones de autenticación, incluyendo validación BSF/GBA y basada en IP del UE
  • Portal de autoservicio basado en web para compatibilidad universal de dispositivos
  • Alta disponibilidad con pares HSS balanceados

Escenarios de Despliegue:

  • Operadores de Redes Móviles (MNOs) y Operadores de Redes Móviles Virtuales (MVNOs)
  • Despliegues IMS empresariales
  • Plataformas de servicios VoLTE/VoWiFi
  • Infraestructura de telecomunicaciones nativa en la nube
  • Redes privadas LTE/5G

Referencias

Especificaciones 3GPP y ETSI

EspecificaciónTítuloDescripciónURL
ETSI TS 183 063Servicios de simulación PSTN/ISDN basados en IMSEspecificación principal que define el esquema XML de simservs para servicios suplementarios IMSPortal ETSI
3GPP TS 24.623Protocolo de Acceso a la Configuración (XCAP) sobre la interfaz Ut para Manipulación de Servicios SuplementariosDefine la interfaz XCAP Ut entre UE y servidor de aplicaciones para configuración de servicios suplementariosPortal 3GPP
3GPP TS 24.238Configuración de usuario basada en el Protocolo de Inicio de Sesión (SIP); Etapa 3Especifica mecanismos basados en SIP para la gestión de configuración de usuarios en IMSPortal 3GPP
3GPP TS 33.220Arquitectura de Autenticación Genérica (GAA); Arquitectura de Arranque Genérico (GBA)Define el marco BSF y GBA para la seguridad de credenciales de arranquePortal 3GPP
3GPP TS 24.229Protocolo de control de llamadas multimedia IP basado en el Protocolo de Inicio de Sesión (SIP) y el Protocolo de Descripción de Sesión (SDP); Etapa 3Especificación central de control de llamadas IMS que incluye disparadores de servicio y ejecución de servicios suplementariosPortal 3GPP
3GPP TS 29.228Interfaces Cx y Dx del Subsistema Multimedia (IM); Flujos de señalización y contenidos de mensajesDefine la interfaz Diameter Cx/Dx entre S-CSCF y HSS (relacionado con la recuperación del perfil de usuario)Portal 3GPP
3GPP TS 29.328Interfaz Sh del Subsistema Multimedia (IM); Flujos de señalización y contenidos de mensajesDefine la interfaz Diameter Sh entre AS y HSS para acceso a datos de usuarioPortal 3GPP

RFCs del IETF

RFCTítuloDescripciónURL
RFC 4825Protocolo de Acceso a la Configuración XML (XCAP)Especificación base del protocolo XCAP que define la manipulación de documentos XML basada en HTTPIETF Datatracker
RFC 4745Política Común: Un Formato de Documento para Expresar Preferencias de PrivacidadDefine el espacio de nombres XML de política común utilizado para condiciones de reglas en documentos XCAPIETF Datatracker
RFC 2617Autenticación HTTP: Autentic