Servidor de Aplicaciones XCAP - Documentación de Uso y Arquitectura
Tabla de Contenidos
- Resumen Ejecutivo
- XCAP en Redes 3GPP
- Arquitectura del Sistema
- Integración HSS
- Autenticación BSF
- Tipos de Documentos XCAP
- Diagramas de Flujo de Llamadas
- Ejemplos de Documentos XCAP
- Guía de Configuración
- 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:
-
Desvío de Comunicación (Desvío de Llamadas)
- Incondicional (CFU)
- Ocupado (CFB)
- Sin Respuesta (CFNA)
- No Alcanzable (CFNRc)
- No Registrado (CFNReg)
-
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
-
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
| Norma | Título | Relevancia |
|---|---|---|
| ETSI TS 183 063 | Servicios de simulación PSTN/ISDN basados en IMS | Especificación principal para el esquema XML de simservs |
| 3GPP TS 24.623 | Protocolo de Acceso a la Configuración (XCAP) sobre Ut | Especificaciones de interfaz XCAP |
| 3GPP TS 24.238 | Configuración de usuario basada en SIP | Gestión de configuración de usuario |
| 3GPP TS 33.220 | Arquitectura de Autenticación Genérica (GAA) | Marco de autenticación BSF/GBA |
| RFC 4825 | Protocolo de Acceso a la Configuración XML (XCAP) | Definición base del protocolo XCAP |
| RFC 4745 | Política Común: Un Formato de Documento para Expresar Preferencias de Privacidad | Espacio 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
| Componente | Propósito | Puerto/Protocolo |
|---|---|---|
| Servidor XCAP | Servidor de aplicaciones principal, puntos finales de API REST | 5000/HTTP |
| Manejador XML | Conversión y manipulación de documentos XML | N/A |
| Cliente HSS | Recupera/actualiza datos de suscriptores a través de API REST | 8080/HTTP |
| Motor de Plantillas | Genera XML XCAP a partir de datos de suscriptores | N/A |
| Autenticación BSF | Autenticación opcional de resumen GBA | N/A |
| Interfaz Web | Portal de autoservicio para suscriptores | 5000/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:
| Aspecto | Diameter Sh (Tradicional) | API REST (Esta Implementación) |
|---|---|---|
| Protocolo | Diameter (RFC 6733) | HTTP/JSON |
| Complejidad | Alta - requiere pila Diameter | Baja - biblioteca HTTP estándar |
| Formato de Mensaje | AVP (Par Clave-Valor) binario | JSON (legible por humanos) |
| Puerto | 3868 (SCTP/TCP) | 8080 (HTTP) |
| Caso de Uso | Redes de telecomunicaciones de grado de operador | Implementaciones nativas en la nube, basadas en API |
| Integración | Requiere FreeDiameter, OpenDiameter | Cliente REST estándar (requests) |
| Autenticación | Seguridad TLS/Diameter | Tokens 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ámetro | Valor | Propósito |
|---|---|---|
| realm | 3GPP-bootstrapping@xcap.ims.example.com | Dominio de autenticación |
| qop | auth-int | Calidad de Protección: autenticación con protección de integridad |
| algorithm | MD5 | Algoritmo de hash para el cálculo de digest |
| nonce | Cadena aleatoria de 32 caracteres | Desafío del servidor para prevenir ataques de repetición |
| opaque | Cadena aleatoria de 32 caracteres | Datos 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:
- Extraer IP de origen de la conexión TCP de la solicitud HTTP
- Verificar que la IP esté en el rango configurado
ue_subnets - Consultar PCRF:
GET /pcrf/subscriber_routing/{source_ip} - PCRF devuelve
subscriber_idsi existe una sesión activa - Recuperar detalles del suscriptor:
GET /subscriber/{subscriber_id} - Obtener IMSI, luego consultar:
GET /ims_subscriber/ims_subscriber_imsi/{imsi} - Comparar MSISDN en la URL XCAP con el MSISDN resuelto por PCRF
- 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:
- Desplegar Servidor BSF: Implementar servidor de arranque 3GPP TS 33.220
- Configurar Diameter Zh: Conectar BSF al HSS a través de Diameter
- Actualizar config.yaml:
bsf_support: True
bsf_url: "http://bsf-server:8090" - Implementar Recuperación de Clave NAF: Agregar llamada a la API BSF para obtener Ks_NAF para validación
- 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 Regla | Condición | Descripción |
|---|---|---|
| cfa | (ninguna) | Desvío Incondicional de Llamadas - desviar todas las llamadas inmediatamente |
| cfb | ocupado | Desvío de Llamadas en Ocupado - desviar cuando la línea está ocupada |
| cfna | sin respuesta | Desvío de Llamadas en Sin Respuesta - desviar después de que expire el NoReplyTimer |
| cfnrc | no alcanzable | Desvío de Llamadas en No Alcanzable - desviar cuando el dispositivo está fuera de línea |
| cfnreg | no registrado | Desví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 Regla | Condición | Descripción |
|---|---|---|
| all | (ninguna) | Bloquear todas las llamadas entrantes |
| international | internacional | Bloquear llamadas de números internacionales |
| international-exHC | internacional-exHC | Bloquear llamadas internacionales excepto del país de origen |
| roaming | roaming | Bloquear 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:
- El dispositivo del usuario ya tiene una sesión de datos activa (contexto PDP/PDN)
- El servidor XCAP extrae la IP de origen de la conexión HTTP
- El servidor consulta al PCRF del HSS para resolver IP → identidad del suscriptor
- El usuario inicia sesión automáticamente - no se requiere nombre de usuario/contraseña
- 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ón | Método | URL XCAP | Descripción |
|---|---|---|---|
| Obtener todos los servicios | GET | /users/{sip}/simservs.xml | Recuperar documento completo de simservs |
| Obtener reglas CF | GET | /users/{sip}/simservs.xml/~~/simservs/communication-diversion | Obtener todas las reglas de desvío de llamadas |
| Obtener regla CF específica | GET | /users/{sip}/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/{rule_id} | Obtener una sola regla CF (cfa, cfb, etc.) |
| Actualizar regla CF | PUT | /users/{sip}/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/{rule_id} | Actualizar regla de desvío de llamadas |
| Actualizar condición CF | PUT | /users/{sip}/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/{rule_id}/{element} | Actualizar elemento de regla (target, condition) |
| Establecer NoReplyTimer | PUT | /users/{sip}/simservs.xml/~~/simservs/communication-diversion/NoReplyTimer | Cambiar tiempo de espera en caso de no respuesta |
| Obtener ID de llamada | GET | /users/{sip}/simservs.xml/~~/simservs/originating-identity-presentation-restriction | Obtener configuración de restricción de ID de llamada |
| Obtener CB entrante | GET | /users/{sip}/simservs.xml/~~/simservs/incoming-communication-barring/cp:ruleset/{rule_id} | Obtener regla de bloqueo entrante |
| Actualizar CB entrante | PUT | /users/{sip}/simservs.xml/~~/simservs/incoming-communication-barring/cp:ruleset/{rule_id} | Actualizar regla de bloqueo entrante |
| Obtener CB saliente | GET | /users/{sip}/simservs.xml/~~/simservs/outgoing-communication-barring/cp:ruleset/{rule_id} | Obtener regla de bloqueo saliente |
| Actualizar CB saliente | PUT | /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 HTTP | Significado | Descripción |
|---|---|---|
| 200 OK | Éxito | Operación completada con éxito |
| 401 No Autorizado | Autenticación Requerida | Desafío de autenticación BSF/GBA (si está habilitado) |
| 404 No Encontrado | Recurso No Encontrado | Suscriptor o documento no existe |
| 409 Conflicto | Conflicto | Desajuste de versión del documento (conflicto de ETag) |
| 500 Error Interno del Servidor | Error del Servidor | Fallo en la comunicación HSS o error de procesamiento |
Puntos Finales de la Interfaz Web
| Punto Final | Método | Propósito |
|---|---|---|
/ | GET | Página de información del suscriptor (búsqueda por IP) |
/call_forwarding | GET | Mostrar formulario de gestión de desvío de llamadas |
/call_forwarding | POST | Actualizar regla de desvío de llamadas a través de la interfaz web |
/api | GET | Documentació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ón | Título | Descripción | URL |
|---|---|---|---|
| ETSI TS 183 063 | Servicios de simulación PSTN/ISDN basados en IMS | Especificación principal que define el esquema XML de simservs para servicios suplementarios IMS | Portal ETSI |
| 3GPP TS 24.623 | Protocolo de Acceso a la Configuración (XCAP) sobre la interfaz Ut para Manipulación de Servicios Suplementarios | Define la interfaz XCAP Ut entre UE y servidor de aplicaciones para configuración de servicios suplementarios | Portal 3GPP |
| 3GPP TS 24.238 | Configuración de usuario basada en el Protocolo de Inicio de Sesión (SIP); Etapa 3 | Especifica mecanismos basados en SIP para la gestión de configuración de usuarios en IMS | Portal 3GPP |
| 3GPP TS 33.220 | Arquitectura de Autenticación Genérica (GAA); Arquitectura de Arranque Genérico (GBA) | Define el marco BSF y GBA para la seguridad de credenciales de arranque | Portal 3GPP |
| 3GPP TS 24.229 | Protocolo 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 3 | Especificación central de control de llamadas IMS que incluye disparadores de servicio y ejecución de servicios suplementarios | Portal 3GPP |
| 3GPP TS 29.228 | Interfaces Cx y Dx del Subsistema Multimedia (IM); Flujos de señalización y contenidos de mensajes | Define la interfaz Diameter Cx/Dx entre S-CSCF y HSS (relacionado con la recuperación del perfil de usuario) | Portal 3GPP |
| 3GPP TS 29.328 | Interfaz Sh del Subsistema Multimedia (IM); Flujos de señalización y contenidos de mensajes | Define la interfaz Diameter Sh entre AS y HSS para acceso a datos de usuario | Portal 3GPP |
RFCs del IETF
| RFC | Título | Descripción | URL |
|---|---|---|---|
| RFC 4825 | Protocolo de Acceso a la Configuración XML (XCAP) | Especificación base del protocolo XCAP que define la manipulación de documentos XML basada en HTTP | IETF Datatracker |
| RFC 4745 | Política Común: Un Formato de Documento para Expresar Preferencias de Privacidad | Define el espacio de nombres XML de política común utilizado para condiciones de reglas en documentos XCAP | IETF Datatracker |
| RFC 2617 | Autenticación HTTP: Autentic |