13.4.2. Процессор ru.bitel.bgbilling.modules.inet.dhcp.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