IVB Опубликовано 29 марта, 2012 · Жалоба Нужна помощь. Тестируем проверку Opt-82 через RADIUS сервер (FreeRADIUS 2.1.11) В Access-Request исправно попадают атрибуты Agent-Remote-Id и Agent-Circuit-Id. В Радиусе, в таблице authcheck_table, должны быть записи с правильными значениями для этих атрибутов. Собственно, вопрос. В каком формате должны храниться эти значения? Поделитесь примерчиком, плиз. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dwemer Опубликовано 30 марта, 2012 · Жалоба Agent-Remote-Id = 0x0006000dedb73d80 0006 это длина 6 байт, 000dedb73d80 это мак коммутатора\релея Agent-Circuit-Id = 0x00040900000a 0004 это длина 4 байта, первые 2 байта 0900 это влан. следующие 2 байта 000a это номер порта Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
IVB Опубликовано 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 )? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
IVB Опубликовано 3 апреля, 2012 · Жалоба Так никто и не ответил - пришлось разбираться самому. `Value` = '0x000403FC0017', Именно в таком виде: шестнадцатеричное число, записанное как строка. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
morfair Опубликовано 19 сентября, 2016 · Жалоба Коллеги, я заметил, что на разном оборудование формат Agent-Circuit-Id может отличаться. Отсюда вопрос, каким образом вы заносите Agent-Circuit-Id в базу (radcheck)? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
s.lobanov Опубликовано 19 сентября, 2016 · Жалоба Коллеги, я заметил, что на разном оборудование формат Agent-Circuit-Id может отличаться. Отсюда вопрос, каким образом вы заносите Agent-Circuit-Id в базу (radcheck)? обычно стараются приводить формат circuit-id к единому знаменателю путем настройки свитчей. если это невозможно, то пришите sql-процедуру, которая будет определять формат и приводить к нужному Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 20 сентября, 2016 · Жалоба У меня DHCP сервер на Perl это умеет парсить: http://forum.nag.ru/forum/index.php?showtopic=64849 Опция 82 - контейнер и может содержать много других опций, поэтому тупо матчить/вырезать по оффсетам не самый хороший вариант. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
morfair Опубликовано 21 сентября, 2016 (изменено) · Жалоба Приведу свое решение. В базе у пользователя (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. Изменено 21 сентября, 2016 пользователем morfair Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...