Utilisation de framed pools dans L2 BNG

August 31, 2023
BNG/BRAS
Utilisation de framed pools dans L2 BNG
En réponse à une demande de l'un de nos clients, les développeurs de VAS Experts ont mis en place une nouvelle option dans Stingray Service Gateway : la prise en charge des pools d'adresses IP, qui rend la plateforme plus flexible. Grâce à l'interaction avec les serveurs DHCP standard, il est désormais possible d'utiliser la fonction BNG de SSG avec des systèmes de facturation qui ne disposent pas d'un mécanisme natif d'émission d'adresses, sans avoir recours à des solutions de scripting tierces.

Description du cas d’utilisation

  • Client avec type d’accès Q-in-Q
  • FastDPI — gestion du trafic et police
  • FastPCRF — Proxy des demandes entre fastDPI et Radius
  • Serveur Radius — reçoit les demandes de FastPCRF et génère des réponses avec les attributs spécifiés
  • Routeur — responsable de la transmission des paquets vers l’Internet et du routage en retour
  • Serveur DHCP — responsable de l’attribution des adresses IP à partir du pool spécifié.

l2-bras-scenario

Algorithme de fonctionnement du SSG

A partir de la version 8.4 du SSG, la prise en charge des pools d’adresses IP pour les modes PPPoE et DHCP Radius Proxy est disponible.

Auparavant, dans ces modes, le SSG s’attendait à recevoir du serveur Radius les paramètres réseau de l’abonné dans Access-Accept. Désormais, il est possible d’indiquer le nom du pool d’adresses à partir duquel le serveur DHCP doit allouer les adresses aux abonnés.

Il est possible de transmettre le nom du pool au serveur DHCP en utilisant plusieurs options, telles que 125, 77 et 60 pour IPv4, et 15, 17 pour IPv6.

Dans notre cas, nous utiliserons l’option 125 pour IPv4 et 17 pour IPv6, puisque ces options sont toujours ajoutées dans la requête. Ainsi, la probabilité que des données critiques soient écrasées est nulle.

Pour utiliser d’autres options, vous devez configurer le serveur DHCP et le SSG en conséquence.

Configuration de fastPCRF

Pour configurer le SSG, en plus de la configuration de base du BRAS L2, vous devez spécifier les adresses des serveurs DHCP et l’option par laquelle le nom du pool doit être transmis.

Déploiement et configuration d’un serveur dhcpd4 à l’aide de namespace

Pour commencer, nous allons déployer un autre serveur DHCP sur le même serveur où le SSG est déjà installé, et il ne sera disponible que pour la plateforme SSG. Cela est dû à l’existence de diverses politiques d’entreprise qui réglementent l’utilisation des serveurs DHCP pour desservir le réseau interne et les abonnés de l’opérateur.

Pour ce faire, nous limiterons les interfaces que notre serveur DHCP « écoutera » et les serveurs auxquels il répondra. Les serveurs DHCP seront exécutés dans des espaces de noms autres que l’espace de noms commun du réseau. Nous allons exécuter les serveurs DHCP dans des espaces de noms différents de l’espace de noms du réseau commun.

Commençons par créer namespace :

# ip netns add DHCP

Créer un veth :

# ip link add veth0 type veth peer name veth1

Placer l’interface dans namespace:

# ip link set veth1 netns DHCP

Activez les interfaces et attribuez-leur des adresses :

# 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

Modifier le fichier de configuration du serveur DHCP :

#Déclaration de la structure opt125 pour 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;

#Adresses des serveurs DNS
option domain-name-servers 192.168.1.4, 8.8.8.8;

#Réglage de la durée de location
default-lease-time 600;
max-lease-time 7200;

log-facility local7;

#Déclarer des classes
class "vas-pool" {
  match if option VASEX.poolname = "test-pool";
}

shared-network MyNetwork {

#Déclarer un sous-réseau pour le relais, interdire l'émission d'adresses à partir de ce sous-réseau à des clients inconnus
  subnet 192.168.10.0 netmask 255.255.255.252 {
  deny unknown-clients;
  }

#Déclarer un sous-réseau pour la classe 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";
    }
  }
}

Exécuter ISC DHCP dans l'espace de noms DHCP :

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

Déploiement et configuration des serveurs kea dhcp6

Nous utiliserons le serveur KEA comme serveur DHCP IPv6.

Le fichier de configuration doit ressembler à ceci :

{

"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
    }]
}
}

Il convient de noter que le serveur DHCP de KEA pour IPv6 ne fonctionne pas correctement sur les adresses locales de liaison, nous utiliserons donc des adresses IPv6 globales.

Créons un autre espace de noms et nommons-le DHCP6 :

# ip netns add DHCP6

Créer un veth :

# ip link add veth2 type veth peer name veth3

Placer l’interface dans namespace:

# ip link set veth3 netns DHCP6

Activez les interfaces et attribuez-leur des adresses :

# 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

L’attribut Framed-Pool est présent dans Access-Accept lorsque le client est connecté :

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"

Une fois la connexion établie, nous vérifions si les adresses ont été émises correctement :

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

Pour automatiser la création de l’espace de noms, nous allons écrire le script createNetworkNamespace.sh et l’ajouter à autorun (n’oubliez pas d’accorder des permissions pour exécuter ce script) :

#!/bin/bash

#Si vous obtenez "Object "netns" is unknown, try "ip help"", alors vous devriez installer ce module.
#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

#Ajouter un nouvel namespace
ip netns add dhcp

#Ajouter un nouveau lien
ip link add veth0 type veth peer name veth1

#Définir veth dans namespace dhcp
ip link set veth1 netns dhcp

#Activer l'interface
ip netns exec dhcp ip link set lo up
ip netns exec dhcp ip link set veth1 up
ip link set veth0 up

#Attribuer des adresses IP aux 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

#Exécuter dhcpd dans namespace
ip netns exec dhcp dhcpd -cf /etc/dhcp/dhcpd.conf

#Ajouter un nouvel namespace
ip netns add dhcp6

#Ajouter un nouveau lien
ip link add veth2 type veth peer name veth3

#Définir veth dans namespace dhcp
ip link set veth3 netns dhcp6

#Activer l'interface
ip link set veth2 up
ip netns exec dhcp6 ip link set lo up
ip netns exec dhcp6 ip link set veth3 up

#Attribuer des adresses IP aux 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

#Exécuter kea dans namespace

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

Nous allons l’ajouter à l’exécution automatique via rc.local. Pour ce faire, ajoutez une ligne comme celle-ci à ce fichier :

sh /your/path/to/createNetworkNamespace.sh

Lors du redémarrage du serveur, les espaces de noms nécessaires seront créés et les serveurs DHCP seront démarrés dans ces espaces de noms.

Le BNG basé sur le DPI est une solution qui permet non seulement de contrôler les abonnés, mais aussi de mesurer la qualité de l’expérience et d’équilibrer le trafic pour chaque abonné et chaque appareil. Contactez-nous pour en savoir plus sur la plateforme SSG et son utilisation sur les réseaux des fournisseurs de services.

Nous utilisons des cookies pour optimiser les fonctionnalités du site et vous offrir la meilleure expérience possible. Pour en savoir plus sur les cookies que nous utilisons, veuillez consulter notre Politique de cookies. En cliquant sur « Okay », vous acceptez notre utilisation des cookies. Learn more.