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

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

Ключ

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

...

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

Scroll Ignore

Оглавление
printablefalse

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

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

Для обработки DHCP-RENEW-запросов без опции DHCP Option 82 в конфигурации корневого устройства необходимо указать:

Блок кода
languageruby
linenumbersfalse
# Нужно ли обрабатывать RENEW-запросы без Option 82 (требуется перезапуск InetAccess)
# 0 - нет (по умолчанию), 1  - да (рекомендуется)
dhcp.renew=1

Если по каким-то причинам клиентские устройства (например, NetGear JWNR2000) в DHCP-REQUEST посылают xid, отличный от DHCP-DISCOVER, можно убрать привязку к xid-запросам, прописав в конфигурации устройства-коммутратора/типа устройства/конфигурации модулякорневого устройства:

Блок кода
languageruby
linenumbersfalse
# Привязка к xid DHCP-запросов (требуется перезапуск InetAccess)
# 0 - выкл., 1 (по умолчанию) - вкл.
dhcp.xid=0

...

Блок кода
languageruby
linenumbersfalse
# Нужно ли отвечать на DHCP-INFO-запросы
# 0 - выкл. (по умолчанию), 1 - вкл.
dhcp.offer.infoDiscover=1

Опция 82

Подсказка

Смотри также Настройка разбора опции DHCP Option 82.

Далее алгоритм работы определяется переменными конфигурации найденного устройства-релея. Следующие параметры определяют, какие опции извлекаются для идентификации устройства-коммутатора клиента и непосредственно клиента по порту или VLAN.

...

При необходимости, данные параметры можно установить вручную в обработчике процессора протокола, в методе методе preprocessDhcpRequest  (аналогично аналогично 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 );
}

...

Блок кода
languagejava
linenumbersfalse
@Override
public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response )
     throws Exception
{
  DhcpOption circuitId = request.getSubOption( (byte)1 );
  DhcpOption remoteId = request.getSubOption( (byte)2 );

  request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, new String( remoteId.value, "UTF-8" ) );
  request.setOption( InetDhcpProcessor.INTERFACE_ID, new String( circuitId.value, "UTF-8" ) );
}

При необходимости, для релея можно отключить проверку на наличие DHCP Option 82 в пакете. В этом случае поиск абонента должен осуществляться без их использования, например, по MAC-адресу.

Блок кода
languageruby
linenumbersfalse
# Требуется ли наличие DHCP Option 82 в пакете (за исключением RENEW-запросов),
# 0 - не требуется, 1 (по умолчанию) - требуется.
dhcp.option82.required=0

Поиск абонента

По описанным выше значениям AGENT_REMOTE_ID, INTERFACE_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 0 - поиск по логину на всех устройствах (извлечение значения логина должно быть настроено в конфигурации или произведено в предобработке);
  • 1 - поиск по интерфейсу на (найденном) устройстве;
  • 2  - поиск по VLAN'у на устройстве;
  • 3  - поиск на устройстве по интерфейсу и MAC-адресу;
  • 4  - поиск по VLAN'у на устройстве и его дочерних устройствах;
  • 5  - поиск по MAC-адресу на устройстве;
  • 6  - поиск по MAC-адресу на устройстве и дочерних устройствах;
  • 10  - поиск по MAC-адресу на всех устройствах;
  • 11  - поиск по VLAN и MAC-адресу на устройстве, а также на его потомках и его предках;
  • 12  - поиск по VLAN и порту на устройстве;
  • 20 -  поиск по логину аналогично 0, но только на устройстве и его дочерних устройствах.

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

<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 адресов через через запятую. Например:

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

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

Также адреса для динамической выдачи можно указать с помощью помощью именованных пулов IP-адресов:

Блок кода
languageruby
linenumbersfalse
dhcp.ipPool=myWhitePool
dhcp.disable.ipPool=myGreyPool

...

Блок кода
languageruby
linenumbersfalse
#код# сервиса,ID нафиктивного которомсервиса создаетсядля сессиянеаутентифицированных ссессий фиктивным
адресом. 
dhcp.disable.servId=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
Примечание

В случае, если состояние сессии изменяется с помощью обработчика активации сервисов или указан параметр sa.connection.stateModify=1 (меняющий состояние сессии, даже если нет обработчика активации сервисов), то при последующем получении DHCP-запроса состояние сессии будет уже совпадать с необходимым и буден выдан ACK даже если dhcp.disable.mode=0|1. Т.е. в этом случае подразумевается, что доступ абоненту уже был переключен и нет необходимости производить переполучение адреса.

В случае, если в сервисе или дочернем сервисе необходимо указать IP-адрес для управления, но при этом адрес из этого сервиса не должен выдаваться по DHCP, то в конфигурации типа сервиса следует указать:

Блок кода
languageruby
# Не выдавать адрес по DHCP из сервисов данного типа
serv.dhcp.noAddress=1

Выдача IP-адреса в зависимости от опций Inet

При необходимости выдачи IP-адресов из разных пулов в зависимости от опций Inet, необходимо описать именованный пул IP-адресов. и указать данный пул в конфигурации опции Inet:

...

Задать опции в конфигурации устройства можно с помощью переменных конфигурации конфигурации 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

Также можно добавить опцию с помощью ее кода/типа и указания значения в формате HEX, например, dhcp.option.43=68656c6c6f.

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

...

Возможна ситуация, когда DHCP-клиент в роутере абонента повисает и начинает слать бесконечные DISCOVER. Чтобы постоянно не резервировать IP-адресы из пула предусмотрена система блокировки. Например, по умолчанию, если за две минуты пришло 10 DISCOVER-пакетов, то блокировать на полчаса. Рекомендуется менять только параметры параметры dhcp.ban.discoverCount и  и dhcp.ban.timeout. Конфигурацию можно указывать в устройстве и типе устройства:

Блок кода
languagejava
linenumbersfalse
# На сколько действует выданный OFFER (не может быть больше 60 секунд)
dhcp.offer.timeout=25
# промежуток времени в секундах, за которой пришло указанное кол-во DISCOVER
dhcp.ban.checkTimeout=120
# кол-во DISCOVER, которое пришло за указанный промежуток времени
dhcp.ban.discoverCount=10
# время в секундах, на которое перестаем отвечать на DISCOVER-запросы
dhcp.ban.timeout=1800

При необходимости можно сбросить бан с помощью командной строки:

Блок кода
languagebash
./access.sh dhcpBanRemove

Действие при получении DHCP-Discover при наличии активной сессии

...

С версии 7.0 для обработки такой ситуации (вместо использования использования dhcp.connection.closeOnNew=1) можно использовать параметр конфигурации dhcp.connection.checkDuplicate. Он работает аналогично radius.connection.checkDuplicate, поэтому нужно указать цифру во втором разряде (для обработки ситуации, когда количество активных соединений превышено, но соединения с таким MAC-адресом не найдено, и нужно отключить просто самое старое соединение):

...

В большинстве случаев подойдет значение dhcp.connection.checkDuplicate=90.

Дополнительные параметры

В некоторых случаях возможна ситуация, когда запросы с неизвестных биллингу relay-агентов нужно игнорировать (т.к. в случае RENEW-запроса и dhcp.renew=1 биллинг будет отвечать NAK). Для этого в конфигурации корневого устройства укажите:

Блок кода
languageruby
linenumbersfalse
# Нужно ли игнорировать все запросы с неизвестным giaddr (требуется перезапуск InetAccess)
# 0 - нет (по умолчанию), 1 - да
dhcp.skipUnknownDevices=1

При поиске relay-агента сначала происходит поиск по giaddr, затем, если устройство еще не найден - поиск по source IP-адресу DHCP-пакета. Если данный дополнительный поиск необходимо отключить, укажите в конфигурации корневого устройства:

Блок кода
languageruby
linenumbersfalse
# Поиск по IP-адресу дополнительно к поиску по giaddr (требуется перезапуск InetAccess)
# 0 - нет, 1 - да (по умолчанию)
dhcp.findDeviceBySocketAddress=0

Если Вы не хотите указывать в дереве устройств все relay-агенты, а производить поиск только по agentRemoteId, то в конфигурации корневого устройства вы можете указать ID устройства, к которому будут привязываться DHCP-пакеты, вместо поиска по giaddr:

Блок кода
languageruby
linenumbersfalse
# Привязка всех DHCP-пакетов к устройству, вместо поиска по giaddr (требуется перезапуск InetAccess)
dhcp.overrideRelayDeviceId=