Uso de pools nomeados em L2 BNG

August 31, 2023
BNG/BRAS
Uso de pools nomeados em L2 BNG
Atendendo à solicitação de um dos clientes, os desenvolvedores da VAS Experts implementaram uma nova opção no Stingray Service Gateway: o suporte a pools de IPs, o que torna a plataforma mais flexível. Com a ajuda da interação com servidores DHCP padrão, agora é possível usar a função BNG do SSG com sistemas de faturamento que não têm um mecanismo nativo de emissão de endereços sem usar soluções de script de terceiros.

Descrição do caso de uso

  • Cliente com tipo de acesso Q-in-Q
  • FastDPI – tratamento e policiamento de tráfego
  • FastPCRF – solicitações de proxy entre fastDPI e Radius
  • Servidor Radius – recebe solicitações do fastPCRF e gera respostas com atributos especificados
  • Roteador – responsável pela transmissão de pacotes para a Internet e pelo roteamento de volta
  • Servidor DHCP – responsável pela alocação de endereços IP do pool especificado
  • .

l2-bras-scenario

Algoritmo de operação do SSG

A partir da versão 8.4 do SSG, está disponível o suporte a pools de endereços IP para os modos PPPoE e DHCP Radius Proxy.

Anteriormente, nesses modos, o SSG esperava receber os parâmetros de rede do assinante em Access-Accept do servidor Radius. Agora é possível emitir o nome do pool de endereços a partir do qual o servidor DHCP deve alocar endereços para os assinantes.

É possível passar o nome do pool para o servidor DHCP usando várias opções, como 125, 77 e 60 para IPv4 e 15 e 17 para IPv6.

No nosso caso, usaremos opção 125 para IPv4 e 17 para IPv6, , pois essas opções são sempre adicionadas na solicitação. Portanto, a probabilidade de que os dados críticos sejam substituídos é zero.

Para usar outras opções, você precisa configurar o servidor DHCP e o SSG adequadamente.

Configuração dofastPCRF

Para configurar o SSG, além da configuração básica do BRAS L2, é necessário especificar os endereços dos servidores DHCP e a opção pela qual o nome do pool deve ser passado.

Implantação e configuração de um servidor dhcpd4 usando namespace

Para começar, vamos implantar outro servidor DHCP no mesmo servidor em que o SSG já está instalado, e ele estará disponível somente para a plataforma SSG. Isso se deve à existência de várias políticas corporativas que regulam o uso de servidores DHCP para atender à rede interna e aos assinantes da operadora.

Para isso, limitaremos as interfaces que o nosso servidor DHCP “ouvirá” e limitaremos os servidores aos quais o servidor DHCP responderá. Os servidores DHCP serão executados em namespaces diferentes do namespace de rede comum. Executaremos os servidores DHCP nos namespaces diferentes do namespace de rede comum.

Primeiro, vamos criar um namespace:

# ip netns add DHCP

Crie o veth:

# ip link add veth0 type veth peer name veth1

Coloque a interface no namespace:

# ip link set veth1 netns DHCP

Habilite as interfaces e atribua endereços a elas:

# 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

Edite o arquivo de configuração do servidor DHCP:

#Declarando a estrutura 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 = encapsula o VASEX;
option vivso.iana code 0 = string;
option op125 code 125 = encapsular vivso;

#Endereços do servidor DNS
option domain-name-servers 192.168.1.4, 8.8.8.8;

#Definição do tempo de leasing
default-lease-time 600;
max-lease-time 7200;

log-facility local7;

#Declare as classes
classe "vas-pool" {
  corresponde se a opção VASEX.poolname = "test-pool";
}

shared-network MyNetwork {

#Declare uma sub-rede para retransmissão, proíba a emissão de endereços dela para clientes desconhecidos
  subnet 192.168.10.0 netmask 255.255.255.252 {
  deny unknown-clients;
  }

#Declare a sub-rede para a classe vas-pool
  subnet 192.168.3.0 netmask 255.255.255.0 {
    pool {
      intervalo 192.168.3.10 192.168.3.100;
      permitir membros de "vas-pool";
    }
  }
}

Execute o ISC DHCP no namespace DHCP:

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

Implantação e configuração dos servidores kea dhcp6

Usaremos o servidor KEA como servidor DHCP IPv6.

Vamos fazer com que o arquivo de configuração tenha a seguinte aparência:

{

"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-reclaimed-leases": 100,
        "max-reclaim-time": 250,
        "unwarned-reclaim-cycles": 5
    },

    "renew-timer": 120,
    "rebind-timer": 240,
    "preferred-lifetime" (tempo de vida preferido): 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" (gravidade): "DEBUG",
        "debuglevel": 99
    }]
}
}

Deve-se observar que o servidor DHCP do KEA para IPv6 não funciona corretamente em endereços locais de link, portanto, usaremos endereços IPv6 globais.

Vamos criar outro namespace e nomeá-lo DHCP6:

# ip netns add DHCP6

Crie o veth:

# ip link add veth2 type veth peer name veth3

Coloque a interface dentro do namespace:

# ip link set veth3 netns DHCP6

Habilite as interfaces e atribua endereços a elas:

# 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

Há o atributo Framed-Pool em Access-Accept quando o cliente está conectado:

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"

Depois que a conexão é estabelecida, verificamos se os endereços foram emitidos corretamente:

Rec#0
  MAC=18:0F:76:01:05:19 login='testuser'
  SessionId=0x01bc (net=0xbc01) phase=[3] network
  Tempo (now=764039602395618 ticks)
         criado: 2020/01/27 14:33:55, -427.849052s (762838183927452 ticks)
     último pacote: 2020/01/27 14:41:02, -0.805806s (764037339656521 ticks)
     início da fase: 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:
    Estado do LCP [9] aberto
    contadores: 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
      próxima renovação: 2020/01/27 14:41:56, +53.178381s (764188929568748 ticks)
    Estado do IPCP [9] aberto
    contadores: restart=10, failure=5, peer-failure=0, terminate=2
    ts_retrans: 2020/01/27 14:33:57, -425.829547s (762843854783043 ticks)
    request_id=1
    Pacote/bytes de estatísticas: 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
      próxima renovação: 2020/01/27 14:43:33, +150.472972s (764462136946903 ticks)
    Estado do IP6CP [9] aberto
    contadores: 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
    Pacote/bytes de estatísticas: subs->inet=71/8712, inet->subs=0/0

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

Para automatizar a criação do namespace, escreveremos o script createNetworkNamespace.sh e o adicionaremos à execução automática (lembre-se de conceder permissões para executar esse script):

#!/bin/bash

#Se você receber a mensagem "Object "netns" is unknown, try "ip help".", então você deve instalar estes módulos
#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

#Adicionar novo espaço de nome
ip netns add dhcp

#Adicionar novo link
ip link add veth0 type veth peer name veth1

#Define o veth para o namespace dhcp
ip link set veth1 netns dhcp

#Ativar a interface
ip netns exec dhcp ip link set lo up
ip netns exec dhcp ip link set veth1 up
ip link set veth0 up

#Definir endereços IP para as 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

#Executar o dhcpd no namespace
ip netns exec dhcp dhcpd -cf /etc/dhcp/dhcpd.conf

#Adicionar novo namespace
ip netns add dhcp6

#Adicionar novo link
ip link add veth2 type veth peer name veth3

#Define o veth para o namespace dhcp
ip link set veth3 netns dhcp6

#Ativar a interface
ip link set veth2 up
ip netns exec dhcp6 ip link set lo up
ip netns exec dhcp6 ip link set veth3 up

#Definir endereços IP para as 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

#Executar o kea no namespace

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

Nós o adicionaremos à execução automática por meio do rc.local. Para fazer isso, adicione uma linha como esta a esse arquivo:

sh /your/path/to/createNetworkNamespace.sh

Agora, quando o servidor for reinicializado, os namespaces necessários serão criados e os servidores DHCP serão iniciados nesses namespaces.

O DPI-based BNG é uma solução que permite não apenas o policiamento de assinantes, mas também métricas de qualidade de experiência e balanceamento de tráfego para cada assinante e dispositivo. Entre em contato conosco para saber mais sobre a plataforma SSG e seu uso em redes de provedores de serviços.

Assine nosso boletim informativo e fique atualizado sobre os últimos desenvolvimentos e ofertas especiais.

(English) We use cookies to optimize site functionality and give you the best possible experience. To learn more about the cookies we use, please visit our Cookies Policy. By clicking ‘Okay’, you agree to our use of cookies. Learn more.