Описание кейса
- Клиент с типом доступа 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 и ее использовании на сетях операторов связи.