PON BDCOM и Option82

Модуль управления DHCP сервером
Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

PON BDCOM и Option82

Сообщение Makioro » Ср сен 04, 2013 9:35 am

Доброе время суток
При запуске freeradius-dhcp c option82 столкнулся со следующей проблемой
Основная сеть у нас построена классическим способом через свитчи. С ней проблем нет. Вот пример опции 82 со свитча д-линк:

Код: Выделить всё

Agent Circuit ID: 000400010002
Где 2 (последняя цифра) - это номер порта, а 1 (5 с конца) - это номер вилана

Проблема возникла с оборудованием PON от BDCOM.
Вот пример опции 82 оттуда:

Код: Выделить всё

Agent Circuit ID: 0001000a
Где 1 - номер вилана, а "а" (а=10) - номер порта.

Проблема заключается в том, что биллинг попросту игнорирует опцию 82 от PON-оборудования и авторизует лишь согласовываясь с MAC-адресом (если таковой указан)

Собственно вопрос: как быть?

newey
Сообщения: 26
Зарегистрирован: Пт авг 16, 2013 11:27 am

Re: PON BDCOM и Option82

Сообщение newey » Чт сен 05, 2013 7:43 am

Используйте опцию
$conf{DHCPHOSTS_EXPR}='-';
При помощи регулярного выражения легко извлекаются номер вилана VLAN и порт PORT.

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Чт сен 05, 2013 5:51 pm

Посмотрел вики, тут всё довольно непонятно
Вот это записано для д-линка:

Код: Выделить всё

DHCP-Relay-Agent-Information:0x(01)(06)0004([0-9a-f]{4})\d{2}([0-9a-f]{2})(02)(08)([0-9a-f]{12}):ID,SIZE,VLAN,PORT,ID,SIZE,MAC;
А это для Dlink DES-3200-26 для Hw A1,B1 Firmware Version1.28.009 , HW C1 Firmware Version 4.00.24 DGS-3120-24SC hw a2 Firmware VersionBuild 2.00.010

Код: Выделить всё

DHCP-Relay-Agent-Information:0x(01)(06)0004([0-9a-f]{4})\d{2}([0-9a-f]{2})(02)(080006)([0-9a-f]{12}):ID,SIZE,VLAN,PORT,ID,SIZE,MAC;
Вот возьмём вывод tshark'a (правда отсюда, а не свой, т.к. сейчас дома болею)

Код: Выделить всё

    Option: (t=82,l=25) Agent Information Option
        Option: (82) Agent Information Option
        Length: 25
        Value: 0106000408BC0001020F010D3137322E32392E31342E3132...
        Agent Circuit ID: 000408BC0001
        Agent Remote ID: 010D3137322E32392E31342E313232
В вики разбор идёт, как я понимаю, строки "value", в примере вот эта

Код: Выделить всё

Value: 0106000408BC0001020F010D3137322E32392E31342E3132...
С этим, я, скорее всего разберусь.
Вопрос как это в конфиг записать для двух разных устройств? Как система поймет, что это выражение нужно использовать для этих запросов, а другое выражение - для других?

Вот так что ли?

Код: Выделить всё

$conf{DHCPHOSTS_EXPR}='DHCP-Relay-Agent-Information:0x(01)(06)0004([0-9a-f]{4})\d{2}([0-9a-f]{2})(02)(08)([0-9a-f]{12}):ID,SIZE,VLAN,PORT,ID,SIZE,MAC;DHCP-Relay-Agent-Information:0x(01)(06)0004([0-9a-f]{4})\d{2}([0-9a-f]{2})(02)(080006)([0-9a-f]{12}):ID,SIZE,VLAN,PORT,ID,SIZE,MAC;';
Всё равно остаётся вопрос как оно поймёт какое выражение применять к какому запросу? По длине?

newey
Сообщения: 26
Зарегистрирован: Пт авг 16, 2013 11:27 am

Re: PON BDCOM и Option82

Сообщение newey » Пт сен 06, 2013 5:48 am

Нет. Надо не шарком смотреть, а посмотреть что радиус получает.
Вот, например:

Ready to process requests.
rad_recv: Access-Request packet from host 10.1.2.3 port 36792, id=119, length=158
NAS-Port-Type = Ethernet
NAS-Port = 2207440369
Calling-Station-Id = "1:0:b0:26:31:b8:62"
Framed-IP-Address = 10.20.10.42
Called-Station-Id = "server_dhcp"
User-Name = "00:B0:26:31:B8:62"
User-Password = ""
Agent-Remote-Id = 0x63656e7472616c5f3535
Agent-Circuit-Id = 0x30303031
NAS-Identifier = "NAS-1"
NAS-IP-Address = 10.1.2.3

В данном примере прилетают необходимые нам Agent-Remote-Id и Agent-Circuit-Id.

В вики указан немного другой случай - там пакет прилетает не с НАС-а, а с релея.

В моем примере строка будет выглядеть так:
$conf{DHCPHOSTS_EXPR}='Agent-Remote-Id:(\w+):MAC:hex2ansii;Agent-Circuit-Id:(\d+):PORT_DEC:hex2ansii;';

После нескольких раз прочтения вики сначала наступает помутнение, а потом - прояснение :)

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Пт сен 06, 2013 1:17 pm

Что-то я не понял совсем.
У меня вообще схема следующая:
Есть большое количество свитчей доступа, в основном D-Link. Для PONа BDCOM. Они все скоммутированы на каталист 6509, который выполняет роль релея, релеит все запросы на микротик сервер dhcp, который через радиус авторизует.
Схема сложная, сам охреневаю, но другого выхода не придумал, т.к. задача в том, чтобы не разбивать пул реальных айпи-адресов географически (для этого циска релеит, вместе с этим делая local-proxy-arp)
Вот, что у меня в радиусе:

Код: Выделить всё

        Agent-Remote-Id = 0xfcfaf7c9171d
        Agent-Circuit-Id = 0x00010009
Где Agent-Remote-Id - это мак-адрес порта куда подключено PON-дерево с клиентом. К нему я не хочу привязываться. Только VLANid и MAC клиента. В некоторых случаях можно ещё и порт.

В общем, как мне сделать, чтобы радиус нормально жевал Agent-Circuid-Id 0x000400010002 и 0x00010009 ? Первое - длинковское, сейчас жуется и так. Второе - BDCOMомвское - не прожевывается.

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Пт сен 06, 2013 4:40 pm

Просьба к Асмодеусу: поправьте документацию по регулярным выражениям "$conf{DHCPHOSTS_EXPR}='-';"
А именно вот эти строки оттуда
MAC_DEC (если мак не нужно приобразовывать в десятичный форма из шестнадцатиричного) PORT_DEC (если не нужно приобразовывать порт из десятеричного шестнадцатиричного формата)
мне совершенно непонятны.
MAC_DEC: DEC же десятичная система, а у вас написано наоборот, если "не нужно преобразовывать в десятичный формат"
PORT_DEC - абсолютно непонятно описание

P.S. я даже помогу на предмет исправления ошибок, если нужно, главное логику понять.

newey
Сообщения: 26
Зарегистрирован: Пт авг 16, 2013 11:27 am

Re: PON BDCOM и Option82

Сообщение newey » Пн сен 09, 2013 7:56 am

Makioro писал(а):Что-то я не понял совсем.
У меня вообще схема следующая:
Есть большое количество свитчей доступа, в основном D-Link. Для PONа BDCOM. Они все скоммутированы на каталист 6509, который выполняет роль релея, релеит все запросы на микротик сервер dhcp, который через радиус авторизует.
Вот, что у меня в радиусе:

Код: Выделить всё

        Agent-Remote-Id = 0xfcfaf7c9171d
        Agent-Circuit-Id = 0x00010009
Где Agent-Remote-Id - это мак-адрес порта куда подключено PON-дерево с клиентом. К нему я не хочу привязываться. Только VLANid и MAC клиента. В некоторых случаях можно ещё и порт.

В общем, как мне сделать, чтобы радиус нормально жевал Agent-Circuid-Id 0x000400010002 и 0x00010009 ? Первое - длинковское, сейчас жуется и так. Второе - BDCOMомвское - не прожевывается.
Не надо смешивать между собой теплое и мягкое. Сейчас не важно где и что релеит. Важно что прилетает в радиус.
Еще раз сформулируем задачу. Есть схема со свичами - она работает. Надо к этой схеме добавить GPON - так ?
Чтобы "подогнать" гпон под свич надо выражение написать как-то так:

$conf{DHCPHOSTS_EXPR}='Agent-Remote-Id:(\w+):MAC;Agent-Circuit-Id:([0-9a-f]{4})\d{2}([0-9a-f]{2})$:VLAN,PORT:hex2ansii;';

Вот программка, которая позволяет посмотреть что получается в результате преобразования:

Код: Выделить всё

#!/usr/bin/perl -w
$string = "0x000400010002";
$expr_ = '([0-9a-f]{4})\d{2}([0-9a-f]{2})$';
print "check ...\n";
if (my @res = ($string =~ /$expr_/)) {
print "input_value = $string , res = @res\n";
    for (my $i=0; $i <= $#res ; $i++) {
       print "i=$i $res[$i]\n";
    }
}
print "\n";

newey
Сообщения: 26
Зарегистрирован: Пт авг 16, 2013 11:27 am

Re: PON BDCOM и Option82

Сообщение newey » Пн сен 09, 2013 8:06 am

Makioro писал(а):Просьба к Асмодеусу: поправьте документацию по регулярным выражениям "$conf{DHCPHOSTS_EXPR}='-';"
MAC_DEC: DEC же десятичная система, а у вас написано наоборот, если "не нужно преобразовывать в десятичный формат"
PORT_DEC - абсолютно непонятно описание
Написано все правильно. Устройство может прислать номер порта и влан как в шестнадцатеричном виде, так и в десятичном. Если преобразование не требуется, то берем _DEC.
По умолчанию производится преобразование из хекс в дек.

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Пн сен 09, 2013 1:56 pm

Уже неактуально, т.к. вышла новая прошивка для BDCOM 3310B OLT, в которой изменена опция 82 так, что она выглядит идентично д-линковской. Правда почему-то ничего не работает - но это уже совсем другая история.

p.s. после последнего обновления система перестала проверять в опции 82 vlan и port. Т.е. авторизует только по МАС-адресу. Проверьте кто-то, есть ли такая проблема при использовании выражения.

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Вт сен 10, 2013 12:30 pm

Снова актуально. Оказалось, что в новой прошивке можно поменять тип опции и тогда будут доступны дополнительные данные, которые очень даже неплохо иметь.
Надо чтоб работали два типа agent-circuit-id:

Код: Выделить всё

BDCOM
0x000f000a02
Где 000f - номер вилана (15), 00 - номер модуля, 0а - номер порта, 02 - номер ONU в дереве, т.е. тут записан порт EPON0/4:2 (в нумерации епонов в BDCOM 3310B 1ый порт соответствует 7, 2 - 8, 3 - 9 и 4 - 10, первые 6 - это обычные гигабит эзернеты)

Код: Выделить всё

D-Link
0x0004000f0001
Где 0004 - бесполезная фигня, 000f - вилан, 00 - модуль, 01 - порт
В связи с этим сделал вот такую запись в конфиге

Код: Выделить всё

$conf{DHCPHOSTS_EXPR}='Agent-Circuit-Id:0x(?:0004)?([0-9a-fA-F]{4})(?:[0-9a-fA-F]{2})?([0-9a-fA-F]{4})$:VLAN,PORT_DEC;';
Cкрипт newey показывает, что запись корректна, но почему-то не работает. Вообще перестаёт проходить авторизация.
Кто подскажет где ошибка?

~AsmodeuS~
Site Admin
Сообщения: 5576
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Re: PON BDCOM и Option82

Сообщение ~AsmodeuS~ » Вт сен 10, 2013 1:26 pm

очень полезная опция

$conf{DHCP_FREERADIUS_DEBUG}=1; Режимы отладки
1 - Режим сессий (файл: /tmp/rad_dhcp)
2 - Режим ответов авторизации. (Файл: /tmp/rad_reply)
3 - Режим выражений для проверки параметров Option 82 (Файл /tmp/dhcphosts_expr)

чтобы проверить как работают выражения

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Вт сен 10, 2013 1:41 pm

~AsmodeuS~ писал(а):очень полезная опция

$conf{DHCP_FREERADIUS_DEBUG}=1; Режимы отладки
1 - Режим сессий (файл: /tmp/rad_dhcp)
2 - Режим ответов авторизации. (Файл: /tmp/rad_reply)
3 - Режим выражений для проверки параметров Option 82 (Файл /tmp/dhcphosts_expr)

чтобы проверить как работают выражения
У меня включено

Код: Выделить всё

$conf{DHCP_FREERADIUS_DEBUG}=3;
Но файл /tmp/dhcphosts_expr пуст. Даже не создался сам, я создал его вручную, установил права 777, но он пуст.

newey
Сообщения: 26
Зарегистрирован: Пт авг 16, 2013 11:27 am

Re: PON BDCOM и Option82

Сообщение newey » Чт сен 12, 2013 10:18 am

Нет. Так не пойдет. Изначально задача ставилась по-другому.

Формат идентификаторов был одинаковый, но его было необходимо "выравнивать" по правой стороне.
Сейчас формат совершенно разный. Приведите circuit-id бдкома к формату длинка. Если нужен номер модуля и/или номер ONU, то добавьте их в "номер" порта. Номер порта в билинге - это строка а не число. Т.е запись о порте в виде "0023" - это и будет идентификатор порта (и человеку понятно и билингу).

Makioro
Сообщения: 241
Зарегистрирован: Ср апр 27, 2011 11:09 am

Re: PON BDCOM и Option82

Сообщение Makioro » Чт сен 12, 2013 11:05 am

newey писал(а):Нет. Так не пойдет. Изначально задача ставилась по-другому.

Формат идентификаторов был одинаковый, но его было необходимо "выравнивать" по правой стороне.
Сейчас формат совершенно разный. Приведите circuit-id бдкома к формату длинка. Если нужен номер модуля и/или номер ONU, то добавьте их в "номер" порта. Номер порта в билинге - это строка а не число. Т.е запись о порте в виде "0023" - это и будет идентификатор порта (и человеку понятно и билингу).
Да, изначально задача была другая. Тогда, кстати, тоже не работало выражение.
Из записи "0x000f000a02" выходит, что порт "0a02" - мне вполне понятно, а у д-линка из записи "0x0004000f0001" выдаст порт "0001", где первые два нуля будут взяты из модуля. Учитывая, что у нас нет стекируемых д-линков, то на нули можно забить.
Зачем приводить к общему виду, если потеряется информация о номере ONU?
Ну и запись

Код: Выделить всё

$conf{DHCPHOSTS_EXPR}='Agent-Circuit-Id:0x(?:0004)?([0-9a-fA-F]{4})(?:[0-9a-fA-F]{2})?([0-9a-fA-F]{4})$:VLAN,PORT_DEC;';
Вашей утилитой обрабатывается и выводит именно те значения, которые нужны. И неважно, подставляю я строку из D-Link'a или BDCOM'a.
Если быть точным, то переменную я записываю в вашей программе вот так:

Код: Выделить всё

$expr_ = '(?:0004)?([0-9a-fA-F]{4})(?:[0-9a-fA-F]{2})?([0-9a-fA-F]{4})$';
Отсюда и вопрос: может я некорректно записываю в конфиг абиллса?

newey
Сообщения: 26
Зарегистрирован: Пт авг 16, 2013 11:27 am

Re: PON BDCOM и Option82

Сообщение newey » Чт сен 12, 2013 12:10 pm

Makioro писал(а): У меня включено

Код: Выделить всё

$conf{DHCP_FREERADIUS_DEBUG}=3;
Но файл /tmp/dhcphosts_expr пуст. Даже не создался сам, я создал его вручную, установил права 777, но он пуст.
Ух ты!
И опция $conf{ERROR2DB}=0; в config.pl тоже, наверное, указана ...

Без /tmp/dhcphosts_expr , наверное, будет трудно помочь.

Ответить