Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Якорь
inetDhcpProcessor
inetDhcpProcessor

Предназначен для выдачи IP-адресов по протоколу DHCP с опцией 82. Опцию в запрос должен подставить коммутатор, пропускающий запрос, далее запрос обязательно должен переслать DHCP-Relay. Идентификация сервисов осуществляется на основании полей circuitId и remoteId, но также могут быть настроены любые другие поля, определяющие порт коммутатора клиента.

Загружает список устройств-коммутаторов, начиная с корневого узла. Типы устройств-коммутаторов определяются в переменной конфигурации корневого узла dhcp.relay.deviceTypeIds через запятую. Также загружаются привязанные к коммутаторам сервисы договоров.

Когда приходит DHCP-запрос, из него извлекается поле giaddr (Relay-IP). Осуществляется поиск устройства-релея сначала по совпадению этого поля с адресом устройства в биллинге. Затем, если поиск был отрицательным - осуществляется поиск по совпадению IP-адреса, с которого пришёл DHCP-запрос с IP-адресом устройства.

...

При необходимости, данные параметры можно установить вручную в обработчике процессора протокола, в методе preprocessDhcpRequest (аналогично Image Removed InetRadiusProcessor).

Блок кода
languagejava
linenumbersfalse
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-адресу на устройстве и дочерних устройствах.

После поиска сервиса можно дополнительно использовать поиск дочернего устройства (как элемент дополнительной авторизации).

<subServSearchMode> может принимать значения:

  • 0 или отсутсвует - нет поиска дочернего сервиса
  • 1 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - ошибка авторизации;
  • 2 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - сессия будет привязана к родительскому сервису.

...

Адрес сессии выделяется либо из диапазона, указанного в самом сервисе, либо, если он исчерпан - из пула, определённого в конфигурации устройства. Пул адресов устройства определяется параметром конфигурации dhcp.ipCategories=<cat_codes>, где <cat_codes> - id коды категорий ресурсов IP адресов через запятую. Например:

Блок кода
languageruby
linenumbersfalse
dhcp.ipCategories=4

При превышении числа одновременных сессий сервиса над установленным в свойстве сервиса генерируется ошибка авторизации. В этом случае штатно ошибке авторизации DISCOVER-запросы будут игнорироваться, а на все REQUEST-запросы будет высылаться ответ DHCP_NAK. Для предотвращения нагрузки на DHCP-сервер постоянной обработкой запросов возможно определение пула фиктивных адресов, выдаваемых при ошибках авторизации. Пул определяется переменной конфигурации устройства dhcp.disable.ipCategories=<cat_codes>, где <cat_codes> - id коды категорий ресурсов IP адресов через запятую. Например:

...

При превышении количества сессий сервиса над ограничением в его свойствах при включенном pool.error выдаются несколько адресов из этого пула, после чего DHCP-запросы игнорируются. Это сделано для невозможности исчерпания пула фиктивных адресов отправкой большого количества DHCP-запросов с разными MAC-адресами. Количество сессий сверх ограничения, для которых могут быть выданы фиктивные адреса задаётся переменной конфигурации dhcp.additionalUnauthorizedSessionCount.

Так же можно в случае если выдачи фиктивного адреса создавать сессии на одном общем специальном сервисе. 

Блок кода
languageruby
linenumbersfalse
#код сервиса, на котором создается сессия с фиктивным адресом. 
dhcp.disable.servId=1

Эту опцию можно использовать в схемах, когда клиента подключают в какой-то новый порт изначально,  он получает фиктивный адрес, для него создается сессия на специальном сервисе.  Потом он заходит в личный кабинет и через дополнительные действия создает сервис , скрип находи его сессия на фиктивном договоре ( например по ip) , берет с нее информацию ( порт, mac и т.п) и создает уже нормальный сервис. 

При смене абонентом устройства идет новый запрос DHCP-Discover, но может быть ситуация, когда старая сессия еще не закрыта по таймауту (пример - только что было продление адреса и абонент сменил устройство). В этом случае будет считаться что у абонента уже есть одна сессия и что IP-адрес этой сессии еще занят. Для того, чтобы на DHCP-Discover происходило закрытие активных сессий на сервисе, нужно указать dhcp.connection.closeOnNew=1.

Если необходимо, чтобы адрес выдавался независимо от баланса/статуса/состояния, т.е. всегда, как при положительном балансе и открытом статусе договора, нужно указать параметр dhcp.disable.mode=1 или 2. При значении 1 InetAccess будет выдавать адрес всегда так, как если авторизация прошла успешно. Однако при необходимости переключить сессию из состояния отключена в подключена или наоборот будет выдан NAK, сессия завершится и создастся новая, при этом вызывая в обработчике активации сервисов onAccountingStop и onAccountingStart. При значении 2 при необходимости переключить состояние сессия не завершается (но connectionModify вызывается во всех трех случаях).

Блок кода
languageruby
# Режим выдачи адреса при неудачной авторизации. 0 (по умолчанию) - выдает адрес согласно параметрам dhcp.disable.*,
# 1 - выдает адрес как при удачной авторизации (при изменении состояния выдается NAK, срабатывает onAccountingStop, выдает ACK, срабатывает onAccountingStart), 
# 2 - выдает адрес как при удачной авторизации (при изменении состояния продолжает выдавать адрес).
dhcp.disable.mode=0

Якорь
dhcp_options
dhcp_options
Помимо IP-адреса в ответе DHCP-запроса могут передаваться различные опции. Они определяются из Их можно указать как в IP-ресурса, из которого выдан адрес, а также с помощью ресурсе, так и конфигурации устройства. При указании в IP-ресурсе полей Роутер, Маска и DNS, значения, при выдаче адреса из этого ресурса соответственно попадут в опции gate, subnetMask и dns. Также в конфигурации IP-ресурса можно указать дополнительные опции с помощью параметров dhcp.option.<option_name>=<option_value>.

Задать опции в конфигурации устройства можно с помощью переменных конфигурации dhcp.option.<option_name>=<option_value> и dhcp.net.option.<net>.<mask>.<option_name>=<option_value>, где:

  • <net> - сеть, для которой выдаётся параметр;
  • <mask> - маска сети;
  • <option_name> - название опции;
  • <option_value> - значение опции.

Первый параметр устанавливает опции безусловно, второй - в зависимости от выданного IP-адреса. 

Возможные значения названий опций и их значений перечислены в таблице.

...

Название опцииЗначение в видеВ DHCP пакете
leaseTimeЧисло в секундах.Опция 51, срок аренды IP-адреса
timeOffsetЧисло в секундах.Опция 2.
gateСтрока с IP-адресом в виде NNN.NNN.NNN.NNN.Опция 3, маршрутизатор
serverIdentifierСтрока с IP-адресом в виде NNN.NNN.NNN.NNN.Опция 54, идентификатор DHCP-сервера
dnsСтрока с одним или несколькими адресами вида NNN.NNN.NNN.NNN, разделённых запятой.Опция 6, DNS-сервера
domainNameСтрока.Опция 15, домен
subnetMaskСтрока с IP-адресом в виде NNN.NNN.NNN.NNN.Опция 1, маска подсети
renewalTimeЧисло в секундах.Опция 58, время, после которого DHCP-клиент должен перейти в RENEW
rebindingTimeЧисло в секундах.Опция 59, время, после которого DHCP-клиент должен перейти в REBIND

Для поддержки прямых RENEW запросов (т.е. когда RENEW запрос идет напрямую от абонента, не проходя через relay), в конфигурации нужно указать dhcp.renew=1. При этом для таких запросов можно указать специфичный набор опций, как dhcp.renew.option.<option_name>.

Пример конфигурации:

Блок кода
languagejava
linenumbersfalse
dhcp.option.serverIdentifier=0.0.0.0
dhcp.option.leaseTime=60
#
#dhcp.option.renewalTime=
#dhcp.option.rebindingTime=
#dhcp.inetOption.1.leaseTime=120
#
dhcp.net.option.193.106.88.0:255.255.255.0.gate=193.106.88.1
dhcp.net.option.193.106.88.0:255.255.255.0.dns=194.165.18.6
#
dhcp.net.option.172.16.24.0:255.255.255.0.gate=172.16.24.1
dhcp.net.option.172.16.24.0:255.255.255.0.dns=194.165.18.6