Jump to content

Recommended Posts

Posted

Нужна помощь.

 

Тестируем проверку Opt-82 через RADIUS сервер (FreeRADIUS 2.1.11)

 

В Access-Request исправно попадают атрибуты Agent-Remote-Id и Agent-Circuit-Id. В Радиусе, в таблице authcheck_table, должны быть записи с правильными значениями для этих атрибутов.

 

Собственно, вопрос.

 

В каком формате должны храниться эти значения? Поделитесь примерчиком, плиз.

Posted

Agent-Remote-Id = 0x0006000dedb73d80

0006 это длина 6 байт, 000dedb73d80 это мак коммутатора\релея

 

Agent-Circuit-Id = 0x00040900000a

0004 это длина 4 байта, первые 2 байта 0900 это влан. следующие 2 байта 000a это номер порта

Posted

Если есть возможность, что вас поймут неправильно - вас поймут неправильно.

 

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 )?

Posted

Так никто и не ответил - пришлось разбираться самому.

 

 `Value` = '0x000403FC0017',

 

Именно в таком виде: шестнадцатеричное число, записанное как строка.

  • 4 years later...
Posted

Коллеги, я заметил, что на разном оборудование формат Agent-Circuit-Id может отличаться. Отсюда вопрос, каким образом вы заносите Agent-Circuit-Id в базу (radcheck)?

Posted

Коллеги, я заметил, что на разном оборудование формат Agent-Circuit-Id может отличаться. Отсюда вопрос, каким образом вы заносите Agent-Circuit-Id в базу (radcheck)?

 

обычно стараются приводить формат circuit-id к единому знаменателю путем настройки свитчей. если это невозможно, то пришите sql-процедуру, которая будет определять формат и приводить к нужному

Posted

У меня DHCP сервер на Perl это умеет парсить: http://forum.nag.ru/forum/index.php?showtopic=64849

Опция 82 - контейнер и может содержать много других опций, поэтому тупо матчить/вырезать по оффсетам не самый хороший вариант.

Posted (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 by morfair

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.