Кейс: использование named framed pools в режиме L2 BRAS

10.02.2020 | Артем Терещенко

В ответ на запрос одного из клиентов разработчики VAS Experts реализовали новую опцию СКАТ DPI: появилась поддержка пулов, что позволяет сделать работу платформы более универсальной. Появилась возможность использовать данный продукт с биллингами, у которых нет «родного» механизма выдачи адресов, без использования сторонних скриптовых решений, за счет взаимодействия со стандартными DHCP-серверами.

При использовании пулов вся нагрузка от управления адресами перекладывается на стандартный DHCP-сервер, который оператор уже использует в своей сетевой инфраструктуре. Если в сети что-то меняется, достаточно поправить конфигурацию уже привычного DHCP-сервера.

Framed pools для BRAS L2

Описание кейса

  • Клиент с типом доступа Q-in-Q
  • FastDPI — обработка трафика и применение политик
  • FastPCRF — проксирование запросов между fastDPI и Radius
  • Radius сервер — принимает запросы от fastPCRF и формирует ответы с заданными атрибутами
  • Router — отвечает за передачу пакетов в интернет и обратный маршрут, на текущий момент необходимо прописывать Static Route, т.к. в СКАТ нет поддержки OSPF и BGP (в плане на 2020 год)
  • DHCP-сервер — отвечает за выделение IP адресов из заданного пула.

DCHP сценарий

Алгоритм работы СКАТ DPI (формирование запросов, варианты поведения)

Поддержка пулов IP-адресов для режимов PPPoE и DHCP Radius Proxy появилась в СКАТ DPI с версии 8.4.

Ранее в данных режимах СКАТ ожидал получить сетевые параметры абонента в Access-Accept от Radius сервера. Теперь же имеется возможность выдать название пула адресов, из которых DHCP-серверу следует распределять адреса между абонентами.

Передать имя пула DHCP-серверу возможно с помощью нескольких опций, таких как 125, 77 и 60 для IPv4 и 15, 17 — для IPv6.

В рассматриваемом кейсе будем использовать опцию 125 для IPv4 и 17 для IPv6, так как данные опции всегда добавляются в запросе (чтобы использовать другую опцию, необходимо соответственно настроить DHCP-сервер и СКАТ на использование нужной вам опции). Соответственно, вероятность того, что перепишутся критичные данные, равна нулю.

Настройка fastPCRF

Для настройки СКАТ помимо основной конфигурации L2 BRAS необходимо указать адреса DHCP-серверов и через какую опцию следует передавать имя пула.

Развертывание и конфигурирование dhcpd4 сервера с использованием namespace

С учетом существования различных корпоративных политик, которые регулируют использование DHCP-серверов для обслуживания внутренней сети оператора и абонентов, в примере развернем еще один DHCP-сервер на том же сервере, где инсталлирован СКАТ DPI, который будет доступен только для СКАТ DPI. Для этого ограничим интерфейсы, которые будет «слушать» наш DHCP-сервер, и ограничим сервера, на запросы которых будет отвечать DHCP-сервер. DHCP-сервера будем запускать в пространствах имен, отличных от общего сетевого пространства имен.

Сперва создадим namespace:

# ip netns add DHCP

Создадим «виртуальный шнурок»:

# ip link add veth0 type veth peer name veth1

Поместим интерфейс внутрь namespace:

# ip link set veth1 netns DHCP

Включим интерфейсы и назначим им адреса:

# 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

Отредактируем конфигурационный файл DHCP-сервера:

#Объявление структуры opt125 для 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;

#Адреса DNS серверов
option domain-name-servers 192.168.1.4, 8.8.8.8;

#Установка времени «лиз»
default-lease-time 600;
max-lease-time 7200;

log-facility local7;

#Объявляем классы
class "vas-pool" {
  match if option VASEX.poolname = "test-pool";
}

shared-network MyNetwork {

#Объявляем подсеть для relay, запрещаем выдачу адресов из нее неизвестным клиентам
  subnet 192.168.10.0 netmask 255.255.255.252 {
  deny unknown-clients;
  }

#Объявляем подсеть для класса 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";
    }
  }
}

Запустим ISC DHCP в namespace DHCP:

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

Развертывание и конфигурация kea dhcp6 серверов

В качестве IPv6 DHCP-сервера будем использовать KEA сервер.

Приведем конфигурационный файл к виду:

{

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

Стоит отметить, что KEA DHCP-сервер для IPv6 не работает корректно на link local адресах, поэтому будем использовать глобальные IPv6 адреса.

Создадим еще один namespace и назовем DHCP6:

# ip netns add DHCP6

Создадим «виртуальный шнурок»:

# ip link add veth2 type veth peer name veth3

Поместим интерфейс внутрь namespace

# ip link set veth3 netns DHCP6

Включим интерфейсы и назначим им адреса:

# 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

При подключении клиента в Access-Accept присутствует атрибут Framed-Pool:

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"

После установления соединения, проверяем, корректно ли выдались адреса:

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

Для автоматизации создания name space напишем скрипт createNetworkNamespace.sh и добавим его в автозапуск (не забудьте выдать права на запуск данного скрипта):

#!/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

#Add new namespace
ip netns add dhcp

#Add new link
ip link add veth0 type veth peer name veth1

#Set veth to namespace dhcp
ip link set veth1 netns dhcp

#Turn on interface
ip netns exec dhcp ip link set lo up
ip netns exec dhcp ip link set veth1 up
ip link set veth0 up

#Set IP addresses to 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

#Run dhcpd in namespace
ip netns exec dhcp dhcpd -cf /etc/dhcp/dhcpd.conf

#Add new namespace
ip netns add dhcp6

#Add new link
ip link add veth2 type veth peer name veth3

#Set veth to namespace dhcp
ip link set veth3 netns dhcp6

#Turn on interface
ip link set veth2 up
ip netns exec dhcp6 ip link set lo up
ip netns exec dhcp6 ip link set veth3 up

#Set IP addresses to 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

#Run kea in namespace

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

Добавлять в автозапуск будем через rc.local. Для этого добавим в данный файл строчку вида:

sh /your/path/to/createNetworkNamespace.sh

Теперь при перезагрузке сервера у нас будут создаваться необходимые namespace и запускаться DHCP-сервера в данных namespace.

BRAS на основе DPI — решение, позволяющее не только осуществлять полисинг абонентов, но и работать с показателями Quality of Experience и применять балансировку трафика для каждого абонента и устройства. Свяжитесь с нами, чтобы более подробно узнать о платформе СКАТ DPI и ее использовании на сетях операторов связи.

Поделиться в социальных сетях