четверг, 20 июня 2013 г.

DHCP Relay: Теория и практика настройки DHCP-Relay

   В рабочей практике столкнулся с необходимостью настройки такой вещи, как DHCP-Relay. Имея небольшой практический опыт, а так же теоретическую базу, которую получил во время подготовки к CCNA и его последующем преподавании, решил, что все просто. Собственно, настроил, как помнил и... ничего не заработало. Поэтому придется разобрать данную технологию чуть подробнее, и рассмотреть различные схемы, в которых используется DHCP-Relay.

Теоретическая база

DHCP

   Протокол DHCP (Dynamic Host Configuration Protocol) предназначен для автоматической раздачи хостам сетевых настроек. Протокол позволяет выдать пользователям необходимый IP-адрес, маску подсети, адрес основного шлюза, адрес DNS-сервера и иные настройки, необходимые пользователям. Подробно работа протокола DHCP описана в RFC 2131. Тем не менее, постараюсь дать краткое описание работы DHCP.
   Существует три механизма назначения адресов и настроек пользовательским устройствам:
- Ручное присвоение (Manual Allocation): администратор вручную предназначает адреса пользовательским устройствам на сервере, а DHCP нужен лишь для доставки этих настроек непосредственно пользователям.
- Автоматическое назначение (Automatic Allocation): DHCP автоматически выбирает адреса из набора (пула) адресов и выдает их пользователям, но при этом присваивает их перманентно, навсегда закрепляя адрес за пользователем.
- Динамическое назначение (Dynamic Allocation): DHCP автоматически присваивает адреса устройствам из некоторого пула адресов, но адрес выдается на некоторое время (время аренды/leasing time). Если хост отключился от сети, его адрес может быть выдан кому-нибудь другому при условии, что время аренды на сервере так же истекло.


   Работа устройства с DHCP-сервером выполняется в четыре шага:
  1. Хост подключается к сети. У него нет никаких сетевых настроек, поэтому он должен запросить их каким-либо образом. Но перед этим необходимо обнаружить DHCP сервер. Поэтому первое, что делает хост - отправляет сообщение типа DHCPDISCOVER. Данное сообщение является широковещательным (broadcast message). Сообщение использует L2/L3 широковещательные адреса в соответствующих полях заголовков.
  2. После того, как сервер DHCP получает сообщение DHCDISCOVER, он выбирает из своей базы данных свободный адрес, и далее, создав запись в своей ARP-таблице (соответствие присланного MAC-адреса и выданного IP-адреса), отправляет хосту предложение с настройками в виде сообщения типа DHCPOFFER, которое отсылается как unicast-сообщение на L2, с использованием адреса сервера на втором уровне и MAC-адреса отправителя.
  3. После того, как клиент получает DHCPOFFER от сервера, он отсылает назад сообщение типа DHCPREQUEST, с помощью которого он просит теперь уже создать аренду (закрепить её на сервере не просто в виде ARP-записи) и подтвердить правильность полученных настроек и аренды.
  4. Получив DHCPREQUEST, сервер проверяет арендованный адрес и остальную информацию, которая была выслана ранее. Сервер отсылает unicast-сообщение типа DHCPACK, дублирующее DHCPOFFER. Клиент после получения DHCPACK проверяет, нет ли подобного адреса еще у кого-либо: проводится ARP  опрос на выданный адрес. Если ответа не пришло, значит адрес в пределах широковещательного домена уникален.
   Время аренды адреса - один из настраеваемых параметров. В зависимости от специфики работы сети и от её размеров время аренды может меняться.
   DHCP использует UDP в качестве протокола транспортного уровня. При этом используется два порта: 67 - порт "DHCP Server" - для отправки сообщений от клиента серверу, и порт 68 - "DHCP Client" - для отправки сообщений от сервера клиенту.


   DHCP сообщение выглядит следующим образом:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     op (1)    |   htype (1)   |   hlen (1)    |   hops (1)    |
   +---------------+---------------+---------------+---------------+
   |                            xid (4)                            |
   +-------------------------------+-------------------------------+
   |           secs (2)            |           flags (2)           |
   +-------------------------------+-------------------------------+
   |                          ciaddr  (4)                          |
   +---------------------------------------------------------------+
   |                          yiaddr  (4)                          |
   +---------------------------------------------------------------+
   |                          siaddr  (4)                          |
   +---------------------------------------------------------------+
   |                          giaddr  (4)                          |
   +---------------------------------------------------------------+
   |                                                               |
   |                          chaddr  (16)                         |
   |                                                               |
   |                                                               |
   +---------------------------------------------------------------+
   |                                                               |
   |                          sname   (64)                         |
   +---------------------------------------------------------------+
   |                                                               |
   |                          file    (128)                        |
   +---------------------------------------------------------------+
   |                                                               |
   |                          options (variable)                   |
   +---------------------------------------------------------------+

   Значение полей: 

Operation Code (OP) - Определение типа сообщения: 1 - запрос, 2 - ответ;
Hardware Type (htype) - Идентификация типа технологии подключения, например:1 - Ethernet, 15 - Frame Relay, 20 - serial line;
Hardware Address length (hlen) - 8-битовое поле, значение которого указывает на длину адреса L2;
Hops - используется при работе DHCP-Relay;
Transaction Identifier (xid) - 32-битный идентификатор, который генерируется клиентом для того, чтобы сопоставить запрос с ответом от сервера;
Seconds (secs) -Заполняется клиентом и указывает на количество времени с начала процесса получения/обновления настроек;
Flags - Используется только один бит этого поля, остальные должны быть равны нулю. Клиент, не имеющий адреса устанавливает флаг Broadcast (ставит 1 в соответствующее поле). Данный флаг оповещает DHCP-сервер или агента о том, что ответ на данный запрос должен быть направлен в виде широковещательного сообщения.
                                    1 1 1 1 1 1
                0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                |B|             MBZ             |
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                B:  BROADCAST flag

                MBZ:  MUST BE ZERO (reserved for future use)

Client IP Address (ciaddr) - Клиент ставит в данное поле свой адрес в случае, если он правильный, а клиент находится в состоянии BOUND/RENEW/REBINDING, и может отвечать на ARP запросы;
Your IP Address (yiaddr) - Адрес, присваеваемый клиенту сервером;
Server IP Address (siaddr) - Адрес сервера, который будет использоваться клиентом во время процесса получения настроек. Адрес ставится в данное поле в сообщениях типа DHCPOFFER и DHCPACK;
Gateway IP Address (giaddr) - Адрес, используемый в случае работы с DHCP-relay.
Client Hardware Address (chaddr) - Физический адрес клиента;
Server Name (sname) - сервер в сообщениях типа DHCPOFFER и DHCPACK может поставить свое сетевое имя в данное поле
Boot Filename (file) - может опционально использоваться клиентом для запроса специфического типа загрузочного файла в сообщениях DHCPDISCOVER. Сервер в ответ (DHCPOFFER) указывает в данном поле прямую ссылку/специфическую директорию, где находится данный загрузочный файл;
Options -  Поле, позволяющее дополнять необходимыми настройками протокол DHCP. Его могут использовать разработчики в случае необходимости.

Как работает DHCP на практике можно увидеть из предложенных ниже изображений. Первое, что делает клиент - отсылает DHCPDISCOVER со своего физического интерфейса.
 
Далее сервер отвечает DHCPOFFER-сообщением, высылая настройки хосту. Видно, что адрес 10.10.10.73 - адрес, который выдается нам. Стоит так же обратить внимание на порты, с которых и на которые отсылаются данные сообщения:

 Далее следует сообщение типа DHCPREQUEST от клиента, где в опциональных полях клиент указывает настройки, полученные от сервера, и просит подтвердить их правильность :
На что сервер отвечает DHCPACK:

DHCP-Relay

   Рассмотрим следующую типичную схему устройства сети
   В чем принципиальное отличие данной схемы от той, которая представлена в начале статьи, и почему в подобной схеме могут возникнуть проблемы?
   Все очень просто: в данной схеме присутствует маршрутизатор, который, как известно, разбивает на части широковещательный домен и не передает широковещательные сообщения из одной сети в другую. Следовательно, РС0 и DHCP SERVER находятся в разных широковещательных доменах, а значит, без дополнительных настроек недостижимы. Broadcast от PC0 будет сброшен маршрутизатором, и РС0 не получит требуемого адреса из своей сети.
   Тем не менее выход из данной ситуации есть: настройка DHCP-Relay. Мы можем заставить промежуточное устройство передавать широковещательные DHCP-запросы между клиентами и серверами, которые находятся в разных широковещательных доменах.
   В случае настройки Relay-агента, в поле  giaddr появится адрес того устройства, которое будет пересылать DHCP-запросы. В случае предлагаемой схемы, в поле будет стоять адрес интерфейса маршрутизатора GW, направленного в сторону сегмента, в котором расположен РС0. Ответы от DHCP-сервера будут направлены relay-агенту, а он уже будет отправлять их конечному хосту, запрашивающему сетевые настройки.

Практическая часть

    С теорией все понятно. Теперь применим полученные знания к задачам, возникающим на практике. Попробуем начать с простых задач, и дойдем до (на мой взгляд) более-менее сложных.

Вариант № 1

УСЛОВИЕ: Имеем коммутатор L3 (Cisco 3750-X). Запустим на нем DHCP-Server и будем раздавать настройки всем устройствам, подключенным к нашему коммутатору.

    Откровенно говоря, DHCP-сервер лучше всего создавать на маршрутизаторе. Но в данном случае все равно попробуем сделать это на коммутаторе L3, раз он умеет выполнять такую роль. Синтаксис может отличаться в зависимости от версии IOS.
    Предлагаемая схема проста и представлена на рисунке ниже.
    На схеме присутствует еще один коммутатор L2, но это не принципиально, т.к. на обработку сообщений DHCP они никак не влияет. В сети будем использовать адресное пространство 10.10.10.0/24, адрес основного шлюза 10.10.10.254, адрес коммутатора L3 - 10.10.10.253
   Конфигурация  коммутатора выглядит следующим образом:

   Создадим SVI для возможности подключения к коммутатору с помощью Telnet/SSH

L3_Core_SW(config)#interface vlan 1
L3_Core_SW(config-if)#ip address 10.10.10.253 255.255.255.0

L3_Core_SW(config-if)#no shutdown

   Использовать VLAN 1 не самое правильное решение, но для тестовой схемы будем использовать его. Далее приступим к созданию DHCP-пула. Во-первых, исключим адреса, которые мы выдали серверам, шлюзам, сетевым устройствам. Например исключим диапазон с 10.10.10.250 по 10.10.10.254:

L3_Core_SW(config)#ip dhcp excluded-address 10.10.10.250 10.10.10.254

   Создадим пул адресов с именем LocalNet и укажем, какие параметры необходимо выдавать хостам:

L3_Core_SW(config)#ip dhcp pool LocalNet
L3_Core_SW(dhcp-config)#network 10.10.10.0 255.255.255.0
L3_Core_SW(dhcp-config)#default-router 10.10.10.254
L3_Core_SW(dhcp-config)#dns-server 8.8.8.8
L3_Core_SW(dhcp-config)#domain-name LovelyWork


   Cisco DHCP-Server позволяет выдавать пользователям гораздо больше параметров, чем перечислено в данном отрывке конфигурации. Здесь определено только адресное пространство, маска подсети (длина префикса), адрес основного шлюза и DNS-сервера, имя домена. На этом настройка DHCP-Server'а на Cisco коммутаторе можно завершить и проверить работоспособность данного решения. Для этого запустим debug и посмотрим на приходящие от хоста сообщения.
L3_Core_SW#debug ip dhcp server packet
DHCP server packet debugging is on.

L3_Core_SW(dhcp-config)#
*Mar  2 00:12:58.908: DHCPD: Reload workspace interface Vlan1 tableid 0.
*Mar  2 00:12:58.908: DHCPD: tableid for 10.10.10.253 on Vlan1 is 0
*Mar  2 00:12:58.908: DHCPD: client's VPN is .
*Mar  2 00:12:58.908: DHCPD: using received relay info.
*Mar  2 00:12:58.908: DHCPD: DHCPDISCOVER received from client 0100.0d60.7886.dc on interface Vlan1.
*Mar  2 00:12:58.908: DHCPD: using received relay info.
*Mar  2 00:13:00.921: DHCPD: Sending DHCPOFFER to client 0100.0d60.7886.dc (10.10.10.1).
*Mar  2 00:13:00.921: DHCPD: no option 125
*Mar  2 00:13:00.921: DHCPD: Check for IPe on Vlan1
*Mar  2 00:13:00.921: DHCPD: creating ARP entry (10.10.10.1, 000d.6078.86dc).
*Mar  2 00:13:00.921: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (10.10.10.1).
*Mar  2 00:13:00.929: DHCPD: Reload workspace interface Vlan1 tableid 0.
*Mar  2 00:13:00.929: DHCPD: tableid for 10.10.10.253 on Vlan1 is 0
*Mar  2 00:13:00.929: DHCPD: client's VPN is .
*Mar  2 00:13:00.929: DHCPD: DHCPREQUEST received from client 0100.0d60.7886.dc.
*Mar  2 00:13:00.929: DHCPD: Sending DHCPACK to client 0100.0d60.7886.dc (10.10.10.1).
*Mar  2 00:13:00.929: DHCPD: no option 125
*Mar  2 00:13:00.929: DHCPD: Check for IPe on Vlan1
*Mar  2 00:13:00.929: DHCPD: creating ARP entry (10.10.10.1, 000d.6078.86dc).
*Mar  2 00:13:00.929: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (10.10.10.1).
 

Результат работы можно так же увидеть на хосте:


Вариант № 2

УСЛОВИЕ: Возьмем схему из предыдущего варианта и модифицируем её, добавив еще несколько SVI, VLAN, и создав для каждого из VLAN свой DHCP-пул.
   К имеющемуся VLAN добавим еще два:

VLAN 2 - Department_A
Network:172.16.1.0/28, IP GW: 172.16.1.14, SVI IP: 172.16.1.13
VLAN 3 - Department_B
Network:172.16.1.16/28, IP GW: 172.16.1.30, SVI IP: 172.16.1.29

   Конфигурация коммутатора будет схожа с предыдущем заданием. Пулы настраиваются точно так же:

L3_Core_SW(config)#vlan 2
L3_Core_SW(config-vlan)#name Department_A
L3_Core_SW(config-vlan)#vlan 3
L3_Core_SW(config-vlan)#name Department_B
L3_Core_SW(config-vlan)#exit
L3_Core_SW(config)#interface vlan 2
L3_Core_SW(config-if)#ip address 172.16.1.13 255.255.255.240
L3_Core_SW(config-if)#no shutdown
L3_Core_SW(config-if)#exit
L3_Core_SW(config)#ip dhcp excluded-address 172.16.1.13 172.16.1.14
L3_Core_SW(config)#ip dhcp pool Dep_A
L3_Core_SW(dhcp-config)#network 172.16.1.0 255.255.255.240
L3_Core_SW(dhcp-config)#default-router 172.16.1.14
L3_Core_SW(dhcp-config)#dns-server 8.8.8.8
L3_Core_SW(dhcp-config)#domain-name LovelyDepartment_A
L3_Core_SW(dhcp-config)#exit
L3_Core_SW(config)#interface vlan 3
L3_Core_SW(config-if)#ip address 172.16.1.29 255.255.255.240
L3_Core_SW(config-if)#no shutdown
L3_Core_SW(config-if)#exit
L3_Core_SW(config)#ip dhcp excluded-address 172.16.1.29 172.16.1.29
L3_Core_SW(config)#ip dhcp pool Dep_B
L3_Core_SW(dhcp-config)#network 172.16.1.16 255.255.255.240L3_Core_SW(dhcp-config)#default-router 172.16.1.30
L3_Core_SW(dhcp-config)#dns-server 8.8.8.8
L3_Core_SW(dhcp-config)#domain-name LovelyDepartment_B


   Настроим на интерфейсах роли портов доступа (Access interface), и присвоим интерфейсам соответствие одному из VLAN. Порт g2/0/1 оставим без изменений, по умолчанию он будет находится в VLAN1:

L3_Core_SW(config)#int g2/0/2
L3_Core_SW(config-if)#switchport mode access
L3_Core_SW(config-if)#switchport access vlan 2
L3_Core_SW(config-if)#int g2/0/3
L3_Core_SW(config-if)#switchport mode access
L3_Core_SW(config-if)#switchport access vlan 3


   Теперь запустим debug DHCP и посмотрим, каким образом будут обрабатываться сообщения от клиентов, находящихся в разных VLAN:

Клиент, подключенный к интерфейсу из VLAN 1:
L3_Core_SW#
*Mar  2 01:01:21.223: DHCPD: Reload workspace interface Vlan1 tableid 0.
*Mar  2 01:01:21.223: DHCPD: tableid for 10.10.10.253 on Vlan1 is 0
*Mar  2 01:01:21.223: DHCPD: client's VPN is .
*Mar  2 01:01:21.223: DHCPD: using received relay info.
*Mar  2 01:01:21.223: DHCPD: DHCPDISCOVER received from client 0100.0d60.7886.dc on interface Vlan1.
*Mar  2 01:01:21.223: DHCPD: using received relay info.
*Mar  2 01:01:21.223: DHCPD: Sending DHCPOFFER to client 0100.0d60.7886.dc (10.10.10.1).
*Mar  2 01:01:21.223: DHCPD: no option 125
*Mar  2 01:01:21.223: DHCPD: Check for IPe on Vlan1
*Mar  2 01:01:21.223: DHCPD: creating ARP entry (10.10.10.1, 000d.6078.86dc).
*Mar  2 01:01:21.223: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (10.10.10.1).
*Mar  2 01:01:21.223: DHCPD: Reload workspace interface Vlan1 tableid 0.
*Mar  2 01:01:21.223: DHCPD: tableid for 10.10.10.253 on Vlan1 is 0
*Mar  2 01:01:21.223: DHCPD: client's VPN is .
*Mar  2 01:01:21.223: DHCPD: DHCPREQUEST received from client 0100.0d60.7886.dc.
*Mar  2 01:01:21.223: DHCPD: Sending DHCPACK to client 0100.0d60.7886.dc (10.10.10.1).
*Mar  2 01:01:21.223: DHCPD: no option 125
*Mar  2 01:01:21.223: DHCPD: Check for IPe on Vlan1
*Mar  2 01:01:21.223: DHCPD: creating ARP entry (10.10.10.1, 000d.6078.86dc).
*Mar  2 01:01:21.223: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (10.10.10.1).
 

Далее этого же клиента подключаем в интерфейс, находящийся в VLAN 3:
 

*Mar  2 01:02:25.119: DHCPD: Reload workspace interface Vlan3 tableid 0.
*Mar  2 01:02:25.119: DHCPD: tableid for 172.16.1.29 on Vlan3 is 0
*Mar  2 01:02:25.119: DHCPD: client's VPN is .
*Mar  2 01:02:25.119: DHCPD: using received relay info.
*Mar  2 01:02:25.119: DHCPD: DHCPDISCOVER received from client 0100.0d60.7886.dc on interface Vlan3.
*Mar  2 01:02:25.119: DHCPD: using received relay info.
*Mar  2 01:02:25.119: DHCPD: Sending DHCPOFFER to client 0100.0d60.7886.dc (172.16.1.17).
*Mar  2 01:02:25.119: DHCPD: no option 125
*Mar  2 01:02:25.119: DHCPD: Check for IPe on Vlan3
*Mar  2 01:02:25.119: DHCPD: creating ARP entry (172.16.1.17, 000d.6078.86dc).
*Mar  2 01:02:25.119: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (172.16.1.17).
*Mar  2 01:02:25.128: DHCPD: Reload workspace interface Vlan3 tableid 0.
*Mar  2 01:02:25.128: DHCPD: tableid for 172.16.1.29 on Vlan3 is 0
*Mar  2 01:02:25.128: DHCPD: client's VPN is .
*Mar  2 01:02:25.128: DHCPD: DHCPREQUEST received from client 0100.0d60.7886.dc.
*Mar  2 01:02:25.128: DHCPD: Sending DHCPACK to client 0100.0d60.7886.dc (172.16.1.17).
*Mar  2 01:02:25.128: DHCPD: no option 125
*Mar  2 01:02:25.128: DHCPD: Check for IPe on Vlan3
*Mar  2 01:02:25.128: DHCPD: creating ARP entry (172.16.1.17, 000d.6078.86dc).
*Mar  2 01:02:25.128: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (172.16.1.17).
 

И последнее: подключаем клиента к интерфейсу, находящемуся в VLAN2:

*Mar  2 01:03:54.173: DHCPD: Reload workspace interface Vlan2 tableid 0.
*Mar  2 01:03:54.173: DHCPD: tableid for 172.16.1.13 on Vlan2 is 0
*Mar  2 01:03:54.173: DHCPD: client's VPN is .
*Mar  2 01:03:54.173: DHCPD: using received relay info.
*Mar  2 01:03:54.173: DHCPD: DHCPDISCOVER received from client 0100.0d60.7886.dc on interface Vlan2.
*Mar  2 01:03:54.173: DHCPD: using received relay info.
*Mar  2 01:04:01.236: DHCPD: Sending DHCPOFFER to client 0100.0d60.7886.dc (172.16.1.1).
*Mar  2 01:04:01.236: DHCPD: no option 125
*Mar  2 01:04:01.236: DHCPD: Check for IPe on Vlan2
*Mar  2 01:04:01.236: DHCPD: creating ARP entry (172.16.1.1, 000d.6078.86dc).
*Mar  2 01:04:01.236: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (172.16.1.1).
*Mar  2 01:04:01.236: DHCPD: Reload workspace interface Vlan2 tableid 0.
*Mar  2 01:04:01.236: DHCPD: tableid for 172.16.1.13 on Vlan2 is 0
*Mar  2 01:04:01.236: DHCPD: client's VPN is .
*Mar  2 01:04:01.236: DHCPD: DHCPREQUEST received from client 0100.0d60.7886.dc.
*Mar  2 01:04:01.236: DHCPD: Sending DHCPACK to client 0100.0d60.7886.dc (172.16.1.1).
*Mar  2 01:04:01.236: DHCPD: no option 125
*Mar  2 01:04:01.236: DHCPD: Check for IPe on Vlan2
*Mar  2 01:04:01.236: DHCPD: creating ARP entry (172.16.1.1, 000d.6078.86dc).
*Mar  2 01:04:01.236: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (172.16.1.1).




   Каким образом коммутатор понимает, из какого пула необходимо взять адрес? Стоит обратить внимание на то, что коммутатор делает верный выбор пула, и выдает точно те адреса, которые могут существовать в соответствующем VLAN. Как видно из лога, коммутатор сравнивает пулы с адресом интерфейса, на который приходит DHCPDISCOVER. Если это сообщение приходит на интерфейс SVI VLAN 2, а этот интерфейс находится в одном сетевом сегменте с клиентом, значит нужно выбрать тот пул, который будет включать в себя адрес этого SVI. Аналогично с физическими интерфейсами на маршрутизаторе.
    Таким образом, можно создавать множество пулов адресов без каких-либо проблем.

Вариант № 3

УСЛОВИЕ:Теперь попробуем проработать схему с DHCP-Relay. Пусть на коммутаторе L3 создано 4 VLAN, в 3х виртуальных сетях расположены пользователя, а DHCP-сервер настроен на другом коммутаторе L3, который находится в отдельном VLAN.
  
Конфигурация коммутатора-DHCP-сервера представлена ниже. Фактически, мы оставляем на нем созданные ранее DHCP-пулы, а так же создаем маршрутизируемй интерфейс, который будет находиться в VLAN 4.
Параметры VLAN 4:
VLAN 4 -Servers
Network:10.10.5.0/24, IP DHCPServer: 10.10.5.200, SVI IP: 10.10.5.253

DHCPServer#sh run
Building configuration...

*Mar  2 02:02:59.417: %SYS-5-CONFIG_I: Configured from console by console
Current configuration : 2311 bytes
!
! Last configuration change at 02:02:59 UTC Tue Mar 2 1993
!
version 12.2
<omited>
!
hostname DHCPServer
!

ip dhcp excluded-address 10.10.10.253 10.10.10.254
ip dhcp excluded-address 172.16.1.13 172.16.1.14
ip dhcp excluded-address 172.16.1.29 172.16.1.30
!
ip dhcp pool LocalNet
   network 10.10.10.0 255.255.255.0
   default-router 10.10.10.254
   dns-server 8.8.8.8
   domain-name LovelyWork
!
ip dhcp pool Dep_A
   network 172.16.1.0 255.255.255.240
   default-router 172.16.1.14
   dns-server 8.8.8.8
   domain-name LovelyDepartment_A
!
ip dhcp pool Dep_B
   network 172.16.1.16 255.255.255.240
   default-router 172.16.1.30
   dns-server 8.8.8.8
   domain-name LovelyDepartment_B
!
<omited>
!
interface GigabitEthernet2/0/24
 no switchport
 ip address 10.10.5.200 255.255.255.0
!

<omited>
 end



   Коммутатор, выполняющий роль relay-агента и маршрутизатора для межсетевого взаимодействия, имеет следующую конфигурацию:
RelayAgent#sh run<omited>

!
hostname RelayAgent
!
ip routing
!
interface GigabitEthernet1/0/1
!
interface GigabitEthernet1/0/2
 switchport access vlan 2
 switchport mode access
!
interface GigabitEthernet1/0/3
 switchport access vlan 3
 switchport mode access
!
interface GigabitEthernet1/0/4
 switchport access vlan 4
 switchport mode access
!
<omited>
!
interface Vlan1
 ip address 10.10.10.253 255.255.255.0
 ip helper-address 10.10.5.200
!
interface Vlan2
 ip address 172.16.1.13 255.255.255.240
 ip helper-address 10.10.5.200
!
interface Vlan3
 ip address 172.16.1.29 255.255.255.240
 ip helper-address 10.10.5.200
!
interface Vlan4
 ip address 10.10.5.253 255.255.255.0
!

<omited>

   Для настройки relay к каждому SVI был добавлен helper-address, ссылающийся на DHCP-сервер.
    Подключим клиентское устройство к порт Gi1/0/3 (VLAN 3) на коммутаторе RelayAgent и рассмотрим лог команды debug:

Сообщение от клиента приходит на интерфейс VLAN 3
RelayAgent#
*Mar  2 03:05:17.120: DHCPD: Reload workspace interface Vlan3 tableid 0.
*Mar  2 03:05:17.120: DHCPD: tableid for 172.16.1.29 on Vlan3 is 0
*Mar  2 03:05:17.120: DHCPD: client's VPN is .
*Mar  2 03:05:17.120: DHCPD: using received relay info.
*Mar  2 03:05:17.120: DHCPD: Looking up binding using address 172.16.1.29
 

   Для передачи сообщения далее, в другую сеть, агент устанавливает в поле giaddr адрес интерфейса, на который он получил сообщение от клиента и переправляет это сообщение в другую сеть (VLAN 4): 

*Mar  2 03:05:17.120: DHCPD: setting giaddr to 172.16.1.29.
*Mar  2 03:05:17.120: DHCPD: BOOTREQUEST from 0100.0d60.7886.dc forwarded to 10.10.5.200.
 

    Ответ от DHCP-сервера приходит соответственно на SVI, принадлежащий VLAN 4, в котором и расположен DHCP-сервер. Этот ответ обрабатывается и перенаправляется клиенту. При этом relay-агент создает ARP-запись для выдаваемого сервером адреса:


*Mar  2 03:05:19.133: DHCPD: Reload workspace interface Vlan4 tableid 0.
*Mar  2 03:05:19.133: DHCPD: tableid for 10.10.5.253 on Vlan4 is 0
*Mar  2 03:05:19.133: DHCPD: client's VPN is .
*Mar  2 03:05:19.133: DHCPD: forwarding BOOTREPLY to client 000d.6078.86dc.
*Mar  2 03:05:19.133: DHCPD: no option 125
*Mar  2 03:05:19.133: DHCPD: Check for IPe on Vlan3
*Mar  2 03:05:19.133: DHCPD: creating ARP entry (172.16.1.18, 000d.6078.86dc).
*Mar  2 03:05:19.133: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (172.16.1.18).




   
Для сообщений типа DHCPREQUEST и DHCPACK ситуация повторяется:


*Mar  2 03:05:19.142: DHCPD: Reload workspace interface Vlan3 tableid 0.
*Mar  2 03:05:19.142: DHCPD: tableid for 172.16.1.29 on Vlan3 is 0
*Mar  2 03:05:19.142: DHCPD: client's VPN is .
*Mar  2 03:05:19.142: DHCPD: Finding a relay for client 0100.0d60.7886.dc on interface Vlan3.
*Mar  2 03:05:19.142: DHCPD: Looking up binding using address 172.16.1.29
*Mar  2 03:05:19.142: DHCPD: setting giaddr to 172.16.1.29.
*Mar  2 03:05:19.142: DHCPD: BOOTREQUEST from 0100.0d60.7886.dc forwarded to 10.10.5.200.
*Mar  2 03:05:19.142: DHCPD: Reload workspace interface Vlan4 tableid 0.
*Mar  2 03:05:19.142: DHCPD: tableid for 10.10.5.253 on Vlan4 is 0
*Mar  2 03:05:19.142: DHCPD: client's VPN is .
*Mar  2 03:05:19.142: DHCPD: forwarding BOOTREPLY to client 000d.6078.86dc.
*Mar  2 03:05:19.142: DHCPD: no option 125
*Mar  2 03:05:19.142: DHCPD: Check for IPe on Vlan3
*Mar  2 03:05:19.142: DHCPD: creating ARP entry (172.16.1.18, 000d.6078.86dc).
*Mar  2 03:05:19.142: DHCPD: unicasting BOOTREPLY to client 000d.6078.86dc (172.16.1.18).



   Стоит посмотреть, есть ли какие-либо интересные изменения в логе debug на самом DHCP-сервере:

DHCPServer#
*Mar  2 03:16:33.309: DHCPD: Reload workspace interface GigabitEthernet2/0/24 tableid 0.
*Mar  2 03:16:33.309: DHCPD: tableid for 10.10.5.200 on GigabitEthernet2/0/24 is 0
*Mar  2 03:16:33.309: DHCPD: client's VPN is .
*Mar  2 03:16:33.309: DHCPD: using received relay info.
*Mar  2 03:16:33.309: DHCPD: DHCPDISCOVER received from client 0100.0d60.7886.dc through relay 172.16.1.29.*Mar  2 03:16:33.309: DHCPD: using received relay info.
*Mar  2 03:16:33.309: DHCPD: Sending DHCPOFFER to client 0100.0d60.7886.dc (172.16.1.18).
*Mar  2 03:16:33.309: DHCPD: no option 125
*Mar  2 03:16:33.309: DHCPD: unicasting BOOTREPLY for client 000d.6078.86dc to relay 172.16.1.29.*Mar  2 03:16:33.326: DHCPD: Reload workspace interface GigabitEthernet2/0/24 tableid 0.
*Mar  2 03:16:33.326: DHCPD: tableid for 10.10.5.200 on GigabitEthernet2/0/24 is 0
*Mar  2 03:16:33.326: DHCPD: client's VPN is .
*Mar  2 03:16:33.326: DHCPD: DHCPREQUEST received from client 0100.0d60.7886.dc.
*Mar  2 03:16:33.326: DHCPD: Sending DHCPACK to client 0100.0d60.7886.dc (172.16.1.18).
*Mar  2 03:16:33.326: DHCPD: no option 125
*Mar  2 03:16:33.326: DHCPD: unicasting BOOTREPLY for client 000d.6078.86dc to relay 172.16.1.29.
 
   Из лога видно, что все общение сервера идет через агента. Еще одна заметная особенность: DHCP сервер не создает ARP записей в своей таблице, т.к. он не находится в одном и том же сегменте с клиентом.

Вариант №4

УСЛОВИЕ: Схема такая же, как и в варианте №3, но вместо DHCP-сервера на cisco-образном устройстве воспользуемся полноценным DHCP-сервером, поднятом на Windows Server 2012. Именно такая схема почему-то не заработала у заказчика.
   Коммутатор L3-Switch/DHCP-Relay Agent был настроен в предыдущем опыте. Остается только настроить DHCP-Server на Windows Server 2012.
   На сервере поднимаем MS WinServ2012, настраиваем сетевой адрес вручную на интерфейсе (10.10.5.200/24), включаем соответствующую роль (DHCP Server): Server Manager-->Add roles and Features (на четвертом шаге данного мастера выбираем DHCP Server из списка ролей)-->следуя указаниям, завершаем включение роли.
   На следующем шаге необходимо сделать restart сервиса: Start-->Administration Tools-->Services-->DHCP Server-->ПКМ-->В выпавшем меню Restart.
   Когда сервис поднимется, приступаем к настройке пулов: Start-->Administrative Tools-->DHCP-->ПКМ на "IPv4"-->New Scope... - Далее, следуя указаниям мастера настраиваем 3 пула для наших целей.
   На этом настройка заканчивается. Проверка показывает, что сообщения от клиентов преодолевают relay-агента и доходят до сервера, после чего идут обратно до пользователя без каких-либо проблем.

   Можно составить еще какие-либо схемы, используя дополнительные промежуточные устройства. Но логика настройки и работы DHCP остается неизменно. 

22 комментария:

  1. Так почему сразу не заработал сервис на винде? В чём была ошибка?

    ОтветитьУдалить
  2. Мы так и не смогли разобраться) Кажется, не заработал потому, что винда устанавливалась не в чистую, а методом апгрэйда. И что-то пошло не так. На чистой винде все работало без проблем)

    ОтветитьУдалить
    Ответы
    1. На первой картинке видно и дальше в статье написано что dhcp offer отправляется "как unicast-сообщение на L2, с использованием адреса сервера на втором уровне и MAC-адреса отправителя.", а при этом в анализаторе пакетов видно, что адрес назначения dhcp offer'а - это 255.255.255.255 и ffffffff, т.е бродкаст.

      Это как так?

      А вообще, статья отличная, спасибо.

      Удалить
    2. Доброго дня, Юрий!
      Спасибо за указание на ошибку в рисунках. Проверю, почему так получилось.
      Сейчас смотрю на анализ обмена пакетами в другой системе - снова немного другой результат: адреса получателя и отправителя идут как в теории, а вот флаг везде (!) стоит broadcast.

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Статья полезная.
    У меня 130 VLAN, которые разруливает Linux маршрутизатор и он же является dhcp сервером. До этого все было поднято на Huawei s6506r (аналог циски той же 6500 серии), как показала практика, железяка загнулась на 400+ адресах и начала поаторно выдавать разным клиентам уже розданные ip. Коммутатор был переведен в режим dhcp-relay, а dhcp-сервер переехал на линукс(потом обнаружилась проблема с построением и оьновлением таблицы mac-адресов на железяке и от нее пришлось избавится.
    Так вот, DHCP-relay кроме описанных вами функций имеет побочный бонус - переводит dhcp трафик с udp на tcp, а это значит меньше мусорного трафика и ошибок. Запрсы хоста значительно быстрее отрабатываются релеем и кэшируются в его таблице т. е. снижается нагрузка на dhcp сервер и ускоряется раздача адресов. Сейчас у меня в сети более 2000 хостов и начали возникать проблемы на отдельных медленных устройствах, которые либо не укладываются в таймаут либо не способны принять пакет с настройками с первого раза целиком, к примеру приходил ip, маска сети, но шлюза небыло, приходилось принудительно заставлять клиента пепеполучить данные, либо он это делал со 2-3 запроса.

    ОтветитьУдалить
    Ответы
    1. Спасибо за отзыв!
      Очень интересный вариант использования. Встречный вопрос: у вас сам DHCP крутится на одном линуксовом сервере? Вы как-либо его резервируете?

      Удалить
  6. Добрый день. А как такое: Роутер Mikrotik с DHCP сервером. А на свиче DHCP Relay и свич обслуживает и раздаёт адреса клиента от роутера?

    ОтветитьУдалить
    Ответы
    1. А зачем так делать? Чего хотите добиться такой конфигурацией? Пока что выглядит как нанять секретаря для секретаря, в задачу которого будет входить передача бумаг основному секретарю. Причем сидеть они должны в одной комнате и за одним столом.

      Удалить
    2. Коротко говоря, думаю а очень простом конфиге, тоесть без options 82. Абонент получают ип, но при этом не видят друг друга на свиче или сканировать друг друга по портам и тд. Тогда получается на каждый порт должно сделать вланы? А на аплинке q-in-q? или всё таки options 82 надо будет?

      Удалить
    3. Хочу добавить правку на то что - не хочу чтобы абоненты НЕ смогли сканировать друг друга по сети

      Удалить
    4. Если задача состоит в том, чтобы изолировать клиентов друг от друга, то тут DHCP и релей вообще не при чем. Для изоляции стоит посмотреть в сторону таких технологий, как:
      - MAC ACL
      - VLAN для каждого пользователя с сеткой /30 и ACL
      - Privat VLAN (если Cisco или Mikrotik, про других просто не знаю, есть ли такое)
      - Q-in-Q.
      Но точно к DHCP и релею это отношения не имеет.

      Удалить
    5. Спасибо, это было полезная информация

      Удалить
  7. Спасибо было интересно. У меня вопрос: Одинаковые SVI на обоих L3 это нормально? Или они не пересекаются из-за того, что между L3 только VLAN4?

    Сталкивался с такой рабочей схемой.
    interface Loopback1
    ip address 1xx.1xx.2xx.1 255.255.255.0
    ip address 172.16.4.1 255.255.252.0 secondary
    ip address 1xx.1xx.2xx.1 255.255.255.0 secondary
    ip address 1xx.1xx.2xx.1 255.255.255.0 secondary
    ip address 1xx.1xx.2xx.1 255.255.255.0 secondary
    !
    !
    interface Vlan3
    ip unnumbered Loopback1
    ip helper-address 10.11.5.2

    ОтветитьУдалить
    Ответы
    1. Доброго дня!
      Не увидел, где SVI одинаковые. Можете показать? Вообще, конечно, одинаковых быть не должно. Иначе будут пересечения и в логах увидим ошибку Duplicate IP Address. Но я не вижу, где они одинаковые. Там helper-адрес указан на SVI, а сами адреса другие.
      Касательно Вашего конфига: не вижу причин, почему он был бы не рабочим. Тем не менее, я бы отказался от навешивания кучи вторичных адресов на один интерфейс. Но опять же все зависит от целей и задач.

      Удалить
    2. Всё понятно кроме одного (туплю). У Вас на L3_Core_SW и RelayAgent одинаковые SVI. Или я что то не допонял.

      Удалить
    3. Понял, о чем речь!
      Это две разные топологии - вариант 2 и вариант 3. Поэтому адресация там одинаковая.=)

      Удалить
    4. Не ловко снова спрашивать об одном и том же, хочу до конца разобраться. Если не трудно, воспроизведите Вариант № 3 в PT и скиньте на salimskkssk@mail.ru
      У Вас пулы находятся на DHCPServer а на RelayAgent SVI?

      Удалить
    5. Да, верно.
      Вот на агенте.
      !
      interface Vlan1
      ip address 10.10.10.253 255.255.255.0
      ip helper-address 10.10.5.200
      !
      interface Vlan2
      ip address 172.16.1.13 255.255.255.240
      ip helper-address 10.10.5.200
      !
      interface Vlan3
      ip address 172.16.1.29 255.255.255.240
      ip helper-address 10.10.5.200
      !
      А на коммутаторе, который в данном примере выполняет роль сервера - взял физический интерфейс.
      !
      interface GigabitEthernet2/0/24
      no switchport
      ip address 10.10.5.200 255.255.255.0
      !
      Вы можете этот же конфиг воспроизвести в РТ, копировать-вставить =)

      Удалить
  8. А на коммутаторе, который в данном примере выполняет роль сервера - взял физический интерфейс.
    !
    interface GigabitEthernet2/0/24
    no switchport
    ip address 10.10.5.200 255.255.255.0
    !

    А почему не подняли loopback?

    ОтветитьУдалить
    Ответы
    1. Думаю, что на тот момент времени было интересно играться с физикой, не более. Но для тестов можно и петлю сделать, не принципиально.

      Удалить