Перейти к содержимому
Калькуляторы

Формат Agent-Remote-ID и Agent-Circuit-ID для FreeRADIUS

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Agent-Remote-Id = 0x0006000dedb73d80

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

 

Agent-Circuit-Id = 0x00040900000a

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 `Value` = '0x000403FC0017',

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Приведу свое решение. В базе у пользователя (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.

Изменено пользователем morfair

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.