====== Cisco ASR1k ISG/BNG IPoE======
===== Введение =====
В данной статье приведен пример интеграции биллинга Mikbill c маршрутизатором Cisco ASR1k для предоставления услуг доступа в интернет на базе модели IPoE и технологии Cisco ISG с идентификацией клиента по порту (opt82). Ниже изложенный материал не является единственным возможным решением одной и той же задачи и не претендует на абсолютную верность. Практически по каждой команде в конфигурации Cisco ASR1k, есть возможность настроить поведение системы “под себя” c учетом тех или иных особенностей сети оператора связи.Автор этих строк не является техническим писателем, поэтому заранее просьба извинить за стиль изложения.
===== ОБЩИЙ ПРИНЦИП РАБОТЫ =====
Общая структурная схема сети нарисована ниже. Где OPENGARDEN это некий минимально необходимый набор ресурсов для каждого пользователя.Это может быть Ваш веб-сайт, DNS-сервер,личный кабинет пользователя,платежные системы,и все прочее что доступно абоненту всегда независимо от состояния его баланса.
Функции DHCP сервера, Radius сервера , и Сервера политик выполняет ACP Mikbill.
В качестве сети доступа может использоваться либо Ethernet либо PON.Главное чтобы по набору идентификаторов можно было однозначно установить пользователя и выдать ему ip адресс.
Идентификаторами могут быть
- Данные oпции 82 для FTTx
- МАК адрес клиента.
- МАК адрес ONU для PON
- Теги S-vlan/C-vlan
{{:billing:nas_access_server:cisco_1.png?direct|}}
==== Первый этап - Выдача ipv4 адреса абоненту ====
- Абонент при подключении к сети запрашивает адрес от DHCP-сервера.
- Коммутатор доступа вставляет в DHCP-Discover опцию 82.
- Cisco ASR релеит DHCP запрос на биллинг, (тут есть два варианта). Вариант№1: Релей стандартными средствами через ip helper-address a.b.c.d на интерфейсе смотрящем в сторону клиентов с сохранением данных опции82, либо Вариант №2: с помощью механизма DHCP Radius Proxy в котором DHCP Discover пакет преобразуется в Radius Access-Request на получение адреса. Более подробно тут: http://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipaddr_dhcp/configuration/xe-3s/dhcp-xe-3s-book/dhcp-serv-rad-proxy-xe.html
- На стороне биллинга абонент идентифицируется по данным из полей opt82. Вцелом идентификация клиента может быть и по MAC адресу клиента,и по opt82 и по МACу ONU для PON-сетей). Далее биллинг отсылает DHCP-offer либо access-accept(для схемы с dhcp radius proxy) на Сisco ASR, которая в свою очередь передает пакет далее к абоненту.
- Назначение адреса заканчивается формальными dhcp-request и dhcp-ack пакетами.
Оба варианта изображены на рисунке ниже.
{{:billing:nas_access_server:cisco_2.png?direct|}}
=== выдача IP по QinQ ===
[[https://wiki.mikbill.ru/billing/nas_access_server/cisco_asr1k_qinq|выдача IP по QinQ]]
==== Второй этап – старт абонентской сессии ====
Таким образом, после DHCP обмена, на данном этапе мы имеем верифицированный IP, по которому можно однозначно идентифицировать клиента. Поэтому старт сессии на ISG будем производить по ip адресу.Ниже приведено описание абонентского ISG интерфейса.
!
interface TenGigabitEthernet0/0/0.556
encapsulation dot1Q 556 second-dot1q 101-300
ip unnumbered Loopback1
ip helper-address a.b.c.d (релей на биллинг)
ip nat inside
service-policy type control IPOE_CUSTOMERS (управляющая политика)
ip subscriber routed
initiator unclassified ip-address ipv4
!
{{:billing:nas_access_server:cisco_3.png?direct|}}
Обращаю внимание на описание QinQ интерфейса,такая конструкция помогает сэкономить время и не создавать множество субинтерфейсов на каждый абонентский влан. Крайне не рекомендуется использовать конструкцию encapsulation dot1Q 3000 second-dot1q any для одного QINQ-влана на нескольких субинтерфейсах одного физического интерфейса.
Политика IPOE_CUSTOMERS управляет всем циклом жизни сесcии. И является ключевым элементом, который описывает что, когда и как делать с абонентской сессией. В приведенном ниже примере она достаточна проста.
По событию session-start на биллинг( метод ISG_AUTH_LIST) пошлется access-request ,где в качестве username будет указан ip адрес клиента.Если авторизация не удастся, тогда на сессию повесится 2х-минутный таймер и она завершится по его истечению(event timed-policy-expiry).Обращаю внимание ,что во всех мануалах рекомендуется на данном этапе (event session-start) третьим и четвертым действием разрешить клиенту временный доступ к ресурсам в OPENGARDEN и заблокировать/заредиректить все остальное. А при событии account-logon(по приходу access-accept от биллинга) снять эти сервисы. В виду того,что фантазия системного администратора безгранична, предлагается самостоятельно под себя настроить сценарий того что надо делать с клиентом в эти две минуты. Как правило до этого шага могут дойти абоненты если лег радиус и от него нет ответов. В приведенном примере если абонента не удается авторизовать он все равно будет иметь доступ в интернет(пока Вы чините radius).И в большинстве случаев это будут вполне легитимные клиенты , если на доступе настроен dhcp snooping/ip source guard и прочие фичи.
!
policy-map type control IPOE_CUSTOMERS
class type control COND_LAST event timed-policy-expiry
10 service disconnect
!
class type control always event session-start
10 authorize aaa list ISG_AUTH_LIST password radiuspassword identifier source-ip-address
20 set-timer 2MIN 2
!
class type control always event account-logoff
10 service disconnect
!
Запрос на биллинг при старте сесии
Packet-Type = Access-Request
User-Name = "172.16.0.3"
Framed-IP-Address = 172.16.0.3
Cisco-Account-Info = "S172.16.0.3"
NAS-Port-Type = Ethernet
Cisco-NAS-Port = "0/0/0/110.556"
NAS-Port-Id = "0/0/0/110.556"
Service-Type = Outbound-User
NAS-IP-Address = 172.16.0.1
Acct-Session-Id = "0/0/0/110.556_000014A8"
В Ответ получаем фичи применяемые к сессии (Idle-timeout и полисинг)И Набор сервисов доступных для нашего абонента. В данном случае это MBINTERNET и MBOPENGARDEN.
Packet-Type = Access-Accept
Idle-Timeout = 300
Acct-Interim-Interval = 300
Cisco-AVPair = "subscriber:idle-timeout-direction=inbound"
User-Name = "eth2_rb951"
Cisco-Account-Info += "AMBINTERNET"
Cisco-Account-Info += "AMBOPENGARDEN"
Cisco-Account-Info += "QU;21504000;4032000;8064000;D;21504000;4032000;8064000;"
Service-Type = Outbound-User
Framed-IP-Address = 172.16.0.3
Сами сервисы Cisco ASR хранит у себя в кеше,до тех пор пока есть хоть один клиент в онлайне с таким сервисом.Если сервиса в кеше нет, то Сервис по радиусу запрашивается с биллинга
Выглядит это так
Thu May 26 23:58:21 2016
Packet-Type = Access-Request
User-Name = "MBOPENGARDEN"
Service-Type = Outbound-User
NAS-IP-Address = 172.16.0.1
Thu May 26 23:58:21 2016
Packet-Type = Access-Request
User-Name = "MBINTERNET"
Service-Type = Outbound-User
NAS-IP-Address = 172.16.0.1
В ответ приходит “состав” Сервиса
Thu May 26 23:58:21 2016 – ЭТО сервис OPENGARDEN
Packet-Type = Access-Accept
Cisco-AVPair += "ip:traffic-class=in access-group 130 priority 100"
Cisco-AVPair += "ip:traffic-class=out access-group 130 priority 100"
Thu May 26 23:58:21 2016 – это сервис MBINTERNET
Packet-Type = Access-Accept
Cisco-AVPair += "subscriber:accounting-list=ISG_ACCT_LIST"
В итоге получаем вот такого абонента,которому разрешен доступ в Интернет.
CiscoASR# show subscriber session uid 662
Type: IPv4, UID: 662, State: authen, Identity: eth2_rb951
IPv4 Address: 172.16.0.3
Session Up-time: 00:14:43, Last Changed: 00:14:43
Switch-ID: 11101
Policy information:
Authentication status: authen
Active services associated with session:
name "MBINTERNET", applied before account logon
name "MBOPENGARDEN", applied before account logon
Rules, actions and conditions executed:
subscriber rule-map IPOE_CUSTOMERS
condition always event session-start
10 authorize aaa list ISG_AUTH_LIST identifier source-ip-address
subscriber rule-map default-internal-rule
condition always event service-start
1 service-policy type service identifier service-name
subscriber rule-map default-internal-rule
condition always event service-start
1 service-policy type service identifier service-name
Classifiers:
Class-id Dir Packets Bytes Pri. Definition
0 In 18 1980 0 Match Any
1 Out 3 150 0 Match Any
442 In 0 0 100 Match ACL 130 – этот трафик класс opengarden
443 Out 0 0 100 Match ACL 130 – этот трафик класс opengarden
Template Id : 22
Features:
Idle Timeout:
Class-id Dir Timeout value Idle-Time Source
0 In 300 00:00:39 Peruser
Accounting:
Class-id Dir Packets Bytes Source
0 In 18 1980 MBINTERNET
1 Out 3 150 MBINTERNET
Policing:
Class-id Dir Avg. Rate Normal Burst Excess Burst Source
0 In 21504000 4032000 8064000 Peruser
1 Out 21504000 4032000 8064000 Peruser
Configuration Sources:
Type Active Time AAA Service ID Name
SVC 00:14:43 - MBOPENGARDEN
USR 00:14:43 - Peruser
SVC 00:14:43 1879048223 MBINTERNET
INT 00:14:43 - TenGigabitEthernet0/0/0.556
Как видно к абоненту применены фичи Idle Timeout, Accounting, Policing
===== Понятия трафик классов,фич и сервисов. =====
Когда у нас появляется сессия абонента с фичами, появляются понятия трафик классов.Вкратце одной картинкой это описывается так:
{{:billing:nas_access_server:cisco_4.png?direct|}}
Фичи могут применятся как к сессии вцелом , так и к отдельному трафик классу.
Ниже на картинке представлены доступные к применению фичи.
{{:billing:nas_access_server:cisco_5.png?direct|}}
Для того чтобы каждый администратор мог самостоятельно реализовать задуманное.
В АСР Mikbill каждый конфигурирует свои сервисы самостоятельно в файле
/etc/raddb/service
MBINTERNET Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "subscriber:accounting-list=ISG_ACCT_LIST",
Fall-Through = 0
MBOPENGARDEN Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 130 priority 100",
Cisco-AVPair += "ip:traffic-class=out access-group 130 priority 100",
Fall-Through = 0
MBNOMONEY Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 110 priority 200",
Cisco-AVPair += "ip:traffic-class=out access-group 110 priority 200",
Cisco-AVPair += "ip:l4redirect=redirect to ip a.b.c.d port 82",
Cisco-AVPair += "ip:traffic-class=out default drop",
Cisco-AVPair += "ip:traffic-class=in default drop",
Fall-Through = 0
MBFREEZE Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 110 priority 200",
Cisco-AVPair += "ip:traffic-class=out access-group 110 priority 200",
Cisco-AVPair += "ip:l4redirect=redirect to ip a.b.c.d port 82",
Cisco-AVPair += "ip:traffic-class=out default drop",
Cisco-AVPair += "ip:traffic-class=in default drop",
Fall-Through = 0
MBOTKL Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 110 priority 200",
Cisco-AVPair += "ip:traffic-class=out access-group 110 priority 200",
Cisco-AVPair += "ip:l4redirect=redirect to ip a.b.c.d port 82",
Cisco-AVPair += "ip:traffic-class=out default drop",
Cisco-AVPair += "ip:traffic-class=in default drop",
Fall-Through = 0
MBDELETED Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 110 priority 200",
Cisco-AVPair += "ip:traffic-class=out access-group 110 priority 200",
Cisco-AVPair += "ip:l4redirect=redirect to ip a.b.c.d port 82",
Cisco-AVPair += "ip:traffic-class=out default drop",
Cisco-AVPair += "ip:traffic-class=in default drop",
Fall-Through = 0
MBDISABLEDINET Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 110 priority 200",
Cisco-AVPair += "ip:traffic-class=out access-group 110 priority 200",
Cisco-AVPair += "ip:l4redirect=redirect to ip a.b.c.d port 82",
Cisco-AVPair += "ip:traffic-class=out default drop",
Cisco-AVPair += "ip:traffic-class=in default drop",
Fall-Through = 0
MBUNKNOWN Cleartext-Password := "cisco", Auth-Type = Accept
Cisco-AVPair += "ip:traffic-class=in access-group 110 priority 200",
Cisco-AVPair += "ip:traffic-class=out access-group 110 priority 200",
Cisco-AVPair += "ip:l4redirect=redirect to ip a.b.c.d port 82",
Cisco-AVPair += "ip:traffic-class=out default drop",
Cisco-AVPair += "ip:traffic-class=in default drop",
Fall-Through = 0
DEFAULT Auth-Type = Perl
Fall-Through = 1
Где a.b.c.d –хост со страничкой заглушкой ,информирующей о чем-либо.
Дополнительно необходимо создать:
/etc/raddb/sites-enabled/mbservice
server mbservice {
listen {
type = auth
ipaddr = *
port = 1912
}
authorize {
auth_log
preprocess
files
}
authenticate {
Auth-Type Perl {
perl
}
}
preacct {
preprocess
}
accounting {
detail
}
session {
sql
}
post-auth {
reply_log
}
}
/etc/raddb/modules/files
files {
usersfile = /etc/raddb/service
compat = no
}
Перечисленные Выше сервисы описывают различные состояния пользователя в биллинге. БезДенег,Заморожен, Удален, Отключен, Неизвестный.
Фундаментальное отличие между сервисами в том что для сервиса MBINTERNET поведение дефолтной очереди(трафик класса) разрешающее. То есть трафик не попавший ни в один из трафик классов попадает в дефолтную очередь и форвардится дальше.
Для всех других Сервисов ,поведение дефолтной очереди это drop.
{{:billing:nas_access_server:cisco_6.png.jpg?direct|}}
Т.е для заблокированного клиента Мы будем иметь вот такую сессию.
CiscoASR#show subscriber session uid 662
Type: IPv4, UID: 662, State: authen, Identity: eth2_rb951
IPv4 Address: 172.16.0.3
Session Up-time: 00:52:13, Last Changed: 00:00:21
Switch-ID: 11101
Classifiers:
Class-id Dir Packets Bytes Pri. Definition
0 In 56 6616 0 Match Any
1 Out 3 150 0 Match Any
442 In 0 0 100 Match ACL 130
443 Out 0 0 100 Match ACL 130
448 In 0 0 200 Match ACL 110
449 Out 0 0 200 Match ACL 110
4294967294 In 1 122 - Drop
4294967295 Out 0 0 - Drop
Template Id : 23
Features:
Idle Timeout:
Class-id Dir Timeout value Idle-Time Source
0 In 300 00:00:09 Peruser
Accounting:
Class-id Dir Packets Bytes Source
0 In 55 6494 MBINTERNET
1 Out 3 150 MBINTERNET
L4 Redirect:
Class-id Rule cfg Definition Source
448 #1 SVC to ip a.b.c.d port 82 MBNOMONEY
Policing:
Class-id Dir Avg. Rate Normal Burst Excess Burst Source
0 In 21504000 4032000 8064000 Peruser
1 Out 21504000 4032000 8064000 Peruser
Configuration Sources:
Type Active Time AAA Service ID Name
SVC 00:52:13 - MBOPENGARDEN
SVC 00:00:21 - MBNOMONEY
USR 00:52:13 - Peruser
SVC 00:52:13 1879048223 MBINTERNET
INT 00:52:13 - TenGigabitEthernet0/0/0.556
Видно что к сессии добавилась фича L4 Redirect, из сервиса MBNOMONEY. Все остальные фичи остались на месте (Policing, Accounting, Idle)
Блокировка доступа для такого клиента происходит так.
Сначала разрешается доступ для трафик класса с приоритетом 100
Pri 100 Match ACL 130. Это ресурсы opengarden.
Затем все что не попало в 130 ACL , будет матчится на ACL 110
Pri 200 Match ACL 110 – тут мы матчим www трафик чтобы заредиректить.
Все что не подлежит редиректу дропается.
Где доступ к разрешенным хостам в opengarden опеределяется так
Extended IP access list 130
10 permit tcp any host x.y.z.w
20 permit tcp host x.y.z.w any
30 и т.д.
А Extended IP access list 110 определяет трафик подлежащий редиректу
10 permit tcp 172.16.0.0 0.0.255.255 any eq www (172.16.0.0 это юзеры идующие на 80порт)
===== Настройка NAS в биллинге =====
Настройка NAS в биллинге достаточно проста.Создаем новый NAS и указываем ему тип. И придумаваем radiuspassword. Порт3799 используется для отправки COA и динамического навешивания сервисов на абонентскую сессию.
{{:billing:nas_access_server:cisco_7.png?direct|}}
{{:billing:nas_access_server:cisco_8.png?direct|}}
===== Пример рабочего конфига ASR 1k+Микбилл. =====
Из конфига убрано все что НЕ касается ISG (NAT, iBGP, PPPoE, PBR,VRF)
hostname CiscoASR
!
aaa new-model
!
aaa group server radius ISG_SRV_GROUP
server ип_биллинга auth-port 1812 acct-port 1813
ip radius source-interface Loopback1 – коннектимся на биллинг из под лупбека.Из за того что эта же ЦИска паралельно еще и pppoe сервером(другой тип NAS в Микбилле) является, в других тупых сегментах сети.
!
aaa group server radius ISG_SERVICE_SRV_GROUP –сервер група для авторизации сервисов MBNOMONEY и тд
server ип_биллинга auth-port 1912 acct-port 1913
ip radius source-interface Loopback1
!
aaa authentication login default local
aaa authorization network ISG_AUTH_LIST group ISG_SRV_GROUP
aaa authorization subscriber-service default group ISG_SERVICE_SRV_GROUP
aaa accounting delay-start all
aaa accounting jitter maximum 0
aaa accounting update periodic 5
aaa accounting network ISG_ACCT_LIST start-stop group ISG_SRV_GROUP
!
aaa server radius proxy
!
aaa server radius dynamic-author
client ип_биллинга server-key 7 070B2848 – хосты которые COA будут слать на ASR (биллинг,возможно у кого-то еще и портал)
client ип_портала server-key 7 050F820B
server-key 7 070B2848
port 3799
auth-type any
!
aaa session-id common
clock timezone Moscow 3 0
!
ip dhcp database flash:my-dhcp-database – ВАЖНО.при ребуте циски.dhcp_bindings от сюда подтянет. Можно на tftp хранить
ip dhcp relay information trust-all
no ip dhcp ping packets -внимательно читать доку. Тут каждый сам решает.У меня часто в конфликт уходили адреса. Просто отключили проверку и все
!
ip dhcp pool MIKBILL – это способ выдачи адресов через dhcp-radius-proxy
authorization method ISG_AUTH_LIST
authorization shared-password radiuspassword
authorization username %c
*82опция AVпарой пойдет в access-requeste
!
subscriber templating
subscriber authorization enable
!
multilink bundle-name authenticated
!
class-map type control match-all COND_LAST
match timer 2MIN
match authen-status unauthenticated
!
policy-map type control IPOE_CUSTOMERS
class type control COND_LAST event timed-policy-expiry
10 service disconnect
!
class type control always event session-start
10 authorize aaa list ISG_AUTH_LIST password radiuspassword identifier source-ip-address
20 set-timer 2MIN 2
!
class type control always event account-logoff
10 service disconnect
!
interface Loopback1
ip address a.b.c.e 255.255.255.0 secondary (a.b.c.e – является шлюзом в пуле реальников/24)
ip address 172.16.0.1 255.255.0.0
!
interface TenGigabitEthernet0/0/0.556 –“LAN” в сторону абонентов
encapsulation dot1Q 556 second-dot1q 101-300
ip unnumbered Loopback1
ip helper-address ип_биллинга (если выдача dhcp клиенту НЕ через dhcp-radius-proxy)
ip nat inside – если абонам серые адреса выдаются
service-policy type control IPOE_CUSTOMERS
ip subscriber routed
initiator unclassified ip-address ipv4
!
interface TenGigabitEthernet0/0/1 -“WAN” в сторону bgp бордера
encapsulation dot1Q 111
ip address хх.хх.хх.хх 255.255.255.252
ip nat outside
access-list 110 permit tcp 172.16.0.0 0.0.255.255 any eq www – 172.16.0.0/16 это серые ип юзеров
access-list 130 permit tcp any host ip_billinga
access-list 130 permit tcp any host ip_kabineta
access-list 130 permit tcp any host ip_websita
access-list 130 permit tcp host ip_billinga any
access-list 130 permit tcp host ip_kabineta any
access-list 130 permit tcp host ip_websita any
!
radius-server attribute 44 include-in-access-req default-vrf
no radius-server attribute 77 include-in-acct-req
no radius-server attribute 77 include-in-access-req
radius-server attribute 8 include-in-access-req
radius-server attribute nas-port format e VVVVVVVVVVVVVVVVQQQQQQQQQQQQQQQQ-не обязательно именно так.
radius-server attribute 31 mac format unformatted
radius-server host ип_биллинга auth-port 1812 acct-port 1813
radius-server host ип_биллинга auth-port 1912 acct-port 1913
radius-server key 7 045FEE02
radius-server vsa send cisco-nas-port
radius-server unique-ident 5
!
!
end