Опция 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-ретранслятора (решение задачи для случая, когда это не так, описано на странице DHCP snooping).
[править] Протокол 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
На коммутаторах D-Link DES-35xx и 3028 выглядит так.
DES-3526:admin#show dhcp_relay Command: show dhcp_relay DHCP/BOOTP Relay Status : Enabled DHCP/BOOTP Hops Count Limit : 16 DHCP/BOOTP Relay Time Threshold : 0 DHCP Relay Agent Information Option 82 State : Enabled DHCP Relay Agent Information Option 82 Check : Disabled DHCP Relay Agent Information Option 82 Policy : Keep DHCP Relay Agent Information Option 82 Remote ID : 00-15-E9-3D-A1-20
[править] Примеры правил
Указываем, что нас интересует последний байт в 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
[править] Настройка коммутатора Huawei для работы DHCP-ретранслятором
# ip route-static 0.0.0.0 0.0.0.0 192.168.1.254 # dhcp enable # dhcp server group dhcp-test # dhcp-server 172.16.1.1 0 # dhcp-server 172.16.1.2 1 # interface Vlanif1 # ip address 192.168.1.1 255.255.255.0 # dhcp select relay # dhcp relay server-select dhcp-test
[править] Настройка коммутатора Zyxel для работы DHCP-ретранслятором
[править] Дополнительная информация
Опция 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
- Настройка опции 82 на ES3528M и Dhcpd (рус.) - описание настройки опции 82 на коммутаторах Edge-Core ES3528M
- http://ciscovod.blogspot.com/2009/02/cisco-isg.html
[править] Материалы по DHCP на Xgu.ru
- DHCP
- Опция 82 DHCP
- DHCP snooping
- Win2k3 DHCP
ProCurve | ||
---|---|---|
Основы | 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 | Доступ к коммутатору ProCurve | DHCP snooping | Dynamic ARP Protection | IP Source Guard | Port security | Аутентификация при доступе к сети | 802.1X в ProCurve | Web-аутентификация в ProCurve | MAC-аутентификация в ProCurve | |
Канальный уровень | CDP | LLDP | VLAN в ProCurve | GVRP | STP в ProCurve | ProCurve Mesh | Агрегирование каналов | Зеркалирование трафика | QinQ | |
Сетевой уровень | RIP в ProCurve | OSPF в ProCurve | VRRP в ProCurve | XRRP в ProCurve | QoS в ProCurve | Multicast в ProCurve | PIM в ProCurve | |
Разное | Опция 82 DHCP | SNMP в ProCurve |