Настройка разбора опции DHCP.82
Материал из BiTel WiKi
Amir (Обсуждение | вклад) (Новая страница: «Для корректной работы нужно правильно извлекать значения agentRemoteId, circuitId (port/VLAN) из DHCP-пакет…») |
Amir (Обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | == Извлечение значений, идентифицирующих абонента из DHCP-пакета == | ||
+ | |||
Для корректной работы нужно правильно извлекать значения agentRemoteId, circuitId (port/VLAN) из DHCP-пакета. | Для корректной работы нужно правильно извлекать значения agentRemoteId, circuitId (port/VLAN) из DHCP-пакета. | ||
А в случае использования IPoE c Cisco ISG или SmartEdge еще и из RADIUS-пакетов (в этом случае субопции опции 82 находятся внутри пакетов). | А в случае использования IPoE c Cisco ISG или SmartEdge еще и из RADIUS-пакетов (в этом случае субопции опции 82 находятся внутри пакетов). | ||
Строка 31: | Строка 33: | ||
dhcp.option82.vlanId.length=2 | dhcp.option82.vlanId.length=2 | ||
- | Если используется Cisco ISG или SmartEdge, то нужно указать параметры извлечения из RADIUS-пакета. | + | == Разные типы устройств == |
+ | |||
+ | Если используются разные типы устройств, у которых разные форматы circuitId, тип поиска DHCP-устройства должен быть 0 (в этом режиме сначала находится устройство по giaddr, у него вызывается preprocess, затем находится агентское ус-во, у него тоже вызывается preprocess) или 1 (в этом режиме сначала находится устройство по giaddr, затем находится агентское ус-во, у него тоже вызывается preprocess). | ||
+ | |||
+ | dhcp.deviceSearchMode=0 | ||
+ | |||
+ | Конфигурация парсинга agentRemoteId должна быть указана в устройстве, с которого приходит запрос на InetAccess (т.е. чей giaddr указан в пакете). А конфигурация извлечения порта/VLAN из curcuitId должна быть указана в агентских типах устройствах. Таким образом InetAccess найдет relay agent по giaddr, по его конфигурации извлечет agentRemoteId, по agentRemoteId найдет дочернее агентское устройство и уже по его конфигурации извлечет значения порта/VLAN. | ||
+ | |||
+ | == Разные типы устройств c разным форматом agentRemoteId == | ||
+ | |||
+ | В этом случае нельзя однозначно указать в конфигурации как извлечь agentRemoteId, в отличие от варианта выше. Поэтому нужно воспользоваться предобработкой пакетов. Укажите тип поиска DHCP-устройства = 0 (в этом режиме сначала находится устройство по giaddr, у него вызывается preprocess, затем находится агентское ус-во, у него тоже вызывается preprocess). | ||
+ | |||
+ | dhcp.deviceSearchMode=0 | ||
+ | |||
+ | Расширьте обработчик процессора протокола типа устройства, с с которого приходит запрос на InetAccess (т.е. чей giaddr указан в пакете). По giaddr InetAccess однозначно найдет устройство. Затем вызовет у него предобработку, в которой нужно определить как распарсить и в ручную проставить agentRemoteId. | ||
+ | |||
+ | <source lang="java">public class Dhcp82ProtocolHandler | ||
+ | extends ProtocolHandlerAdapter | ||
+ | implements DhcpProtocolHandler | ||
+ | { | ||
+ | @Override | ||
+ | public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response ) | ||
+ | throws Exception | ||
+ | { | ||
+ | byte[] agentRemoteId = request.getSubOption( (byte)2 ).value; | ||
+ | // DLink | ||
+ | if( agentRemoteId.length == 8 ) | ||
+ | { | ||
+ | request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 6 ) ); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 5, 6 ) ); | ||
+ | } | ||
+ | } | ||
+ | }</source> | ||
+ | |||
+ | Конфигурация извлечения порта/VLAN из curcuitId должна быть указана в агентских типах устройствах. Таким образом InetAccess найдет relay agent по giaddr, предобработка извлечет и проставит agentRemoteId, по agentRemoteId InetAccess найдет дочернее агентское устройство и уже по его конфигурации извлечет значения порта/VLAN. | ||
+ | |||
+ | == Cisco ISG и SmartEdge == | ||
+ | |||
+ | Если используется Cisco ISG или SmartEdge, то нужно указать параметры извлечения remoteId и circuitId из RADIUS-пакета. | ||
# Если в значении атрибута отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка. | # Если в значении атрибута отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка. |
Версия 09:15, 30 апреля 2014
Содержание |
Извлечение значений, идентифицирующих абонента из DHCP-пакета
Для корректной работы нужно правильно извлекать значения agentRemoteId, circuitId (port/VLAN) из DHCP-пакета. А в случае использования IPoE c Cisco ISG или SmartEdge еще и из RADIUS-пакетов (в этом случае субопции опции 82 находятся внутри пакетов).
# Нужно указать код субопции опции 82 для извлечения значений # agentRemoteId обычно находится в субопции 2 dhcp.option82.agentRemoteId.code=2 # interfaceId обычно находится в субопции 1 (circuitId) dhcp.option82.interfaceId.code=1 # vlanId обычно находится в субопции 1 (circuitId) dhcp.option82.vlanId.code=1
# Если в субопции отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка. # Данный параметр используется в том числе, для того, чтобы извлеченные значения circuitId из DHCP-пакета и из RADIUS-пакета были идентичны. # Соответственно, значение position нужно указывать относительно removeHeader. dhcp.option82.removeHeader=0
# Нужно указать параметры извлечения agentRemoteId из субопции (dhcp.option82.agentRemoteId.code) # позиция значения внутри субопции dhcp.option82.agentRemoteId.position=2 # если длина значения может изменятся и нужно брать значение до конца субопции, то укажите -1 dhcp.option82.agentRemoteId.length=6 # 0, если remoteId в бинарном виде, например, MAC-адрес; 1, если там закодирована строка dhcp.option82.agentRemoteId.type=0
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.interfaceId.code) dhcp.option82.interfaceId.position=5 dhcp.option82.interfaceId.length=1
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.vlanId.code) dhcp.option82.vlanId.position=2 dhcp.option82.vlanId.length=2
Разные типы устройств
Если используются разные типы устройств, у которых разные форматы circuitId, тип поиска DHCP-устройства должен быть 0 (в этом режиме сначала находится устройство по giaddr, у него вызывается preprocess, затем находится агентское ус-во, у него тоже вызывается preprocess) или 1 (в этом режиме сначала находится устройство по giaddr, затем находится агентское ус-во, у него тоже вызывается preprocess).
dhcp.deviceSearchMode=0
Конфигурация парсинга agentRemoteId должна быть указана в устройстве, с которого приходит запрос на InetAccess (т.е. чей giaddr указан в пакете). А конфигурация извлечения порта/VLAN из curcuitId должна быть указана в агентских типах устройствах. Таким образом InetAccess найдет relay agent по giaddr, по его конфигурации извлечет agentRemoteId, по agentRemoteId найдет дочернее агентское устройство и уже по его конфигурации извлечет значения порта/VLAN.
Разные типы устройств c разным форматом agentRemoteId
В этом случае нельзя однозначно указать в конфигурации как извлечь agentRemoteId, в отличие от варианта выше. Поэтому нужно воспользоваться предобработкой пакетов. Укажите тип поиска DHCP-устройства = 0 (в этом режиме сначала находится устройство по giaddr, у него вызывается preprocess, затем находится агентское ус-во, у него тоже вызывается preprocess).
dhcp.deviceSearchMode=0
Расширьте обработчик процессора протокола типа устройства, с с которого приходит запрос на InetAccess (т.е. чей giaddr указан в пакете). По giaddr InetAccess однозначно найдет устройство. Затем вызовет у него предобработку, в которой нужно определить как распарсить и в ручную проставить agentRemoteId.
public class Dhcp82ProtocolHandler extends ProtocolHandlerAdapter implements DhcpProtocolHandler { @Override public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response ) throws Exception { byte[] agentRemoteId = request.getSubOption( (byte)2 ).value; // DLink if( agentRemoteId.length == 8 ) { request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 6 ) ); } else { request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 5, 6 ) ); } } }
Конфигурация извлечения порта/VLAN из curcuitId должна быть указана в агентских типах устройствах. Таким образом InetAccess найдет relay agent по giaddr, предобработка извлечет и проставит agentRemoteId, по agentRemoteId InetAccess найдет дочернее агентское устройство и уже по его конфигурации извлечет значения порта/VLAN.
Cisco ISG и SmartEdge
Если используется Cisco ISG или SmartEdge, то нужно указать параметры извлечения remoteId и circuitId из RADIUS-пакета.
# Если в значении атрибута отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка. # Данный параметр используется в том числе, для того, чтобы извлеченные значения circuitId из DHCP-пакета и из RADIUS-пакета были идентичны. # Соответственно, значение position нужно указывать относительно removeHeader. radius.agent.option.removeHeader=2
# SmartEdge # код атрибута radius.agent.option.remoteId.type=96 # позиция в значении атрибута radius.agent.option.remoteId.position=0 # длина radius.agent.option.remoteId.length=-1 radius.agent.option.circuitId.type=97 # или radius.agent.option.remoteId.type=202 radius.agent.option.remoteId.position=0 radius.agent.option.remoteId.length=-1 radius.agent.option.circuitId.type=202
# Cisco ISG radius.agent.option.remoteId.type=1 radius.agent.option.remoteId.prefix=remote-id-tag= radius.agent.option.circuitId.type=1 radius.agent.option.circuitId.prefix=circuit-id-tag=