...
Предназначен для выдачи IP-адресов по протоколу DHCP с опцией 82. Опцию в запрос должен подставить коммутатор, пропускающий запрос, далее запрос обязательно должен переслать DHCP-Relay. Идентификация сервисов осуществляется на основании полей полей circuitId и и remoteId, но также могут быть настроены любые другие поля, определяющие порт коммутатора клиента.
Загружает список устройств-коммутаторов, начиная с корневого узла. Типы устройств-коммутаторов определяются в переменной конфигурации корневого узла узла dhcp.relay.deviceTypeIds через через запятую. Также загружаются привязанные к коммутаторам сервисы договоров.
Когда приходит DHCP-запрос, из него извлекается поле поле giaddr (Relay-IP). Осуществляется поиск устройства-релея сначала по совпадению этого поля с адресом устройства в биллинге. Затем, если поиск был отрицательным - осуществляется поиск по совпадению IP-адреса, с которого пришёл DHCP-запрос с IP-адресом устройства.
...
При необходимости, данные параметры можно установить вручную в обработчике процессора протокола, в методе методе preprocessDhcpRequest (аналогично аналогично InetRadiusProcessor).
Блок кода | ||||
---|---|---|---|---|
| ||||
final DhcpOption agentRemoteId = request.getSubOption( option82RemoteIdCode ); if( agentRemoteId != null ) { byte[] value = new byte[option82RemoteIdLength]; System.arraycopy( agentRemoteId.value, option82RemoteIdPosition, value, 0, option82RemoteIdLength ); request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, value ); } final DhcpOption vlanId = request.getSubOption( option82VlanIdCode ); if( vlanId != null ) { int vlan = InetUtils.parseInt( vlanId.value, option82VlanIdPosition, option82VlanIdLength ); request.setOption( InetDhcpProcessor.VLAN_ID, vlan ); } |
...
Идентификация коммутатора, расположенного под релеем и сервиса на коммутаторе, может производится в нескольких режимах. Режимы определяется параметром конфигурации устройства-релея.
<deviceSearchMode> может может принимать значения:
- 0 (рекомендуется) - по giaddr или IP-адресу источника идет поиск устройства, далее у этого устройства вызывается предобработка preprocessDhcpRequest (где можно при необходимости извлечь и установить AGENT_REMOTE_ID, а также INTERFACE_ID или VLAN_ID), далее по установленному AGENT_REMOTE_ID или, если AGENT_REMOTE_ID не установлен - по конфигурации dhcp.option82.agentRemoteId.x agentRemoteId извлекается из пакета и идет поиск агентского устройства по совпадению совпадению идентификатора устройства устройства, далее у агентского устройства, если таковое найдено вызывается preprocessDhcpRequest (где можно при необходимости извлечь и установить INTERFACE_ID или VLAN_ID). Здесь запоминаются оба устройства, как deviceId и agentDeviceId;
- 1 - по giaddr или IP-адресу источника идет поиск устройства, по его конфигурации идет извлечение agentRemoteId, далее по agentRemoteId идет поиск агентского устройства. Здесь запоминается последнее найденное устройство как deviceId, agentDeviceId для биллинга будет 0;
- 2 - по giaddr или IP-адресу источника идет поиск устройства, найденное устройство будет запомнено как deviceId, agentDeviceId для биллинга будет 0.
Поиск сервиса происходит на агентском устройстве (agentDeviceId), если оно найдено, иначе на устройстве (deviceId).
<servSearchMode> может может принимать значения:
- 1 - поиск по интерфейсу на (найденном) устройстве;
- 2 - поиск по VLAN'у на устройстве;
- 3 - поиск на устройстве по интерфейсу и MAC-адресу;
- 4 - поиск по VLAN'у на устройстве и его дочерних устройствах;
- 5 - поиск по MAC-адресу на устройстве;
- 6 - поиск по MAC-адресу на устройстве и дочерних устройствах;
- 10 - поиск по MAC-адресу на всех устройствах;
- 11 - поиск по VLAN и MAC-адресу на устройстве, а также на его потомках и его предках;
- 12 - поиск по VLAN и порту на устройстве.
После поиска сервиса можно дополнительно использовать поиск дочернего устройства (как элемент дополнительной авторизации).
<subServSearchMode> может может принимать значения:
- 0 или или отсутсвует - нет поиска дочернего сервиса
- 1 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - ошибка авторизации;
- 2 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - сессия будет привязана к родительскому сервису.
Процесс DHCP-авторизации состоит из двух запросов: DISCOVER и REQUEST. В первом запросе клиент запрашивает IP-адреса, какие ему могут предложить DHCP сервера. Во втором просит закрепить за ним конкретный IP-адрес. На DHCP-сервер биллинга попадают запросы с опцией 82, которая позволяет идентифицировать клиента. После идентификации клиента ему выдаётся IP-адрес. Идентификатором сессии при DHCP.82 авторизации выступает MAC-адрес клиента. Допускается одновременная инициализация нескольких сессий за одним портом коммутатора.
Выдача IP-адреса
Адрес сессии выделяется либо из диапазона, указанного в самом сервисе, либо, если он исчерпан или не указан - из пула, определённого в конфигурации устройства. Пул адресов устройства определяется параметром конфигурации конфигурации dhcp.ipCategories=<cat_codes>, где где <cat_codes> - id коды коды категорий ресурсов IP адресов через через запятую. Например:
Блок кода | ||||
---|---|---|---|---|
| ||||
dhcp.ipCategories=4 |
При ошибке авторизации DISCOVER-запросы будут игнорироваться, а на все REQUEST-запросы будет высылаться ответ DHCP_NAK. Для предотвращения нагрузки на DHCP-сервер постоянной обработкой запросов возможно определение пула фиктивных адресов, выдаваемых при ошибках авторизации. Пул определяется переменной конфигурации устройства устройства dhcp.disable.ipCategories=<cat_codes>, где где <cat_codes> - id коды коды категорий ресурсов IP адресов через через запятую. Например:
Блок кода | ||||
---|---|---|---|---|
| ||||
dhcp.disable.ipCategories=3,4 |
При превышении количества сессий сервиса над ограничением в его свойствах при включенном pool.error выдаются несколько адресов из этого пула, после чего DHCP-запросы игнорируются. Это сделано для невозможности исчерпания пула фиктивных адресов отправкой большого количества DHCP-запросов с разными MAC-адресами. Количество сессий сверх ограничения, для которых могут быть выданы фиктивные адреса задаётся переменной конфигурации конфигурации dhcp.additionalUnauthorizedSessionCount.
Также адреса для динамической выдачи можно указать с помощью помощью именованных пулов IP-адресов:
Блок кода | ||||
---|---|---|---|---|
| ||||
dhcp.ipPool=myWhitePool dhcp.disable.ipPool=myGreyPool |
...
Если необходимо, чтобы адрес выдавался независимо от баланса/статуса/состояния, т.е. всегда, как при положительном балансе и открытом статусе договора, нужно указать параметр параметр dhcp.disable.mode=1 или или 2. При значении 1 InetAccess будет выдавать адрес всегда так, как если авторизация прошла успешно. Однако при необходимости переключить сессию из состояния отключена в подключена или наоборот будет выдан NAK, сессия завершится и создастся новая, при этом вызывая в обработчике активации сервисов onAccountingStop и onAccountingStart. При значении 2 при необходимости переключить состояние сессия не завершается (но connectionModify вызывается во всех трех случаях).
Блок кода | ||
---|---|---|
| ||
# Режим выдачи адреса при неудачной авторизации. 0 (по умолчанию) - выдает адрес согласно параметрам dhcp.disable.*, # 1 - выдает адрес как при удачной авторизации (при изменении состояния выдается NAK, срабатывает onAccountingStop, выдает ACK, срабатывает onAccountingStart), # 2 - выдает адрес как при удачной авторизации (при изменении состояния продолжает выдавать адрес). dhcp.disable.mode=0 |
Выдача IP-адреса в зависимости от опций Inet
При необходимости выдачи IP-адресов из разных пулов в зависимости от опций Inet, необходимо описать именованный пул IP-адресов. и указать данный пул в конфигурации опции Inet:
Блок кода | ||
---|---|---|
| ||
# При активной опции на сервисе договора выдаем адрес из указанного пула IP-адресов
dhcp.ipPool=myWhitePool |
Или в конфигурации устройства:
Блок кода | ||
---|---|---|
| ||
# При активной опции c ID 5 на сервисе договора выдаем адрес из указанного пула IP-адресов
dhcp.inetOption.5.ipPool=myWhitePool |
Выдача DHCP-опций
Якорь | ||||
---|---|---|---|---|
|
Задать опции в конфигурации устройства можно с помощью переменных конфигурации конфигурации dhcp.option.<option_name>=<option_value> и и dhcp.net.option.<net>.<mask>.<option_name>=<option_value>, где:
- <net> - сеть, для которой выдаётся параметр;
- <mask> - маска сети;
- <option_name> - название опции;
- <option_value> - значение опции.
Первый параметр устанавливает опции безусловно, второй - в зависимости от выданного IP-адреса.
...
Для поддержки прямых RENEW запросов (т.е. когда RENEW запрос идет напрямую от абонента, не проходя через relay), в конфигурации нужно указать указать dhcp.renew=1 (см. Получение IP-адреса DHCP-клиентом). При этом для таких запросов можно указать специфичный набор опций, как как dhcp.renew.option.<option_name>.
...
Возможна ситуация, когда DHCP-клиент в роутере абонента повисает и начинает слать бесконечные DISCOVER. Чтобы постоянно не резервировать IP-адресы из пула предусмотрена система блокировки. Например, по умолчанию, если за две минуты пришло 10 DISCOVER-пакетов, то блокировать на полчаса. Рекомендуется менять только параметры параметры dhcp.ban.discoverCount и и dhcp.ban.timeout. Конфигурацию можно указывать в устройстве и типе устройства:
...
С версии 7.0 для обработки такой ситуации (вместо использования использования dhcp.connection.closeOnNew=1) можно использовать параметр конфигурации dhcp.connection.checkDuplicate. Он работает аналогично radius.connection.checkDuplicate, поэтому нужно указать цифру во втором разряде (для обработки ситуации, когда количество активных соединений превышено, но соединения с таким MAC-адресом не найдено, и нужно отключить просто самое старое соединение):
...
В большинстве случаев подойдет значение dhcp.connection.checkDuplicate=90.