Вопрос: Пример настройки DHCP Relay Option 82

Ответ: 
Пример настройки DHCP Relay Option 82 Скачать (PDF)
 
Опция DHCP Relay Agent Information (Option 82) преимущественно используется в сетях провайдеров и больших корпоративных сетях. Relay-агент добавляет дополнительную информацию (опцию 82) в сообщения DHCP, передаваемые клиентом DHCP-серверу. Эта информация позволяет идентифицировать точку подключения клиента.
 
Relay-агент вставляет свой IP-адрес в поле Relay Agent IP address сообщения DHCP, полученного от клиента. Используя этот IP-адрес, сервер выбирает нужный пул адресов. Опция 82 уточняет запрос, позволяя серверу выбирать поддиапазон или какой-то конкретный адрес из пула на основе информации о маршрутизаторе/коммутаторе и номере его порта, который клиент использует для подключения к сети.
 
Формат опции Relay Agent Information определен в RFC 3046. Она начинается с поля Code, имеющего значение 82, за которым следует поле Length, определяющее общую длину опции. За полем Length расположено поле Agent Information Field, которое состоит из последовательности подопций, состоящих из трех полей: SubOpt (код подопции)/Length (длина подопции)/Value (значение подопции).
 
 
Рис. 1 Формат опции Relay Agent Information
 
В RFC 3046 определены только две подопции:
  • Agent Circuit ID (SubOpt 1) — строка, идентифицирующая интерфейс relay-агента, принимающий DHCP-сообщения от клиента;
  • Agent Remote ID (SubOpt 2) — строка, идентифицирующая relay-агента.
Однако некоторые производители предпочитают использовать их собственные расширения опции 82. RFC 4342 описывает подопции опции 82, в которых передается информация, специфичная для производителя.
 
Подопции Agent Circuit ID и Agent Remote ID обычно определяются клиентским устройством доступа и зависят от конфигурации сети. Программное обеспечение коммутаторов D-Link с поддержкой функции DHCP relay-агента позволяет конфигурировать формат этих подопций. По умолчанию в качестве Agent Remote ID используется МАС-адрес коммутатора. В качестве Agent Circuit ID по умолчанию используется строка имеющая формат, показанный на рисунке 2. Другие поддерживаемые форматы Agent Remote ID и Agent Circuit ID описаны в руководствах пользователей соответствующих моделей коммутаторов.
 
 
Рис. 2 Формат Agent Circuit ID по умолчанию
 
Примечание к настройке
Рассматриваемый пример настройки подходит для следующих серий коммутаторов: DGS-1250, DGS-1510, DGS-1520, DGS-3130, DGS-3630, DXS-3610.
 
Задача
DHCP-сервер использует диапазоны адресов 192.168.2.3—192.168.2.10 и 192.168.3.3—192.168.3.10 для выдачи DHCP-клиентам. Как только DHCP-клиент подключается к порту 6 коммутатора, DHCP-сервер должен назначить ему IP-адрес 192.168.2.6, если к порту 14 — 192.168.3.14.
 
 
Рис. 3 Схема подключения
 
Настройка DHCP-сервера isc-dhcp-server
  1. Настройте статический IP-адрес для сетевого интерфейса enp0s3:
$ sudo ifconfig enp0s3 192.168.1.1/24
 
Примечание
enp0s3 — это имя сетевого интерфейса. Для просмотра информации о сетевых интерфейсах в терминале введите команду:
$ ifconfig
  1. Создайте маршрут по умолчанию:
$ sudo route add default gw 192.168.1.2
  1. Посмотрите таблицу маршрутизации:
$ route
  1. Установите пакет isc-dhcp-server:
$ sudо apt-get install isc-dhcp-server
  1. Настройте DHCP-сервер так, чтобы DHCP-клиент, подключенный к 6 порту коммутатора, получил IP-адрес — 168.2.6/24, а DHCP-клиент, подключенный к 14 порту, — 192.168.3.14/24. Сервер должен проверять не только с какого порта пришел DHCP-запрос, но и МАС-адрес relay-агента, который этот запрос перенаправил. Конфигурационный файл /etc/dhcp/dhcpd.conf должен выглядеть следующим образом:
$ sudo gedit /etc/dhcp/dhcpd.conf
default-lease-time 120;
max-lease-time 600;
subnet 192.168.1.0 netmask 255.255.255.0 {
}
class "port-6" {
   match if binary-to-ascii (10, 8, "", suffix (option agent.circuit-id, 1)) = "6" and binary-to-ascii (16, 8, ":", substring (option agent.remote-id, 2, 6)) = "ac:f1:df:b5:fc:0";
}
class "port-14" {
   match if binary-to-ascii (10, 8, "", suffix (option agent.circuit-id, 1)) = "14" and binary-to-ascii (16, 8, ":", substring (option agent.remote-id, 2, 6)) = "ac:f1:df:b5:fc:0";
}
subnet 192.168.2.0 netmask 255.255.255.0 {
   pool {
     allow members of "port-6";
     range 192.168.2.6;
     option subnet-mask 255.255.255.0;
     option routers 192.168.2.2; 
     }
}
subnet 192.168.3.0 netmask 255.255.255.0 {
 pool {
     allow members of "port-14";
     range 192.168.3.14;
     option subnet-mask 255.255.255.0;
     option routers 192.168.3.2;
     }
}
 
Примечание
В конфигурационном файле вместо ac:f1:df:b5:fc:0 введите реальный МАС‑адрес коммутатора.
 
Рассмотрим синтаксис правила для соответствия IP-адреса 6 порту коммутатора.
Создаем класс для обработки DHCP-сообщений, поступивших на 6 порт коммутатора: class "port-6"
 
Определяем условия соответствия классу:
suffix (option agent.circuit-id, 1) — получаем последний байт из подопции Agent Circuit ID, в котором содержится информация о номере порта коммутатора.
binary-to-ascii (10, 8, "", suffix (option agent.circuit-id, 1)) = "6" — преобразуем последний байт Agent Circuit ID из двоичного формата в десятичный и указываем, что DHCP-сообщение попадет под правило класса, если результат преобразования равен 6.
substring (option agent.remote-id, 2, 6) — получаем МАС-адрес коммутатора из подопции Agent Remote ID.
binary-to-ascii (16, 8, ":", substring (option agent.remote-id, 2, 6)) = "ac:f1:df:b5:fc:0" —  полученное значение разделяем на числа по 8 бит, преобразуем в шестнадцатеричный формат и разделяем двоеточием. Указываем, что DHCP-сообщение попадет под правило класса, если результат преобразования равен ac:f1:df:b5:fc:0.
 
Примечание
При преобразовании не значащие нули слева удаляются, поэтому в МАС-адресе, с которым сравнивается результат преобразования, вместо 00 нужно указать 0.
 
Назначаем IP-адрес, маску подсети и шлюз по умолчанию для клиента, подключённого к 6 порту:
pool  {
     allow members of "port-6";
     range 192.168.2.6;
     option subnet-mask 255.255.255.0;
     option routers 192.168.2.2;
}
  1. Запустите DHCP-сервер:
$ sudo /etc/init.d/isc-dhcp-server start
 
Примечание
Каждый раз после изменения конфигурационного файла DHCP-сервера перезапускайте сервер с помощью команды:
$ sudo /etc/init.d/isc-dhcp-server restart
  1. Проверьте статус DHCP-сервера:
$ sudo service isc-dhcp-server status
 
Настройка коммутатора
  1. Создайте VLAN с именами v1000, v2000, v3000 и добавьте в них немаркированные порты:
Switch(config)# vlan 1000
Switch(config-vlan)# name v1000
Switch(config-vlan)# exit
Switch(config)# vlan 2000
Switch(config-vlan)# name v2000
Switch(config-vlan)# exit
Switch(config)# vlan 3000
Switch(config-vlan)# name v3000
Switch(config-vlan)# exit
Switch(config)# interface ethernet 1/0/1
Switch(config-if)# switchport mode access
Switch(config-if)# switchport access vlan 1000
Switch(config-if)# exit
Switch(config)# interface range ethernet 1/0/2-12
Switch(config-if-range)# switchport mode access
Switch(config-if-range)# switchport access vlan 2000
Switch(config-if-range)# exit
Switch(config)# interface range ethernet 1/0/13-24
Switch(config-if-range)# switchport mode access
Switch(config-if-range)# switchport access vlan 3000
Switch(config-if-range)# end
  1. Создайте IP-интерфейсы с именами 1000, 2000 и 3000 и привяжите их к VLAN:
Switch(config)# interface vlan 1000
Switch(config-if)# ip address 192.168.1.2 255.255.255.0
Switch(config-if)# exit
Switch(config)# interface vlan 2000
Switch(config-if)# ip address 192.168.2.2 255.255.255.0
Switch(config-if)# exit
Switch(config)# interface vlan 3000
Switch(config-if)# ip address 192.168.3.2 255.255.255.0
Switch(config-if)# end
  1. Настройте relay-агент:
Switch(config)# ip dhcp pool pool1
Switch(config-dhcp-pool)# relay source 192.168.2.0 255.255.255.0
Switch(config-dhcp-pool)# relay destination 192.168.1.1
Switch(config-dhcp-pool)# exit
Switch(config)# ip dhcp pool pool2
Switch(config-dhcp-pool)# relay source 192.168.3.0 255.255.255.0
Switch(config-dhcp-pool)# relay destination 192.168.1.1
Switch(config-dhcp-pool)# exit
  1. Включите 82 опцию:
Switch(config)# ip dhcp relay information option