Опция 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:

Изображение:Wireshark_opt_82.jpeg

DHCP-серверы, поддерживающие опцию 82:

Несмотря на то, что это нигде не указано явно, вероятнее всего, 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-сервера

Изображение:Dhcp_82.jpeg

Сразу же после инсталляции пакета, сервер может не заработать — сначала необходимо отредактировать его конфигурационный файл /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-ретранслятором

  1. Включить DHCP-ретранслятор на коммутаторе (по умолчанию включен)
  2. Включить ip routing
  3. Настроить режим вставки опции 82 (drop, replace, validate)
  4. Настроить ip helper-address
  5. Клиенты и сервер должны быть в разных подсетях

Включение 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-ретранслятором

Подробнее: FAQ по настройке dhcp relay на коммутаторах DLink серии DES-35xx
# 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:

[править] Материалы по DHCP на Xgu.ru

На других сайтах