Описание кейса
- Клиент с типом доступа Q-in-Q
- FastDPI — обработка трафика и применение политик
- FastPCRF — проксирование запросов между fastDPI и Radius
- Radius сервер — принимает запросы от fastPCRF и формирует ответы с заданными атрибутами
- Router — отвечает за передачу пакетов в интернет и обратный маршрут
- DHCP-сервер — отвечает за выделение IP адресов из заданного пула.

Алгоритм работы СКАТ 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 и ее использовании на сетях операторов связи.