Процессор InetDhcpHelperProcessor
Предназначен для работы в связке с RADIUS-процессором. При успешной авторизиции или старте сессии InetDhcpHelperProcessor запоминает сессию по ключу, который создается из шаблона dhcp.key.pattern, указанного в конфиге. В шаблоне могут быть указаны следующие параметры:
deviceId - устройство, к которому привязана сессия, т.е. NAS, с которого идет RADIUS-аккаунтинг,
remoteId - агентское устройство, обычно коммутатор с которого пришел DHCP-relay-запрос на NAS,
circuitId - порт или VLAN, в зависимости от указанного типа поиска,
mac - MAC-адрес, для данной схемы он должен быть в RADIUS-атрибуте Calling-Station-Id.
При получении DHCP-запроса по указанному dhcp.key.pattern извлекаются данные из DHCP-пакета, т.е. по giaddr или IP-адресу, от которого запроса идет поиск устройства deviceId, аналогично InetDhcpProcessor из пакета извлекаются agentRemoteId и circuitId, по agentRemoteId идет поиск агентского устройства remoteId, и по circuitId - порта или VLAN, MAC-адрес извлекается из соответсвующего поля DHCP-пакета.
По этому ключу идет поиск среди запомненных RADIUS-сессий и выдача соответствующего ответа c IP-адресом из сессии.
Т.е. задача настроить так, чтобы из RADIUS-пакета и DHCP-пакета извлекались одни и те же данные (устройство, агентское устройство, порт/VLAN, MAC-адрес). Для этого в обработчике процессора протокола происходит извлечение из RADIUS-пакета DHCP-опций remoteId и circuitId.
Работа процессора зависит от параметра radius.servSearchMode:
при поиске по логину (не рекомендуется, устарел, не удобен для связки с DHCP), в логине пользователя должны содержаться разделёнными двоеточием субопции DHCP.82 remoteId и circuitId, в номере звонящего - строка с HEX MAC-адреса. IP-адрес запоминается по ключу код устройства + опции + MAC-адрес;
при остальных видах поиска из DHCP-запроса извлекаются идентификатор агентского устройства и номер порта или VLAN, аналогично InetDhcpProcessor. IP-адрес запоминается по ключу код устройства + код агентского устройства + номер интерфейса/VLAN + MAC.
Во всех случаях в RADIUS-атрибуте Calling-Station-Id должен быть проставлен MAC-адрес, чтобы при перезагрузке Access-сервера данные загрузились из сессий.
# Параметр привязки IP-адреса (сессии) к DHCP
dhcp.key.pattern=
$deviceId
:
$remoteId
:
$circuitId
:
$mac
# Если по какой-то причине невозможно узнать из RADIUS-запроса агентское устройство или номер интерфейса/VLAN, то привязку можно сократить до кода устройства + MAC:
#dhcp.key.pattern=$deviceId:$mac
Процессор загружает список устройств-коммутаторов, начиная с корневого узла. Типы устройств-коммутаторов можно отфильтровать в переменной конфигурации корневого узла dhcp.relay.deviceTypeIds через запятую. Алгоритм поиска устройства при получении запроса идентичен ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpProcessor.
Пример пакетов для обработчика ISGProtocolHandler:
RADIUS:
Packet type: Access-Request
Identifier:
140
Authenticator: {
12
6B D7 9F
37
1E A1
39
BA 8C CD
13
0B CD
98
7B}
Attributes:
User-Name=00060012cf539f5e:
000403420101
:
0080.4840
.a46f
NAS-Identifier=
7201
-ipoe.nettrans.ru
NAS-Port-Id=
0
/
0
/
1
/
834
User-Password=
123
Event-Timestamp=
1314183142
NAS-IP-Address=
94.125
.
95.117
NAS-Port=
412
Service-Type=
5
Acct-Session-Id=720000000000019C
NAS-Port-Type=
33
cisco-avpair=circuit-id-tag=
000403420101
cisco-avpair=remote-id-tag=00060012cf539f5e
cisco-NAS-Port=
0
/
0
/
1
/
834
DHCP:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Discover{
1
}
htype:
1
, hlen:
6
, hops:
1
xid:
1067065417
, secs:
0
, flags:
0
Client IP:
0.0
.
0.0
Your IP:
0.0
.
0.0
Server IP:
0.0
.
0.0
Relay IP:
109.233
.
170.1
Client MAC: {00804840A46F}
Host name{
12
}={support-desktop}
Parameter request list{
55
}={
1
,
28
,
2
,
3
,
15
,
6
,
119
,
12
,
44
,
47
,
26
,
121
,
42
}
Agent information{
82
}=
sub{
1
}={
000403420101
}
sub{
2
}={00060012CF539F5E}
Пример конфигурации для таких пакетов:
# Параметры извлечения опций из RADIUS-пакета
# игнорирование заголовка опций (длина)
radius.agent.option.removeHeader=
2
# RADIUS-атрибут cisco-avpair
radius.agent.option.remoteId.type=
1
# префикс для cisco-avpair с опцией remoteId
radius.agent.option.remoteId.prefix=remote-id-tag=
# RADIUS-атрибут cisco-avpair
radius.agent.option.circuitId.type=
1
# префикс для cisco-avpair с опцией circuitId
radius.agent.option.circuitId.prefix=circuit-id-tag=
# Параметры извлечения опций из DHCP-пакета
# игнорирование заголовка опций (длина)
dhcp.option82.removeHeader=
2
# Параметры для извлечения из пакета agentRemoteId
# код субопции 82, содержащей идентификатор коммутатора клиента, позиция и длина последовательности идентификатора
dhcp.option82.agentRemoteId.code=
2
dhcp.option82.agentRemoteId.position=
0
dhcp.option82.agentRemoteId.length=
6
# Параметры извлечения INTERFACE_ID и VLAN
# (position и length используются и для извлечения их из circuitId, найденном в RADIUS-пакете!)
# код субопции 82, содержащей VLAN, позиция и длина в субопции
dhcp.option82.vlanId.code=
1
dhcp.option82.vlanId.position=
0
dhcp.option82.vlanId.length=
2
# код субопции 82, содержащей интерфейс, позиция и длина в субопции
dhcp.option82.interfaceId.code=
1
dhcp.option82.interfaceId.position=
3
dhcp.option82.interfaceId.length=
1
# Шаблон, по которому создается ключ для привязки RADIUS-сессии и DHCP-пакетов.
# $deviceId - устройство (обычно NAS и relay-агент, с которого пришел DHCP-запрос на биллинг)
# $remoteId - агенское устройство (обычно коммутатор, к которому подключен абонент), определенное по agentRemoteId
# $circuitId - в зависимости от типа поиска сервиса либо interfaceId, либо VLAN
# $mac - MAC-адрес
radius.key.pattern=
$deviceId
:
$remoteId
:
$circuitId
:
$mac