====== 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