Страница 1 из 2

PON BDCOM и Option82

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

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

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

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

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

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

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

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

Re: PON BDCOM и Option82

Добавлено: Чт сен 05, 2013 7:43 am
newey
Используйте опцию
$conf{DHCPHOSTS_EXPR}='-';
При помощи регулярного выражения легко извлекаются номер вилана VLAN и порт PORT.

Re: PON BDCOM и Option82

Добавлено: Чт сен 05, 2013 5:51 pm
Makioro
Посмотрел вики, тут всё довольно непонятно
Вот это записано для д-линка:

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

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;';
Всё равно остаётся вопрос как оно поймёт какое выражение применять к какому запросу? По длине?

Re: PON BDCOM и Option82

Добавлено: Пт сен 06, 2013 5:48 am
newey
Нет. Надо не шарком смотреть, а посмотреть что радиус получает.
Вот, например:

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;';

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

Re: PON BDCOM и Option82

Добавлено: Пт сен 06, 2013 1:17 pm
Makioro
Что-то я не понял совсем.
У меня вообще схема следующая:
Есть большое количество свитчей доступа, в основном 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омвское - не прожевывается.

Re: PON BDCOM и Option82

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

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

Re: PON BDCOM и Option82

Добавлено: Пн сен 09, 2013 7:56 am
newey
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";

Re: PON BDCOM и Option82

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

Re: PON BDCOM и Option82

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

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

Re: PON BDCOM и Option82

Добавлено: Вт сен 10, 2013 12:30 pm
Makioro
Снова актуально. Оказалось, что в новой прошивке можно поменять тип опции и тогда будут доступны дополнительные данные, которые очень даже неплохо иметь.
Надо чтоб работали два типа 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 показывает, что запись корректна, но почему-то не работает. Вообще перестаёт проходить авторизация.
Кто подскажет где ошибка?

Re: PON BDCOM и Option82

Добавлено: Вт сен 10, 2013 1:26 pm
~AsmodeuS~
очень полезная опция

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

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

Re: PON BDCOM и Option82

Добавлено: Вт сен 10, 2013 1:41 pm
Makioro
~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, но он пуст.

Re: PON BDCOM и Option82

Добавлено: Чт сен 12, 2013 10:18 am
newey
Нет. Так не пойдет. Изначально задача ставилась по-другому.

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

Re: PON BDCOM и Option82

Добавлено: Чт сен 12, 2013 11:05 am
Makioro
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})$';
Отсюда и вопрос: может я некорректно записываю в конфиг абиллса?

Re: PON BDCOM и Option82

Добавлено: Чт сен 12, 2013 12:10 pm
newey
Makioro писал(а): У меня включено

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

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

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