IVB Posted March 29, 2012 Posted March 29, 2012 Нужна помощь. Тестируем проверку Opt-82 через RADIUS сервер (FreeRADIUS 2.1.11) В Access-Request исправно попадают атрибуты Agent-Remote-Id и Agent-Circuit-Id. В Радиусе, в таблице authcheck_table, должны быть записи с правильными значениями для этих атрибутов. Собственно, вопрос. В каком формате должны храниться эти значения? Поделитесь примерчиком, плиз. Вставить ник Quote
dwemer Posted March 30, 2012 Posted March 30, 2012 Agent-Remote-Id = 0x0006000dedb73d80 0006 это длина 6 байт, 000dedb73d80 это мак коммутатора\релея Agent-Circuit-Id = 0x00040900000a 0004 это длина 4 байта, первые 2 байта 0900 это влан. следующие 2 байта 000a это номер порта Вставить ник Quote
IVB Posted March 30, 2012 Author Posted March 30, 2012 Если есть возможность, что вас поймут неправильно - вас поймут неправильно. dwemer, спасибо за ответ - но это моя вина, что я невнятно задал вопрос. Я хотел узнать, как эти атрибуты "запихнуть" в БД. INSERT INTO `authcheck_table` SET `UserName` = '00:12:23:56:78:9A', `Attribute` = 'Agent-Circuit-ID', `Value` = ??????, `op` = '==' Что должно быть вместо вопросиков? '00040900000a'? Или 0x00040900000a? Или CHAR( 0x00, 0x04, 0x09, 0x00, 0x00, 0x0a )? Вставить ник Quote
IVB Posted April 3, 2012 Author Posted April 3, 2012 Так никто и не ответил - пришлось разбираться самому. `Value` = '0x000403FC0017', Именно в таком виде: шестнадцатеричное число, записанное как строка. Вставить ник Quote
morfair Posted September 19, 2016 Posted September 19, 2016 Коллеги, я заметил, что на разном оборудование формат Agent-Circuit-Id может отличаться. Отсюда вопрос, каким образом вы заносите Agent-Circuit-Id в базу (radcheck)? Вставить ник Quote
s.lobanov Posted September 19, 2016 Posted September 19, 2016 Коллеги, я заметил, что на разном оборудование формат Agent-Circuit-Id может отличаться. Отсюда вопрос, каким образом вы заносите Agent-Circuit-Id в базу (radcheck)? обычно стараются приводить формат circuit-id к единому знаменателю путем настройки свитчей. если это невозможно, то пришите sql-процедуру, которая будет определять формат и приводить к нужному Вставить ник Quote
Ivan_83 Posted September 20, 2016 Posted September 20, 2016 У меня DHCP сервер на Perl это умеет парсить: http://forum.nag.ru/forum/index.php?showtopic=64849 Опция 82 - контейнер и может содержать много других опций, поэтому тупо матчить/вырезать по оффсетам не самый хороший вариант. Вставить ник Quote
morfair Posted September 21, 2016 Posted September 21, 2016 (edited) Приведу свое решение. В базе у пользователя (radcheck) сделал столбцы opt82_remote_id, opt82_circuit_unit, opt82_circuit_port и opt82_circuit_vlan, заполняются через юзер-интерфейс, названия, думаю, ясны. На сети доступа свитчи Zyxel и D-Link. Написал скрипт на Python для парсинга Agent-Remote-Id (который по нашим внутренним договоренностям - IP-адрес свитча, это важно для этого скрипта!) и Agent-Circuit-Id (скрипт написал на скорую руки, продвинутым питонщикам не судить строго, плс!), opt82_parse.py: #! /usr/bin/env python # # Kalinin Mikhail, morfair@gmail.com, 2016-09-21 # from optparse import OptionParser args_parser = OptionParser() args_parser.add_option("-r", "--agent-remote-id", help="Agent-Remote-Id RADIS attribute wo '0x'") args_parser.add_option("-c", "--agent-circuit-id", help="Agent-Circuit-Id RADIS attribute wo '0x'") return_parts = ["remote_id", "unit", "port", "vlan"] args_parser.add_option( "-p", "--part", help="Return option 82 part: %s" % ", ".join(return_parts) ) (opts, args) = args_parser.parse_args() #~ print opts if not opts.agent_remote_id or not opts.agent_circuit_id or not opts.part or opts.part not in return_parts: print "ERROR in arguments" import sys sys.exit(1) r = opts.agent_remote_id c = opts.agent_circuit_id p = opts.part def is_ip(s): a = s.split('.') if len(a) != 4: return False for x in a: if not x.isdigit(): return False i = int(x) if i < 0 or i > 255: return False return True def parse_dlink_format(r, c): try: res = {} res["remote_id"] = r[4:].decode("hex") res["unit"] = int(c[-4:-2], 16) res["port"] = int(c[-2:], 16) res["vlan"] = int(c[-8:-4], 16) res["info"] = "" return res except: return False def parse_zyxel_format(r, c): try: res = {} res["remote_id"] = r.decode("hex") res["unit"] = int(c[:2], 16) res["port"] = int(c[2:4], 16) res["vlan"] = int(c[4:8], 16) res["info"] = c[8:].decode("hex") return res except: return False def generate_out(res): #~ print "Tmp-String-1 := %s" % res["remote_id"] #~ print "Tmp-Integer-0 := %s" % res["unit"] #~ print "Tmp-Integer-1 := %s" % res["port"] #~ print "Tmp-Integer-2 := %s" % res["vlan"] print res[p] parse_zyxel = parse_zyxel_format(r, c) parse_dlink = parse_dlink_format(r, c) if is_ip( parse_zyxel["remote_id"] ): generate_out(parse_zyxel) else: generate_out(parse_dlink) Далее FreeRADIUS, policy.conf: opt82_generate_attrs { if ( Agent-Remote-Id && Agent-Circuit-Id ) { #update control { update request { Tmp-String-1 := "%{exec:/etc/freeradius/usr/opt82_parse.py -r %{hex:Agent-Remote-Id} -c %{hex:Agent-Circuit-Id} -p remote_id}" Tmp-Integer-0 := "%{exec:/etc/freeradius/usr/opt82_parse.py -r %{hex:Agent-Remote-Id} -c %{hex:Agent-Circuit-Id} -p unit}" Tmp-Integer-1 := "%{exec:/etc/freeradius/usr/opt82_parse.py -r %{hex:Agent-Remote-Id} -c %{hex:Agent-Circuit-Id} -p port}" Tmp-Integer-2 := "%{exec:/etc/freeradius/usr/opt82_parse.py -r %{hex:Agent-Remote-Id} -c %{hex:Agent-Circuit-Id} -p vlan}" } } } После этого добавляем "opt82_generate_attrs" в начало authorize {}: authorize { opt82_generate_attrs } И используем атрибуты Tmp-* при создании запроса SQL. Edited September 21, 2016 by morfair Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.