Опция 82 DHCP
Материал из Xgu.ru
Автор: Наташа Самойленко
Опция 82 DHCP (DHCP option 82) — опция протокола DHCP, использующаяся для того чтобы проинформировать DHCP-сервер о том, от какого DHCP-ретранслятора и через какой его порт был получен запрос. Применяется при решении задачи привязки IP-адреса к порту коммутатора и для защиты от атак с использованием протокола DHCP (DHCP snooping).
[править] Задача
Протокол динамического конфигурирования DHCP очень удобен — настройка стека TCP/IP клиентских машин не требует никакого внимания со стороны администратора, всё происходит само собой. С другой стороны, в общем случае адреса назначаются случайным образом, и заранее неизвестно какой хост получит какой адрес. Если нужно сохранить удобство использования DHCP, но при этом сделать так, чтобы адреса были чётко закреплены за каждым компьютером, используется так называемая привязка к MAC-адресу: DHCP-сервер имеет таблицу соответствия MAC-адресов IP-адресам, и назначает IP-адреса в соответствии с этой таблицей. Минус этого решения — необходимость отслеживания MAC-адресов и сопровождения таблицы соответствия.
В некоторых случаях может помочь компромиссное решение — поставить IP-адреса в соответствие не MAC-адресам, а портам коммутатора, к которым подключен клиентский компьютер. Другой вариант — выдавать IP-адреса в зависимости от того, с какого DHCP-ретранслятора пришел запрос. В этом случае выдаются адреса из одной подсети, но с привязкой конкретных диапазонов адресов к различным коммутаторам, работающим как DHCP-ретрансляторы. Это может помочь облегчить администрирование сети в том смысле, что по IP-адресу клиентского компьютера, будет понятно к какому коммутатору он подключен.
Решить эти задачи позволяет опция 82 протокола DHCP.
Ниже описывается, каким образом настроить DHCP-сервер, чтобы он выдавал IP-адрес в зависимости от того, к какому порту коммутатора подключен клиент, сделавший запрос. Рассматривается случай, когда коммутатор, через который поступает запрос, используется в роли DHCP-ретранслятора (решение задачи для случая, когда это не так, описано на странице dhcpsnooper).
[править] Протокол DHCP
DHCP (Dynamic Host Configuration Protocol) — один из важнейших протоколов в стеке протоколов TCP/IP, предназначенный для назначения хостам различных параметров необходимых для работы в сети, в частности, их IP-адресов, адреса шлюза по умолчанию, IP-адресов DNS-серверов и множества других.
Во взаимодействии по протоколу DHCP принимают участие две или три стороны:
- DHCP-клиент — тот, кто хочет получить параметры настройки TCP/IP;
- DHCP-сервер — тот, кто выдаёт эти параметры;
- DHCP-ретранслятор (relay agent) — вспомогательный участник, который может играть роль посредника между клиентом и сервером. Он используется в тех случаях, когда у клиента нет возможности обратиться к серверу напрямую, в частности, в том случае, если они находятся в разных широковещательных доменах. DHCP-ретранслятор обрабатывает стандартный широковещательный DHCP-запрос и перенаправляет его на DHCP-сервер в виде целенаправленного (unicast) пакета, а полученный от DHCP-сервера ответ, в свою очередь, перенаправляет DHCP-клиенту.
Как правило, DHCP-сервер выделяет IP-адреса (и прочие параметры TCP/IP) одним из двух способов:
- Случайным образом из предопределённого пула (в том случае, если клиенту ранее уже выдавался какой-то адрес, он может попробовать получить его вновь);
- Жёстко зафиксированным образом, исходя из MAC-адреса клиента.
[править] Option 82
Опция 82 состоит из двух подопций:
Agent Circuit ID — содержит информацию о том, с какого порта пришел запрос на DHCP-ретранслятор.
Agent Remote ID — идентификатор самого DHCP-ретранслятора (например, MAC-адрес коммутатора).
Опция 82 в запросе DHCP:
DHCP-серверы, поддерживающие опцию 82:
- ISC DHCP Server;
- Cisco Network Registrar (CNR);
- Infoblox;
- Lucent QIP;
- Weird Solutions.
Несмотря на то, что это нигде не указано явно, вероятнее всего, Microsoft Windows 2003 Server опцию 82 не поддерживает.
[править] Инсталляция и настройка DHCP сервера ISC-DHCP
Будем использовать dhcp-сервер ISC-DHCP (v3). ISC DHCP Server — наиболее распространнённый DHCP-сервер, из использующихся в UNIX/Linux-системах. Для нас сейчас важно и то, что это один из серверов, умеющих распознавать опцию 82.
Будем предполагать, что инсталляция и настройка сервера выполняется в Debian GNU/Linux. Пользователи других систем должны учесть, что процедура инсталляции и местоположение конфигурационных файлов могут несколько отличаться.
[править] Установка DHCP-сервера с поддержкой опции 82
В обычном случае установить откомпилированный DHCP-сервер из репозитория пакетов можно было бы с помощью команды:
%# apt-get install dhcp3-server
и можно было бы считать, что на этом инсталляция сервера закончена, и можно переходить к его настройке. Однако, в том случае, если предполагается использование DHCP-ретранслятора (что обязательно, если будет использоваться опция 82), может потребоваться сборка пакета с включённой директивой USE_SOCKETS. Подробнее эта процедура описана ниже.
[править] Сборка с включённой директивой USE_SOCKETS
По умолчанию DHCP-сервер ожидает услышать запросы клиентов на широковещательном адрес 255.255.255.255. Однако, когда запрос перенаправляет DHCP-ретранслятор, запрос приходит непосредственно на адрес DHCP-сервера. Для того чтобы DHCP-сервер корректно обрабатывал информацию от DHCP-ретранслятора, его необходимо скомпилировать с использованием директивы
#define USE_SOCKETS
и указать в конфигурационном файле local-address.
Скачиваем исходники DHCP-сервера:
%# apt-get source dhcp3-server
Перед началом сборки исходников необходимо установить все пакеты, необходимые для успешной сборки пакета, для чего выполнить:
%# apt-get build-dep dhcp3-server
Теперь необходимо в файле site.h раскомментировать директиву #define USE_SOCKETS:
%# vi dhcp3-3.0.6.dfsg/includes/site.h
Перейти в каталог dhcp3-3.0.6.dfsg:
%# cd dhcp3-3.0.6.dfsg/
Для того чтобы собрать пакет необходимо выполнить:
%$ dpkg-buildpackage -rfakeroot -b
или, если сборка производится root'ом:
%# dpkg-buildpackage -b
После сборки пакеты должны быть установлены в системе (инсталлируем только common и server, так как нам не нужен DHCP-ретранслятор и DHCP-клиент):
%# dpkg -i dhcp3-common_3.0.6.dfsg-1_i386.deb dhcp3-server_3.0.6.dfsg-1_i386.deb
[править] Настройка DHCP-сервера
Сразу же после инсталляции пакета, сервер может не заработать — сначала необходимо отредактировать его конфигурационный файл /etc/dhcp3/dhcpd.conf.
# Укажите адрес, на который DHCP-сервер ожидает получать запросы (адрес DHCP-сервера)
local-address 192.168.2.9;
# Укажите подсеть интерфейса, на котором запущен DHCP-сервер
subnet 192.168.2.0 netmask 255.255.255.0 {
}
# Если сервер получит запрос, содержащий опцию 82, он сгенерирует сообщение в системный журнал
#
if exists agent.circuit-id
{
log ( info, concat( " Lease for ",
binary-to-ascii (10, 8, ".", leased-address),
" Switch port: ",
binary-to-ascii (10, 8, ".", option agent.circuit-id),
" Switch MAC: ",
binary-to-ascii(16, 8, ".", option agent.remote-id)));
}
# Запросы, пришедшие с 5го порта коммутатора:
class "port-5"
{
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "5";
}
# Адрес для 5го порта:
pool {
range 192.168.1.55;
allow members of "port-5";
}
Интерфейс, на котором будет работать DHCP-сервер, передается ему в качестве аргумента при вызове.
В Debian GNU/Linux аргументы и ключи вызова программ принято указывать в соответствующих файлах в каталоге /etc/default, в частности, конфигурационный файл, в котором находятся опции для нашего сервера, называется /etc/default/dhcp3-server.
При условии, что сервер будет слушать запросы на интерфейсе eth0, файл будет выглядеть так:
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth0"
Можно указать несколько интерфейсов, запросы с которых будет обрабатывать сервер. Они должны быть разделены пробелом.
Теперь можно запускать сервер:
%# /etc/init.d/dhcp3-server start
После сборки сервера с #define USE_SOCKETS:
udp 0 0 192.168.2.9:67 0.0.0.0:* 863/dhcpd3 udp 0 0 192.168.2.9:67 0.0.0.0:* 863/dhcpd3
[править] Написание правил для соответствия адреса порту коммутатора
[править] Используемые операторы
suffix (data-expr, length)
Оператор suffix анализирует выражение data-expr и возвращает последние байты в указанном количестве. length — это числовое значение. Если data-expr или length равны нулю, то результат также будет равен 0. Если длина указанная в length больше чем сами данные, то suffix возвращает все данные.
substring (data-expr, offset, length)
Оператор substring анализирует данные и возвращает строку данных, которая начинается от указанного значения offset и имеет длину, равную указанной в length. Offset и length — числовые выражения. Если data-expr, offset или length равны нулю, то результат также равен 0. Если значение offset больше или равно длине data-expr, то будет возвращена нулевая строка. Если длина length больше чем длина данных оставшихся после offset, тогда возвращаемая строка будет содержать все данные от значения offset до конца.
binary-to-ascii (numeric-expr1, numeric-expr2, data-expr1, data-expr2)
Преобразует результат вычисления data-expr2 в текстовую строку, содержащую по одному числу для каждого элемента результата вычисления data-expr2. Числа разделены между собой результатом вычисления data-expr1. Параметр numeric-expr1 указывает основание системы исчисления (от 2 до 16), в которую должны преобразовываться числа. Параметр numeric-expr2 указывает количество битов на каждое число, полученное в результате преобразования. Оно может быть равно 8, 16 или 32.
Пример:
concat (binary-to-ascii (10, 8, ".",
reverse (1, leased-address)),
".in-addr.arpa.");
Берём адрес leased-address, инвертируем его, а потом делим на 8 битные числа, каждые из которых преобразуем в 10-чную систему счисления. Полученные числа объединяем между собой через "." и присоединяем ".in-addr.arpa." справа.
Дополнительная информация:
- man dhcp-eval — описано как создавать такие выражения и описаны другие операторы.
[править] Просмотр информации на коммутаторе
Надо знать, каким образом кодируется номер порта коммутатора, чтобы затем правильно распознавать номера в пришедших запросах.
Например, в коммутаторе ProCurve опция 82 выглядит следующим образом:
Value: 010200030206001560792800 Agent Circuit ID: 0003 Agent Remote ID: 001560792800
В коммутаторах других производителей она выглядит аналогично.
Для того чтобы увидеть, каким образом кодируются номера портов в коммутаторе Procurve, необходимо выполнить команду:
sw(config)# walkMIB ifname ifName.1 = 1 ifName.2 = 2 ifName.3 = 3 ifName.4 = 4 ifName.5 = 5 ifName.6 = 6 ifName.7 = 7 ifName.8 = 8 ifName.9 = 9 ifName.10 = 10 ifName.11 = 11 .............. ifName.47 = 47 ifName.48 = 48 ifName.102 = DEFAULT_VLAN ifName.103 = VLAN2 ifName.4197 = lo0
Информация о MAC-адресе коммутатора:
sw# sh system-information
Status and Counters - General System Information
System Name : sw
System Contact :
System Location :
MAC Age Time (sec) : 300
Time Zone : 0
Daylight Time Rule : None
Firmware revision : M.10.06 Base MAC Addr : 001560-792800
ROM Version : I.08.11 Serial Number : SG602SG00C
Up Time : 2 days Memory - Total : 94,690,424
CPU Util (%) : 6 Free : 80,214,320
IP Mgmt - Pkts Rx : 10,267 Packet - Total : 1998
Pkts Tx : 7874 Buffers Free : 1483
Lowest : 1473
Missed : 0
[править] Примеры правил
Указываем, что нас интересует последний байт в circuit-id:
suffix( option agent.circuit-id, 1)
Делаем преобразование вырезанного байта из двоичного формата в десятичный и указываем, что запрос попадет под правило класса, если результат преобразования будет равен 5.
Правило для порта 5.
class "port-5"
{
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "5";
}
pool {
range 192.168.1.155;
allow members of "port-5";
}
Аналогично для порта 45:
class "port-45"
{
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "45";
}
pool {
range 192.168.1.45;
allow members of "port-45";
}
Эти правила могут отличаться при использовании как коммутаторов других производителей, так и при использовании модульных коммутаторов ProCurve. Необходимо выяснять каким образом кодируется номер порта.
Если нам необходимо учитывать от какого relay-агента пришел запрос, то можно создать соответствующее правило:
class "relay-1"
{
match if binary-to-ascii (16, 8, ":", suffix ( option agent.remote-id, 6)) = "0:15:60:79:28:0";
# внимание: преобразование число-текст отрезает не значащие нули слева
}
|
Если нужно привязать IP-адреса не к портам коммутатора, а к самим коммутаторам как таковым, учитывать порт, с которого пришел DHCP-запрос (Agent Circuit ID), не обязательно, а важно настроить совпадение MAC-адреса или IP-адреса DHCP-ретранслятора (Agent Remote ID) в пришедшей опции 82. |
[править] Пример конфигурационного файла DHCP-сервера
ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
local-address 192.168.2.9;
if exists agent.circuit-id
{
log ( info, concat( "Lease for ", binary-to-ascii (10, 8, ".", leased-address),
" raw option-82 info is CID: ", binary-to-ascii (10, 8, ".", option agent.circuit-id), " AID: ",
binary-to-ascii(16, 8, ".", option agent.remote-id)));
}
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.20 192.168.2.40;
allow unknown-clients;
}
subnet 192.168.1.0 netmask 255.255.255.0 {
class "port-5" {
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "5";
}
class "port-3" {
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "3";
}
class "port-45" {
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "45";
}
pool {
range 192.168.1.155;
allow members of "port-5";
}
pool {
range 192.168.1.133;
allow members of "port-3";
}
pool {
range 192.168.1.45;
allow members of "port-45";
}
}
[править] Настройка коммутатора HP ProCurve для работы DHCP-ретранслятором
- Включить DHCP-ретранслятор на коммутаторе (по умолчанию включен)
- Включить ip routing
- Настроить режим вставки опции 82 (drop, replace, validate)
- Настроить ip helper-address
- Клиенты и сервер должны быть в разных подсетях
Включение DHCP-ретранслятора на коммутаторе (по умолчанию включен):
sw(config)# dhcp-relay
Включить ip routing (на коммутаторе включается функциональность 3го уровня):
sw(config)# ip routing
Настроить режим вставки опции 82 (drop, replace, validate):
sw(config)# dhcp-relay option 82 <append [validate] | replace [validate] | drop [validate] | keep> [ip | mac]
Параметры команды dhcp-relay option 82:
- append — коммутатор добавит опцию 82 в пришедший DHCP-пакет.
- replace — коммутатор заменит опцию 82 в пришедшем DHCP-пакете на свои значения.
- drop — коммутатор отбросит DHCP-пакет, если в нем будет опция 82. Если DHCP-пакет пришел без опции 82, то коммутатор добавит опцию и передаст пакет.
- keep — для любого полученного DHCP-пакета с существующей опцией 82 не выполнять никаких изменений и отправить пакет в таком же виде как он пришел.
- [ip | mac] — что используется в опции 82 в качестве Agent Remote ID. По умолчанию используется MAC-адрес. При использовании IP-адреса, в поле Agent Remote ID будет указан IP-адрес VLAN, в котором был получен запрос от DHCP-клиента.
|
При одновременной работе DHCP-ретранслятора и DHCP snooping на коммутаторе, необходимо обратить внимание на то, что настройки DHCP snooping, по обработке пакетов с опцией 82, перекрывают настройки DHCP-ретранслятора. |
Настройка ip helper-address (ip helper-address задается в VLAN, в котором находится DHCP-клиент. IP-адрес в этой команде — это адрес DHCP-сервера):
sw(config)# vlan 1 sw(vlan-1)# ip helper-address 192.168.2.9
[править] Просмотр настроек на коммутаторе
Посмотреть настроенные ip helper-address для VLAN 1:
sw# show ip helper-address 1
Настройки DHCP-ретранслятора:
sw# show dhcp-relay DHCP Relay Agent : Enabled Option 82 : Enabled Response validation : Disabled Option 82 handle policy : drop Remote ID : mac Client Requests Server Responses Valid Dropped Valid Dropped ---------- ---------- ---------- ---------- 45 0 35 0
[править] Пример конфигурации коммутатора Procurve
hostname "sw" ip routing vlan 1 name "DEFAULT_VLAN" untagged 1-19,41-48 ip address 192.168.1.1 255.255.255.0 ip helper-address 192.168.2.9 no untagged 20-40 exit vlan 2 name "VLAN2" untagged 20-40 ip address 192.168.2.1 255.255.255.0 exit dhcp-relay option 82 drop password manager password operator
[править] Настройка коммутатора D-LINK для работы DHCP-ретранслятором
# create iproute default 192.168.1.1 # config dhcp_relay add ipif System 192.168.2.9 # config dhcp_relay option_82 state enable # enable dhcp_relay
[править] Дополнительная информация
Опция 82:
- man dhcp-eval
- http://linux.derkeiler.com/Newsgroups/comp.os.linux.networking/2005-01/1452.html
- http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122newft/122t/122t2/ftrbeo82.htm
- http://slaptijack.com/networking/what-is-dhcp-option-82/
- D-LINK DHCP Relay option 82 (рус.) — подробное описание процедуры настройки использования опции 82 для коммутаторов D-LINK
- http://ciscovod.blogspot.com/2009/02/cisco-isg.html
[править] Материалы по DHCP на Xgu.ru
- DHCP
- Опция 82 DHCP
- DHCP snooping
|
Основы |
ProCurve Adaptive Edge | ProCurve ProActive Defense | ProCurve Network Access Control | ProCurve Wireless |
|
Программы |
ProCurve Manager | ProCurve Identity Driven Manager | ProCurve Network Immunity Manager | ProCurve Mobility Manager |
|
Устройства |
ProCurve Switch | ProCurve Router | ProCurve ONE Module | ProCurve TMS Module | ProCurve NAC 800 | ProCurve Access Point | ProCurve WESM |
|
|
|
|
Безопасность |
ProCurve Security | DHCP snooping | Dynamic ARP Protection | IP Source Guard | Port security | Аутентификация при доступе к сети | Доступ к коммутатору ProCurve |
|
Канальный уровень |
CDP | LLDP | VLAN в ProCurve | GVRP | STP в ProCurve | ProCurve Mesh | Агрегирование каналов | Зеркалирование трафика |
|
Сетевой уровень |
RIP в ProCurve | OSPF в ProCurve | VRRP в ProCurve | XRRP в ProCurve | QoS в ProCurve | Multicast в ProCurve |
|
Разное |
Опция 82 DHCP | SNMP в ProCurve |


