billing:nas_access_server:cisco_asr1k

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 адресс.

Идентификаторами могут быть

  1. Данные oпции 82 для FTTx
  2. МАК адрес клиента.
  3. МАК адрес ONU для PON
  4. Теги S-vlan/C-vlan
direct|
  1. Абонент при подключении к сети запрашивает адрес от DHCP-сервера.
  2. Коммутатор доступа вставляет в DHCP-Discover опцию 82.
  3. 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
  4. На стороне биллинга абонент идентифицируется по данным из полей opt82. Вцелом идентификация клиента может быть и по MAC адресу клиента,и по opt82 и по МACу ONU для PON-сетей). Далее биллинг отсылает DHCP-offer либо access-accept(для схемы с dhcp radius proxy) на Сisco ASR, которая в свою очередь передает пакет далее к абоненту.
  5. Назначение адреса заканчивается формальными dhcp-request и dhcp-ack пакетами.

Оба варианта изображены на рисунке ниже.

direct|

выдача 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
 !
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

Когда у нас появляется сессия абонента с фичами, появляются понятия трафик классов.Вкратце одной картинкой это описывается так:

direct|

Фичи могут применятся как к сессии вцелом , так и к отдельному трафик классу. Ниже на картинке представлены доступные к применению фичи.

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.

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 и указываем ему тип. И придумаваем radiuspassword. Порт3799 используется для отправки COA и динамического навешивания сервисов на абонентскую сессию.

direct|direct|

Из конфига убрано все что НЕ касается 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
  • billing/nas_access_server/cisco_asr1k.txt
  • Последнее изменение: 4 лет назад
  • alexd