Utilización de "named framed pools" en L2 BNG

August 31, 2023
BNG/BRAS
Utilización de "named framed pools" en L2 BNG
En respuesta a la petición de uno de los clientes, los desarrolladores de VAS Experts implementaron una nueva opción en Stingray Service Gateway: la compatibilidad con pools de IP`s, que hace que la plataforma sea más flexible. Con la ayuda de la interacción con servidores DHCP estándar, ahora es posible utilizar la función BNG de SSG con sistemas de facturación que no disponen de un mecanismo nativo de emisión de direcciones sin utilizar soluciones de secuencias de comandos de terceros.

Descripción del caso de uso

  • Cliente con tipo de acceso Q-in-Q
  • FastDPI — gestión y control del tráfico
  • FastPCRF — peticiones proxy entre fastDPI y Radius
  • Servidor Radius — recibe solicitudes de fastPCRF y genera respuestas con atributos especificados
  • Enrutador — responsable de transmitir paquetes a Internet y enrutar de vuelta
  • Servidor DHCP — responsable de la asignación de direcciones IP del pool especificado.

l2-bras-scenario

Algoritmo de funcionamiento de SSG

A partir de la versión 8.4 de SSG, está disponible el soporte para grupos de direcciones IP para los modos PPPoE y DHCP Radius Proxy.

Anteriormente, en estos modos, SSG esperaba recibir los parámetros de red del suscriptor en Access-Accept desde el servidor Radius. Ahora es posible emitir el nombre del pool de direcciones desde el cual el servidor DHCP debe asignar direcciones a los suscriptores.

Es posible pasar el nombre del pool al servidor DHCP utilizando varias opciones, como 125, 77 y 60 para IPv4, y 15, 17 para IPv6.

En nuestro caso, utilizaremos la opción 125 para IPv4 y 17 para IPv6, ya que estas opciones se añaden siempre en la solicitud. Así, la probabilidad de que se sobrescriban datos críticos es cero.

Para utilizar otras opciones, es necesario configurar el servidor DHCP y el SSG en consecuencia.

Configuración fastPCRF

Para configurar SSG, además de la configuración básica de L2 BRAS, hay que especificar las direcciones de los servidores DHCP y la opción por la que se debe pasar el nombre del pool.

Despliegue y configuración de un servidor dhcpd4 usando namespace

Para empezar, vamos a desplegar otro servidor DHCP en el mismo servidor donde ya está instalado el SSG, y va a estar disponible sólo para la plataforma SSG. Esto es debido a la existencia de varias políticas corporativas que regulan el uso de servidores DHCP para dar servicio a la red interna del operador y a los abonados.

Para ello, limitaremos las interfaces que nuestro servidor DHCP «escuchará» y limitaremos los servidores a los que el servidor DHCP responderá. Los servidores DHCP se ejecutarán en espacios de nombres distintos del espacio de nombres de red común. Vamos a ejecutar los servidores DHCP en los espacios de nombres que son diferentes del espacio de nombres de red común.

En primer lugar, vamos a crear un espacio de nombres:

# ip netns add DHCP

Crear veth:

# ip link add veth0 type veth peer name veth1

Coloca la interfaz en el espacio de nombres:

# ip link set veth1 netns DHCP

Habilita las interfaces y asígnales direcciones:

# ip netns exec DHCP ip link set lo up
# ip netns exec DHCP ip link set veth1 up
# ip link set veth0 up
# ip netns exec DHCP ip addr add 192.168.10.2/30 dev veth1
# ip addr add 192.168.10.1/30 dev veth0

Editar el archivo de configuración del servidor DHCP:

#Declarar la estructura opt125 para VASExperts
option space VASEX code width 1 length width 1;
option VASEX.poolname code 1 = string;
option space vivso code width 4 length width 1;
option vivso.VASEX code 43823 = encapsulate VASEX;
option vivso.iana code 0 = string;
option op125 code 125 = encapsulate vivso;

#Direcciones del servidor DNS
option domain-name-servers 192.168.1.4, 8.8.8.8;

#Establecer el tiempo de arrendamiento
default-lease-time 600;
max-lease-time 7200;

log-facility local7;

#Declarar clases
class "vas-pool" {
  match if option VASEX.poolname = "test-pool";
}

shared-network MyNetwork {

#Declarar una subred para retransmisión, prohibir la emisión de direcciones desde ella a clientes desconocidos
  subnet 192.168.10.0 netmask 255.255.255.252 {
  deny unknown-clients;
  }

#Declarar subred para la clase vas-pool
  subnet 192.168.3.0 netmask 255.255.255.0 {
    pool {
      range 192.168.3.10 192.168.3.100;
      allow members of "vas-pool";
    }
  }
}

Ejecutar ISC DHCP en el espacio de nombres DHCP:

# ip netns exec DHCP dhcpd -cf /etc/dhcp/dhcpd.conf

Despliegue y configuración de servidores kea dhcp6

Utilizaremos el servidor KEA como servidor DHCP IPv6.

Vamos a hacer que el archivo de configuración tenga este aspecto:

{

"Dhcp6": {

    "interfaces-config": {
        "interfaces": ["veth3/2a03:dec0:666:2::2"]
    },

    "control-socket": {
        "socket-type": "unix",
        "socket-name": "/tmp/kea-dhcp6-ctrl.sock"
    },

    "lease-database": {
        "type": "memfile",
        "persist": true,
        "lfc-interval": 3600
    },

    "expired-leases-processing": {
        "reclaim-timer-wait-time": 10,
        "flush-reclaimed-timer-wait-time": 25,
        "hold-reclaimed-time": 3600,
        "max-reclaim-leases": 100,
        "max-reclaim-time": 250,
        "unwarned-reclaim-cycles": 5
    },

    "renew-timer": 120,
    "rebind-timer": 240,
    "preferred-lifetime": 180,
    "valid-lifetime": 300,

    "option-data": [
        {
            "name": "dns-servers",
            "data": "2001:4860:4860::8888, 2001:db8:2::100"
        }

    ],
        "shared-networks":[{
                "name": "MyNetworks",
                "relay": {
                        "ip-address": "2a03:dec0:666:2::1"
                },
                "subnet6": [{
                                "client-class": "test-ipv6-pool",
                                "subnet": "2403:d4c0:aa::/48",
                                "reservation-mode" : "disabled",
                                "pd-pools": [{
                                           "prefix": "2403:d4c0:aa::",
                                           "prefix-len": 48,
                                           "delegated-len": 63
                                        }],
                                "option-data": [{
                                           "name": "dns-servers",
                                           "data": "2001:db8:2::dead:beef, 2001:db8:2::cafe:babe"
                                        }]
                }]
        }],

    "client-classes": [{
        "name": "test-ipv6-pool",
        "test": "vendor[43823].option[1].hex == 'test-ipv6-pool'"
    }]
},

"Logging":{
  "loggers": [{
        "name": "kea-dhcp6",
        "output_options": [
            {
                "output": "/var/log/kea-dhcp6.log",
                "flush": true
            }
        ],
        "severity": "DEBUG",
        "debuglevel": 99
    }]
}
}

Hay que tener en cuenta que el servidor DHCP de KEA para IPv6 no funciona correctamente en direcciones locales de enlace, por lo que utilizaremos direcciones IPv6 globales.

Creemos otro namespace y llamémoslo DHCP6:

# ip netns add DHCP6

Crear veth:

# ip link add veth2 type veth peer name veth3

Pon la interfaz dentro del namespace:

# ip link set veth3 netns DHCP6

Habilite las interfaces y asígneles direcciones:

# ip netns exec DHCP6 ip link set lo up
# ip netns exec DHCP6 ip link set veth3 up
# ip link set veth0 up
# ip netns exec DHCP6 ip addr add 2a03:dec0:666:2::2/64 dev veth3
# ip addr add 2a03:dec0:666:2::1/64 dev veth2

Hay el atributo Framed-Pool en Access-Accept cuando el cliente se conecta:

VasExperts-User-Name = "testuser"       
Framed-Pool = "test-pool"
Framed-IPv6-Pool = "test-ipv6-pool"
VasExperts-Enable-Service = "9:on"
VasExperts-Multi-IP-User = 1
VasExperts-Service-Profile = "11:user_nat"

Una vez establecida la conexión, comprobamos si las direcciones se han emitido correctamente:

Rec#0
  MAC=18:0F:76:01:05:19 login='testuser'
  SessionId=0x01bc (net=0xbc01) phase=[3] network
  Times (now=764039602395618 ticks)
         created: 2020/01/27 14:33:55, -427.849052s (762838183927452 ticks)
     last packet: 2020/01/27 14:41:02, -0.805806s (764037339656521 ticks)
     phase start: 2020/01/27 14:33:57, -425.829550s (762843854773358 ticks)
  session_timeout=0, idle_timeout=300, stop_reason=0
  idx_slave=1, idx_iface=0, pppoe_max_mru=1492, acct_started=0, ip4_rejected=0, ip6_rejected=0
  LCP:
    LCP state [9] opened
    counters: restart=10, failure=5, peer-failure=5, terminate=2
    ts_retrans: 2020/01/27 14:33:55, -427.785471s (762838362464891 ticks)
    MRU=1480 Auth-proto: [3] MS_CHAPv2
    request_id=0x34, service_req_id=0x01, my_magic_number=0x5f10c4ae, ping_counter=5
  IPCP:
    IP=192.168.3.13 GW=192.168.1.254 DNS1=192.168.1.4 DNS2=8.8.8.8
    Framed-Pool: [test-pool] DHCP-Server=192.168.10.2 lease-time=599
      next renew: 2020/01/27 14:41:56, +53.178381s (764188929568748 ticks)
    IPCP state [9] opened
    counters: restart=10, failure=5, peer-failure=0, terminate=2
    ts_retrans: 2020/01/27 14:33:57, -425.829547s (762843854783043 ticks)
    request_id=1
    Statistics packet/bytes: subs->inet=636/59860, inet->subs=0/0
  IP6CP:
    local=fe80::809a:d869:d86e:d032
    prefix=2403:d4c0:aa:2::/64
    PD=2403:d4c0:aa:3::/64
    Framed-IPv6-Pool: [test-ipv6-pool] Prefix=2403:d4c0:aa:2::/63 server-DUID=[0x0001000125BDB112C2DD08604508] lease-time=240
      next renew: 2020/01/27 14:43:33, +150.472972s (764462136946903 ticks)
    IP6CP state [9] opened
    counters: restart=10, failure=5, peer-failure=0, terminate=2
    ts_retrans: 2020/01/27 14:33:57, -425.826606s (762843863041510 ticks)
    peer_iface_id=3661548372820007552, dhcpv6_iid=1, request_id=1
    Statistics packet/bytes: subs->inet=71/8712, inet->subs=0/0

----------
TOTAL: 1 recs

Para automatizar la creación del namespace, escribiremos el script createNetworkNamespace.sh y lo añadiremos a autorun (recuerda conceder permisos para ejecutar este script):

#!/bin/bash

#If you get "Object "netns" is unknown, try "ip help".", then you should install this modules
#yum install -y https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/kernel-2.6.32-358.123.2.openstack.el6.x86_64.rpm
#yum install -y https://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm

#Añadir nuevo namespace
ip netns add dhcp

#Añadir nuevo enlace
ip link add veth0 type veth peer name veth1

#Establecer veth al namespace dhcp
ip link set veth1 netns dhcp

#Activar la interfaz
ip netns exec dhcp ip link set lo up
ip netns exec dhcp ip link set veth1 up
ip link set veth0 up

#Asignar direcciones IP a las interfaces
ip netns exec dhcp ip addr add 192.168.10.2/30 dev veth1
ip addr add 192.168.10.1/30 dev veth0

#Ejecutar dhcpd en namespace
ip netns exec dhcp dhcpd -cf /etc/dhcp/dhcpd.conf

#Añadir nuevo namespace
ip netns add dhcp6

#Añadir nuevo enlace
ip link add veth2 type veth peer name veth3

#Establecer veth al namespace dhcp
ip link set veth3 netns dhcp6

#Activar la interfaz
ip link set veth2 up
ip netns exec dhcp6 ip link set lo up
ip netns exec dhcp6 ip link set veth3 up

#Asignar direcciones IP a las interfaces
ip addr add 2a03:dec0:666:2::1/64 dev veth2
ip netns exec dhcp6 ip addr add 2a03:dec0:666:2::2/64 dev veth3

#Ejecutar kea en namespace

ip netns exec dhcp6 /usr/local/sbin/keactrl start -s dhcp6

Lo añadiremos a autorun a través de rc.local. Para ello, añade una línea como esta a este archivo:

sh /your/path/to/createNetworkNamespace.sh

Ahora, cuando se reinicie el servidor, se crearán los espacios de nombres necesarios y se iniciarán los servidores DHCP en estos espacios de nombres.

El BNG basado en DPI es una solución que permite no sólo la vigilancia de abonados, sino también métricas de calidad de experiencia y equilibrio de tráfico para cada abonado y dispositivo. Póngase en contacto con nosotros para obtener más información sobre la plataforma SSG y su uso en redes de proveedores de servicios.

Utilizamos cookies para optimizar la funcionalidad del sitio y ofrecerle la mejor experiencia posible. Para saber más sobre las cookies que utilizamos, visite nuestra Política de Cookies. Al hacer clic en "Aceptar", aceptas el uso que hacemos de las cookies. Más información