...
Эту опцию можно использовать в схемах, когда клиента подключают изначально в какой-то новый порт, он получает фиктивный адрес, для него создается сессия на специальном сервисе. Далее он заходит в личный кабинет и через дополнительные действия создает сервис , скрипт находит его сессию на фиктивном договоре (например, по IP), берет с нее информацию (порт, MAC-адрес и т.п.) и создает уже обычный сервис на договоре этого абонента.
При смене абонентом устройства идет новый запрос DHCP-Discover, но может быть ситуация, когда старая сессия еще не закрыта по таймауту (пример - только что было продление адреса и абонент сменил устройство). В этом случае будет считаться что у абонента уже есть одна сессия и что IP-адрес этой сессии еще занят. Для того, чтобы на DHCP-Discover происходило закрытие активных сессий на сервисе, нужно указать dhcp.connection.closeOnNew=1.
Если необходимо, чтобы адрес выдавался независимо от баланса/статуса/состояния, т.е. всегда, как при положительном балансе и открытом статусе договора, нужно указать параметр dhcp.disable.mode=1 или 2. При значении 1 InetAccess будет выдавать адрес всегда так, как если авторизация прошла успешно. Однако при необходимости переключить сессию из состояния отключена в подключена или наоборот будет выдан NAK, сессия завершится и создастся новая, при этом вызывая в обработчике активации сервисов onAccountingStop и onAccountingStart. При значении 2 при необходимости переключить состояние сессия не завершается (но connectionModify вызывается во всех трех случаях).
...
Блок кода | ||||
---|---|---|---|---|
| ||||
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 |
Действие при получении DHCP-Discover при наличии активной сессии
При работе по протоколу DHCP нельзя достоверно узнать, когда закончилась DHCP-сессия (доверять DHCP-Release мы не можем), поэтому в биллинге такая сессия по умолчанию завершается по таймауту connection.close.timeout, который выставляется больше, чем время выданное lease.
При смене абонентом устройства идет новый запрос DHCP-Discover, но может быть ситуация, когда старая сессия еще не закрыта по таймауту (пример - только что было продление адреса и абонент сменил устройство). В этом случае будет считаться, что у абонента уже есть одна сессия и что IP-адрес этой сессии еще занят. Для того, чтобы на DHCP-Discover происходило закрытие активных сессий на сервисе, нужно указать dhcp.connection.closeOnNew=1. Но в этому случае на одном сервисе возможна только одна активная сессия.
С версии 7.0 для обработки такой ситуации (вместо использования dhcp.connection.closeOnNew=1) можно использовать параметр конфигурации dhcp.connection.checkDuplicate. Он работает аналогично radius.connection.checkDuplicate, поэтому нужно указать цифру во втором разряде (для обработки ситуации, когда количество активных соединений превышено, но соединения с таким MAC-адресом не найдено, и нужно отключить просто самое старое соединение):
- 4 - происходит попытка сброса старого соединения, затем через 5 секунд завершение в биллинге, абонента на этой авторизации не пускаем;
- 5 - попытка сброса старого соединения в биллинге, завершение и пускаем немедленно (т.е. игнорируется ошибка );
- 6 - завершение старого соединения в биллинге, пускаем абонента немедленно;
- 7 - попытка в течении 5 секунд сбросить соединение, затем закрытие сессии в биллинге с ожиданием полного выполнения закрытия (т.е. IP-адрес станет свободным), пускаем абонента
- 8 - попытка сброса и сразу закрытие в биллинге с ожиданием полного выполнения закрытия (т.е. IP-адрес станет свободным), пускаем абонента;
- 9 - закрытие старого соединения в биллинге с ожиданием полного выполнения закрытия (т.е. IP-адрес станет свободным), пускаем абонента.
В большинстве случаев подойдет значение dhcp.connection.checkDuplicate=90.