11. Interceptación legal y validación en LEA
Esta prueba permite validar que el BNG envía tráfico interceptado hacia el LIG/LEA y que el panel web y las APIs reflejan los flujos del suscriptor ONT-001.
11.0 Seleccionar el escenario antes de empezar
Antes de activar LI, confirma en qué escenario estás:
| Escenario | Cómo aparece el suscriptor en el BNG | WAN principal para ATP 11 | Script |
|---|---|---|---|
| RADIUS normal | ONT-001 | wan2 | ont1-subscriber-traffic.sh |
| Fallback a LUDB | normalmente <MAC>|<SAP> | wan1 | ont1-subscriber-traffic.sh |
| Alternativa PPPoE | ONT-002 / test@test.com | ppp0 | ont2-subscriber-traffic.sh |
Pre-check recomendado:
A:admin@MASTER# show service active-subscribers
Resultado esperado:
- sin fallback AAA a LUDB,
ONT-001debe verse como alias normal y el flujo más simple para ATP 11 eswan2 - con fallback a LUDB, usa el
subscriber-idactivo exacto que devuelve el BNG y mantén toda la corrida sobre esa misma WAN
Todos los scripts de tráfico mencionados en esta sección están en configs/cbot/scripts/.
Regla práctica para li-source:
- antes de fallback a LUDB, el identificador que funciona de forma consistente es el alias del suscriptor, por ejemplo
subscriber "ONT-001" - después de fallback a LUDB, ese alias puede dejar de resolver y el identificador correcto pasa a ser el
subscriber-idactivo exacto que devuelve el BNG, por ejemplo00:d0:f6:01:01:01|1/1/c2/1:50.150 - no hay un único valor de
subscriberque sea universal para ambos estados - si necesitas algo reutilizable, primero descubre el identificador activo real y luego construye
li-sourcecon ese valor
Nota importante sobre iperf3:
- los scripts
ont1-subscriber-traffic.shyont2-subscriber-traffic.shfijanIPERF_MSS=1400por defecto - esto evita el caso visto en laboratorio donde la sesión TCP negociaba un
MSSjumbo cercano a9440, enviaba un burst inicial y luego quedaba sin tráfico sostenido - si sobrescribes
IPERF_MSS, mantén un valor conservador o valida tú mismo que el camino soporte segmentos TCP grandes de forma estable
11.1 Levantar el servidor TCP de prueba
Iniciar iperf3 sobre el nodo dns:
bash configs/cbot/scripts/dns-iperf-server.sh start
Verificar que escuche en 2001:db8:aaaa::2:5201:
bash configs/cbot/scripts/dns-iperf-server.sh status
Resultado esperado:
statusdebe mostrar una líneaLISTENpara2001:db8:aaaa::2:5201- si
statusno muestra el listener, no continúes conuploadodownload
11.2 Activar la interceptación en el BNG
Desde el usuario liadmin en el BNG activo:
- sin haber aplicado fallback a LUDB, el flujo validado más simple es usar
subscriber "ONT-001" - si ya aplicaste fallback a LUDB,
ONT-001deja de aparecer como alias en el BNG; en ese caso usa elsubscriber-idactivo exacto que devuelveshow service active-subscribers ONT-002también puede usarse como alternativa PPPoE, pero el ATP principal sigue siendoONT-001porque es el camino más claro para IPoE
A:liadmin@MASTER# li private
[pr:/li]
A:liadmin@MASTER# li-source "li-dest-1" subscriber "ONT-001" ingress true
A:liadmin@MASTER# li-source "li-dest-1" subscriber "ONT-001" egress true
A:liadmin@MASTER# li-source "li-dest-1" subscriber "ONT-001" intercept-id 1001
A:liadmin@MASTER# li-source "li-dest-1" subscriber "ONT-001" session-id 1
A:liadmin@MASTER# log log-id "1" netconf-stream "li"
A:liadmin@MASTER# log log-id "1" source li true
A:liadmin@MASTER# log { log-id "1" destination netconf }
A:liadmin@MASTER# commit
Nota:
- el LIG de este laboratorio consume el mirror UDP (
ip-udp-shim) del BNG - el
netconf-stream "li"sigue siendo útil como referencia operativa, pero el panel LEA mostrado en el lab se alimenta del listener UDP en el puerto11111 - si el ATP se ejecuta con AAA en fallback a LUDB, el
subscriber-idpuede dejar de serONT-001y aparecer como<MAC>|<SAP>enshow service active-subscribers - en ese escenario, la forma más precisa de activar LI es usar el
subscriber-idreconstruido que devuelve el BNG; el uso porSAPpuede mezclar tráfico de otras sesiones si comparten el mismo circuito - el alcance de la captura depende de cómo configures
li-source: por alias de suscriptor, porsubscriber-idexacto o por el contexto real de la sesión activa - para ATP conviene usar la identidad exacta que devuelve el BNG en esa corrida, porque así evitas mezclar tráfico de otras sesiones
Ejemplo usando el subscriber activo exacto en fallback a LUDB:
A:liadmin@MASTER# li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" ingress true
A:liadmin@MASTER# li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" egress true
A:liadmin@MASTER# li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" intercept-id 2004
A:liadmin@MASTER# li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" session-id 1
A:liadmin@MASTER# commit
Configuración exacta usada en las pruebas validadas de esta corrida:
[pr:/li]
A:liadmin@MASTER# info flat
li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" ingress true
li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" egress true
li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" intercept-id 2101
li-source "li-dest-1" subscriber "00:d0:f6:01:01:01|1/1/c2/1:50.150" session-id 1
log log-id "1" netconf-stream "li"
log log-id "1" source li true
log { log-id "1" destination netconf }
Lectura operativa de esa configuración:
- la captura quedó amarrada al
subscriber-idexacto dewan1 - por eso en esta validación las consultas API correctas usan
intercept-id 2101 - por eso también las pruebas funcionales de tráfico se alinearon con
ONT_WAN=wan1 - esa misma sintaxis no es la recomendada cuando AAA todavía no ha hecho fallback a LUDB; en ese caso normalmente debes interceptar
subscriber "ONT-001"
Importante:
- el script
configs/cbot/scripts/ont1-subscriber-traffic.shaceptaONT_WAN=wan1|wan2|wan3y resuelve automáticamente la IPv6 activa de esa WAN - sin fallback AAA a LUDB, la opción validada más simple es usar
ONT_WAN=wan2, porque coincide con el flujo dual-stack normal deONT-001 wan1también puede usarse sin fallback si interceptasteONT-001y quieres validar específicamente esa WAN; no es la ruta principal del ATP porquewan2deja una validación más representativa del caso dual-stack normal- si vienes de fallback a LUDB, usa la WAN que corresponda al
subscriber-idreconstruido que elegiste - en la validación actual del laboratorio, el caso correcto para
ONT-001en fallback a LUDB esONT_WAN=wan1 - no mezclar
wan1ywan2en la misma corrida del ATP 11; si interceptaste00:d0:f6:01:01:01|1/1/c2/1:50.150, todas las pruebas deben salir porwan1 - ejecutar
upload,downloadydns64en secuencia, no en paralelo - para ATP usar
PARALLEL=1; valores mayores vuelven la prueba más frágil y no aportan valor funcional para LEA - los scripts ya fijan
IPERF_MSS=1400por defecto para evitar el burst inicial sin tráfico sostenido configs/cbot/scripts/ont2-subscriber-traffic.shtambién quedó preparado para validarONT-002si quieres una prueba alternativa PPPoE
Comprobación rápida:
Caso sin fallback:
ONT_USER=user ONT_PASS=test ONT_WAN=wan2 bash configs/cbot/scripts/ont1-subscriber-traffic.sh show-bind
Caso alternativo sin fallback sobre wan1:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh show-bind
Caso con fallback a LUDB:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh show-bind
Resultado esperado:
- sin fallback:
ONT_WAN=wan2INTERFACE=eth3.200ONT_BIND_V6=<IPv6 WAN activa de ONT-001 en wan2>
- alternativa válida sin fallback:
ONT_WAN=wan1INTERFACE=eth1.150ONT_BIND_V6=<IPv6 WAN activa de ONT-001 en wan1>
- con fallback:
ONT_WAN=wan1INTERFACE=eth1.150ONT_BIND_V6=<IPv6 WAN activa de ONT-001 en wan1>
11.3 Generar tráfico TCP desde ONT1
Caso sin fallback a LUDB:
ONT_USER=user ONT_PASS=test ONT_WAN=wan2 DURATION=12 PARALLEL=1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh upload
Caso alternativo sin fallback sobre wan1:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 DURATION=12 PARALLEL=1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh upload
Caso con fallback a LUDB sobre el subscriber reconstruido de ONT-001:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 DURATION=12 PARALLEL=1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh upload
No lanzar este comando en paralelo con download o dns64.
Si necesitas otra sesión, cambia ONT_WAN o usa ONT_BIND_V6 explícito. Lo importante es que el tráfico salga por la misma sesión que interceptaste en el BNG.
Internamente ejecuta:
iperf3 -6 -c 2001:db8:aaaa::2 -B <IPv6-activa-de-la-WAN-elegida> -p 5201 -t 12 -P 1 -M 1400
En LEA se deben observar eventos similares a:
PROTO = TCPIP ORIGEN = IPv6 activa de la WAN elegidaIP DESTINO = 2001:db8:aaaa::2P.ORIGcon puertos efímeros altosP.DESTigual a5201
Nota operativa:
- después del fix de
MSS,iperf3debe mostrar tráfico sostenido en vez de sólo un burst inicial - el throughput exacto no es un KPI del ATP; lo importante es que la sesión TCP se mantenga y que el LEA registre eventos
INGRESSyEGRESS - si vuelves a ver
256 KBytesen el primer segundo y luego0.00 bits/sec, revisa que no hayas sobrescritoIPERF_MSS
Referencia visual del resultado esperado en LEA:

11.4 Generar tráfico en sentido inverso
Sin fallback:
ONT_USER=user ONT_PASS=test ONT_WAN=wan2 DURATION=12 PARALLEL=1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh download
Alternativa sin fallback sobre wan1:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 DURATION=12 PARALLEL=1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh download
Con fallback:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 DURATION=12 PARALLEL=1 bash configs/cbot/scripts/ont1-subscriber-traffic.sh download
Resultado esperado:
- el comando no debe terminar con
Connection refused - el comando no debe terminar con
control socket has closed unexpectedly - en LEA deben aparecer flujos TCP desde
2001:db8:aaaa::2:5201hacia la IPv6 de la WAN elegida clasificados comoEGRESS
11.5 Generar tráfico DNS64/UDP
Sin fallback:
ONT_USER=user ONT_PASS=test ONT_WAN=wan2 DURATION=10 bash configs/cbot/scripts/ont1-subscriber-traffic.sh dns64
Alternativa sin fallback sobre wan1:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 DURATION=10 bash configs/cbot/scripts/ont1-subscriber-traffic.sh dns64
Con fallback:
ONT_USER=user ONT_PASS=test ONT_WAN=wan1 DURATION=10 bash configs/cbot/scripts/ont1-subscriber-traffic.sh dns64
En LEA esto suele verse como:
PROTO = UDPIP DESTINO = 2001:db8:aaaa::2P.DEST = 53
Referencia visual del resultado esperado en LEA para DNS64/UDP:

11.6 Detener y revisar el servidor de pruebas
Detener iperf3:
bash configs/cbot/scripts/dns-iperf-server.sh stop
Ver logs del servidor:
bash configs/cbot/scripts/dns-iperf-server.sh logs
11.7 Consultar las APIs del LEA
Prerequisitos en el host desde donde vas a consultar la API:
sudo apt install jq curl
Resumen general:
curl -s http://10.99.1.12:8080/api/stats | jq
Ultimos eventos:
curl -s 'http://10.99.1.12:8080/api/events?limit=20' | jq
Eventos de una interceptación específica:
curl -s 'http://10.99.1.12:8080/api/events?limit=100&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' | jq
Resumen de interceptaciones:
curl -s http://10.99.1.12:8080/api/intercepts | jq
11.8 Consultas útiles sobre los eventos
Antes de ejecutar estos comandos, reemplaza explícitamente <INTERCEPT_ID_USADO_EN_LI> por el intercept-id real que configuraste en li-source.
Ejemplo:
Si en LI configuraste:
intercept-id 1001
entonces debes cambiar:
<INTERCEPT_ID_USADO_EN_LI>
por:
1001
Top protocolos observados:
curl -s 'http://10.99.1.12:8080/api/events?limit=500&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' \
| jq -r 'group_by(.proto)[] | "\(.[0].proto): \(length)"'
Top IPs origen:
curl -s 'http://10.99.1.12:8080/api/events?limit=500&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' \
| jq -r 'group_by(.src_ip)[] | "\(.[0].src_ip): \(length)"'
Top IPs destino:
curl -s 'http://10.99.1.12:8080/api/events?limit=500&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' \
| jq -r 'group_by(.dst_ip)[] | "\(.[0].dst_ip): \(length)"'
Top puertos destino:
curl -s 'http://10.99.1.12:8080/api/events?limit=500&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' \
| jq -r 'map(select(.dst_port != null)) | group_by(.dst_port)[] | "\(.[0].dst_port): \(length)"'
Separación de tráfico INGRESS y EGRESS:
curl -s 'http://10.99.1.12:8080/api/events?limit=500&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' \
| jq -r 'group_by(.direction)[] | "\(.[0].direction): \(length)"'
Flujos únicos src_ip:src_port -> dst_ip:dst_port:
curl -s 'http://10.99.1.12:8080/api/events?limit=500&intercept_id=<INTERCEPT_ID_USADO_EN_LI>' \
| jq -r '.[] | "\(.proto) \(.src_ip):\(.src_port) -> \(.dst_ip):\(.dst_port)"' \
| sort | uniq -c
11.9 Consideraciones operativas
- Si las APIs devuelven contadores en cero o listas vacías, normalmente no hay tráfico interceptado activo en ese momento.
- Si el
li-sourcese configura en el BNG equivocado, el LIG no verá paquetes aunque el panel esté operativo. - Si
ONT-001desaparece por fallback a LUDB, no lo sustituyas automáticamente porONT-002. Primero revisashow service active-subscribersy usa elsubscriber-idactivo exacto deONT-001. - Sin fallback AAA a LUDB, la corrida principal de ATP 11 para
ONT-001se hace sobrewan2. wan1también es válida sin fallback si quieres observar esa sesión en particular.- En fallback a LUDB, la corrida validada de ATP 11 para
ONT-001se hace sobrewan1. - La WAN correcta siempre debe corresponder a la identidad que hayas interceptado en
li-source. - Si interceptas por
subscriber-idexacto, consulta la API con eseintercept-idreal y genera tráfico por esa misma sesión. - Si AAA todavía está normal, no asumas que el
subscriber-idestilo<MAC>|<SAP>servirá para LI; en ese estado usa el alias del suscriptor que expone el BNG, por ejemploONT-001. - Si buscas un método genérico, el enfoque correcto no es fijar un string único sino resolver primero la identidad activa del suscriptor y usar esa identidad en la captura.
- Si pruebas
wan3o mezclaswan1ywan2en la misma corrida, eso ya es otra validación distinta y no debe mezclarse con el ATP principal. ONT-002también puede validarse ahora por LEA, porque el parser del LIG ya decodifica PPPoE session con IPv6/IPv4.- Para la validación más clara del LEA, combinar una prueba TCP (
iperf3) y otra UDP (dns64) permite distinguir rápidamente los protocolos en la interfaz. - Si
iperf3vuelve a caer en un burst inicial seguido de0.00 bits/sec, la causa más probable es que se esté usando unMSSdemasiado grande para ese camino de laboratorio. Vuelve a probar con el valor por defectoIPERF_MSS=1400.