DHCP Relay и Option 82 на MikroTik
DHCP Relay — механизм пересылки DHCP-запросов между подсетями, позволяющий использовать один централизованный DHCP-сервер для обслуживания множества VLAN. Без Relay в каждом VLAN нужен свой DHCP-сервер (или отдельный экземпляр на маршрутизаторе), что усложняет управление. Option 82 (Relay Agent Information) дополняет Relay: она сообщает DHCP-серверу, с какого порта и коммутатора пришёл запрос, что позволяет привязать IP-адрес к физическому порту абонента. Эта связка широко используется провайдерами для IPoE-подключений и в корпоративных сетях с большим количеством VLAN.
Руководство актуально для RouterOS 7.20+.
Описание
Зачем нужен DHCP Relay
DHCP работает через broadcast. Broadcast не проходит через маршрутизатор — он ограничен одним L2-сегментом (VLAN). Если в сети 50 VLAN, без DHCP Relay нужно:
- Либо создать 50 экземпляров DHCP-сервера (по одному на каждый VLAN)
- Либо настроить 50 DHCP Relay, пересылающих запросы на один центральный сервер
Второй вариант значительно проще в управлении: один сервер, одна база IP-адресов, одно место для мониторинга и диагностики.
codeАбонент (VLAN 100) Абонент (VLAN 200) | | [DHCP Discover broadcast] [DHCP Discover broadcast] | | [MikroTik: DHCP Relay] [MikroTik: DHCP Relay] | | +---------> [DHCP Server] <-----------+ (unicast) Один сервер для всех VLAN
Как работает DHCP Relay:
- Клиент отправляет DHCP Discover (broadcast) в своём VLAN
- MikroTik-relay получает этот broadcast
- Relay подставляет в поле giaddr (Gateway IP Address) свой IP-адрес в этом VLAN
- Relay пересылает запрос на DHCP-сервер как unicast
- DHCP-сервер видит giaddr, определяет подсеть клиента и назначает IP из соответствующего пула
- Сервер отправляет ответ на giaddr (обратно на relay)
- Relay пересылает ответ клиенту в его VLAN
Что такое Option 82 (Relay Agent Information)
Option 82 — расширение DHCP (RFC 3046), которое добавляет в DHCP-запрос информацию о том, откуда именно пришёл запрос:
| Sub-option | Название | Содержимое | Пример |
|---|---|---|---|
| 1 | Circuit ID | Идентификатор порта/VLAN | ether5:100 или switch1/port5 |
| 2 | Remote ID | Идентификатор устройства (relay) | MAC-адрес или hostname коммутатора |
Зачем это нужно:
- Привязка IP к порту — DHCP-сервер выдаёт конкретный IP-адрес абоненту на основании порта, к которому он подключён (а не MAC-адреса, который можно подменить)
- Идентификация абонента — в ISP-сетях Option 82 позволяет однозначно определить, на каком коммутаторе и порту подключён абонент
- Безопасность — защита от подмены MAC-адреса (IP привязан к порту, а не к MAC)
- Диагностика — при проблемах видно, откуда именно пришёл запрос
DHCP Relay vs DHCP Server per VLAN
| Параметр | DHCP Relay + Option 82 | DHCP Server per VLAN |
|---|---|---|
| Количество серверов | 1 (централизованный) | N (по числу VLAN) |
| Управление | Простое (одно место) | Сложное (N конфигураций) |
| Option 82 | Да | Нет (не нужна) |
| Привязка IP к порту | Да (через Option 82) | Да (через static lease) |
| Нагрузка на маршрутизатор | Минимальная (relay) | Выше (N DHCP-серверов) |
| Отказоустойчивость | Единая точка отказа (сервер) | Распределённая |
| ISP-сценарий | Оптимально | Не масштабируется |
| Малая сеть (3–5 VLAN) | Избыточно | Оптимально |
Вывод: DHCP Relay + Option 82 — для ISP и крупных корпоративных сетей с 10+ VLAN. DHCP Server per VLAN — для малых сетей с 3–5 VLAN.
Настройка
Сценарий 1: Базовый DHCP Relay (без Option 82)
Простейший случай: MikroTik маршрутизирует трафик между VLAN и пересылает DHCP-запросы на центральный сервер.
Схема:
code[DHCP Server: 172.16.0.10] | [MikroTik Router] / \ [VLAN 100] [VLAN 200] 192.168.100.0/24 192.168.200.0/24
Настройка MikroTik (маршрутизатор с relay):
[admin@MikroTik] ># --- VLAN-интерфейсы --- /interface/vlan/add name=vlan100 vlan-id=100 interface=bridge /interface/vlan/add name=vlan200 vlan-id=200 interface=bridge # --- IP-адреса (будут использоваться как giaddr) --- /ip/address/add address=192.168.100.1/24 interface=vlan100 comment="VLAN 100 gateway" /ip/address/add address=192.168.200.1/24 interface=vlan200 comment="VLAN 200 gateway" # --- DHCP Relay --- /ip/dhcp-relay/add name=relay-vlan100 interface=vlan100 \ dhcp-server=172.16.0.10 local-address=192.168.100.1 \ disabled=no comment="Relay for VLAN 100" /ip/dhcp-relay/add name=relay-vlan200 interface=vlan200 \ dhcp-server=172.16.0.10 local-address=192.168.200.1 \ disabled=no comment="Relay for VLAN 200"
Параметры:
interface— интерфейс, на котором relay слушает DHCP-broadcast от клиентовdhcp-server— IP-адрес центрального DHCP-сервераlocal-address— IP-адрес, который подставляется в giaddr. Должен совпадать с адресом маршрутизатора в этом VLAN
Настройка центрального DHCP-сервера (на другом MikroTik или Linux):
[admin@MikroTik] ># Если DHCP-сервер тоже MikroTik: # Пулы для каждой подсети /ip/pool/add name=pool-vlan100 ranges=192.168.100.10-192.168.100.254 /ip/pool/add name=pool-vlan200 ranges=192.168.200.10-192.168.200.254 # DHCP-сервер на интерфейсе, куда приходит relay /ip/dhcp-server/add name=dhcp-central interface=ether1 address-pool=pool-vlan100 \ relay=192.168.100.1 disabled=no comment="Central DHCP for VLAN 100" /ip/dhcp-server/add name=dhcp-central-200 interface=ether1 address-pool=pool-vlan200 \ relay=192.168.200.1 disabled=no comment="Central DHCP for VLAN 200" # Сети (network) для каждого пула /ip/dhcp-server/network/add address=192.168.100.0/24 gateway=192.168.100.1 \ dns-server=8.8.8.8,8.8.4.4 /ip/dhcp-server/network/add address=192.168.200.0/24 gateway=192.168.200.1 \ dns-server=8.8.8.8,8.8.4.4
DHCP-сервер определяет подсеть клиента по полю giaddr в пересланном запросе. Если giaddr=192.168.100.1, значит, клиент из подсети 192.168.100.0/24, и IP выдаётся из соответствующего пула.
Сценарий 2: DHCP Relay с Option 82
Добавляем Option 82 для идентификации абонентов по порту и коммутатору.
[admin@MikroTik] ># --- DHCP Relay с Option 82 --- /ip/dhcp-relay/add name=relay-vlan100 interface=vlan100 \ dhcp-server=172.16.0.10 local-address=192.168.100.1 \ add-relay-info=yes \ disabled=no comment="Relay VLAN 100 with Option 82" /ip/dhcp-relay/add name=relay-vlan200 interface=vlan200 \ dhcp-server=172.16.0.10 local-address=192.168.200.1 \ add-relay-info=yes \ disabled=no comment="Relay VLAN 200 with Option 82"
Параметр add-relay-info=yes включает добавление Option 82 в DHCP-запрос. MikroTik автоматически формирует:
- Circuit ID — содержит информацию об интерфейсе и VLAN (формат зависит от версии RouterOS)
- Remote ID — содержит MAC-адрес или system identity устройства-relay
Сценарий 3: ISP с Option 82 и привязкой IP к порту
Полный ISP-сценарий: несколько коммутаторов доступа (CSS326), DHCP Relay на агрегации, центральный DHCP-сервер с привязкой IP к Option 82.
code[DHCP Server + Billing] | [CCR2004 — BRAS/Router] | [CRS326 — Aggregation] / \ [CSS326 #1] [CSS326 #2] — Access switches VLAN 101 VLAN 102 | | Абоненты Абоненты
Коммутатор доступа (CSS326 #1):
[admin@MikroTik] ># CSS326 — коммутатор доступа, дом 1 /system/identity/set name="ACC-HOUSE-01" /interface/bridge/add name=bridge vlan-filtering=yes # Uplink (trunk) /interface/bridge/port/add bridge=bridge interface=sfp-sfpplus1 \ pvid=1 frame-types=admit-only-vlan-tagged # Абонентские порты (access VLAN 101) /interface/bridge/port/add bridge=bridge interface=ether1 pvid=101 /interface/bridge/port/add bridge=bridge interface=ether2 pvid=101 /interface/bridge/port/add bridge=bridge interface=ether3 pvid=101 # VLAN table /interface/bridge/vlan/add bridge=bridge vlan-ids=101 \ tagged=sfp-sfpplus1 \ untagged=ether1,ether2,ether3
Маршрутизатор/BRAS (CCR2004):
[admin@MikroTik] ># ============================================ # ISP DHCP Relay с Option 82 # ============================================ # --- VLAN-интерфейсы --- /interface/vlan/add name=vlan101-house1 vlan-id=101 interface=sfp-sfpplus2 /interface/vlan/add name=vlan102-house2 vlan-id=102 interface=sfp-sfpplus2 # --- IP-адреса (giaddr) --- /ip/address/add address=10.101.0.1/24 interface=vlan101-house1 /ip/address/add address=10.102.0.1/24 interface=vlan102-house2 # --- DHCP Relay с Option 82 --- /ip/dhcp-relay/add name=relay-house1 interface=vlan101-house1 \ dhcp-server=172.16.0.10 local-address=10.101.0.1 \ add-relay-info=yes \ disabled=no comment="House 1 relay with Option 82" /ip/dhcp-relay/add name=relay-house2 interface=vlan102-house2 \ dhcp-server=172.16.0.10 local-address=10.102.0.1 \ add-relay-info=yes \ disabled=no comment="House 2 relay with Option 82"
Центральный DHCP-сервер (отдельный MikroTik или Linux):
На MikroTik DHCP-сервере можно использовать static lease с привязкой к Circuit ID:
[admin@MikroTik] ># Пулы адресов /ip/pool/add name=pool-house1 ranges=10.101.0.10-10.101.0.254 /ip/pool/add name=pool-house2 ranges=10.102.0.10-10.102.0.254 # DHCP-серверы /ip/dhcp-server/add name=dhcp-house1 interface=ether1 address-pool=pool-house1 \ relay=10.101.0.1 disabled=no /ip/dhcp-server/add name=dhcp-house2 interface=ether1 address-pool=pool-house2 \ relay=10.102.0.1 disabled=no # Сети /ip/dhcp-server/network/add address=10.101.0.0/24 gateway=10.101.0.1 \ dns-server=8.8.8.8,8.8.4.4 /ip/dhcp-server/network/add address=10.102.0.0/24 gateway=10.102.0.1 \ dns-server=8.8.8.8,8.8.4.4 # Статические привязки по Circuit ID (Option 82) # Формат Circuit ID зависит от версии RouterOS и оборудования # Пример: привязка порта ether1 коммутатора house1 к конкретному IP /ip/dhcp-server/lease/add address=10.101.0.100 \ dhcp-option-set="" \ comment="House 1, port 1 — subscriber Ivanov"
Сценарий 4: DHCP Relay на нескольких интерфейсах (массовое создание)
Для ISP с десятками VLAN удобно создавать relay через скрипт:
[admin@MikroTik] ># Скрипт создания DHCP Relay для VLAN 101-150 :for i from=101 to=150 do={ /interface/vlan/add name="vlan$i" vlan-id=$i interface=sfp-sfpplus2 /ip/address/add address="10.$i.0.1/24" interface="vlan$i" /ip/dhcp-relay/add name="relay-vlan$i" interface="vlan$i" \ dhcp-server=172.16.0.10 local-address="10.$i.0.1" \ add-relay-info=yes disabled=no }
Настройка Circuit ID и Remote ID
RouterOS позволяет настроить формат Circuit ID:
[admin@MikroTik] ># Просмотр текущих настроек relay /ip/dhcp-relay/print detail # По умолчанию Circuit ID содержит: # - Interface name (имя интерфейса, где получен запрос) # - VLAN ID (если запрос пришёл из VLAN)
На стороне DHCP-сервера (ISC DHCP на Linux) Option 82 обрабатывается так:
[admin@MikroTik] ># /etc/dhcp/dhcpd.conf # Логирование Option 82 if exists agent.circuit-id { log(info, concat("Option 82 Circuit-ID: ", binary-to-ascii(16, 8, ":", option agent.circuit-id))); } if exists agent.remote-id { log(info, concat("Option 82 Remote-ID: ", binary-to-ascii(16, 8, ":", option agent.remote-id))); } # Класс для привязки по Circuit ID class "house1-port1" { match if option agent.circuit-id = "vlan101-ether1"; } pool { allow members of "house1-port1"; range 10.101.0.100 10.101.0.100; }
Настройка DHCP Snooping на коммутаторах доступа
DHCP Snooping защищает от поддельных DHCP-серверов в абонентской сети:
[admin@MikroTik] ># На коммутаторе доступа (CRS/CSS): # Включаем DHCP Snooping /interface/bridge/set bridge dhcp-snooping=yes # Trusted port — uplink (к BRAS/relay) /interface/bridge/port/set [find interface=sfp-sfpplus1] trusted=yes # Абонентские порты — untrusted (по умолчанию) # DHCP-ответы от абонентских портов будут заблокированы
Проверка
Проверка DHCP Relay
[admin@MikroTik] ># Статус relay /ip/dhcp-relay/print # Подробная информация /ip/dhcp-relay/print detail # Статистика (сколько запросов переслано) /ip/dhcp-relay/print stats
Ожидаемый вывод:
codeFlags: X - disabled # NAME INTERFACE DHCP-SERVER LOCAL-ADDRESS ADD-RELAY-INFO 0 relay-vlan100 vlan100 172.16.0.10 192.168.100.1 yes 1 relay-vlan200 vlan200 172.16.0.10 192.168.200.1 yes
Проверка на DHCP-сервере
[admin@MikroTik] ># Просмотр lease (выданных адресов) /ip/dhcp-server/lease/print # Подробный вывод с Option 82 /ip/dhcp-server/lease/print detail # Фильтр по подсети /ip/dhcp-server/lease/print where address~"10.101"
В поле agent-circuit-id и agent-remote-id отображается информация Option 82.
Проверка связности
[admin@MikroTik] ># Ping от клиента до gateway /ping address=192.168.100.1 # Ping от BRAS до DHCP-сервера /ping address=172.16.0.10 # Проверка маршрута от DHCP-сервера обратно /tool/traceroute address=192.168.100.10
Проверка через Packet Sniffer
Если relay не работает, поможет захват пакетов:
[admin@MikroTik] ># Захват DHCP-пакетов на интерфейсе relay /tool/sniffer/set filter-port=67-68 filter-interface=vlan100 \ file-name=dhcp-capture memory-limit=1000KiB /tool/sniffer/start # ... подождать, пока клиент запросит IP ... /tool/sniffer/stop # Просмотр захваченных пакетов /tool/sniffer/packet/print detail
Проверка DHCP Snooping
[admin@MikroTik] ># Таблица DHCP Snooping /interface/bridge/host/print where dhcp-snooping=yes # Логи DHCP Snooping /log/print where topics~"dhcp"
Типичные ошибки
Ошибка 1: Relay не пересылает запросы — нет IP на интерфейсе
Симптомы: клиенты не получают IP-адреса, relay не пересылает DHCP Discover.
Причина: на VLAN-интерфейсе, где настроен relay, не назначен IP-адрес. DHCP Relay не может подставить giaddr, если у интерфейса нет IP.
Решение: обязательно назначьте IP-адрес на каждом интерфейсе, где работает relay:
[admin@MikroTik] ># Проверяем наличие IP /ip/address/print where interface=vlan100 # Если нет — добавляем /ip/address/add address=192.168.100.1/24 interface=vlan100
Ошибка 2: local-address не совпадает с IP интерфейса
Симптомы: relay пересылает запрос, но DHCP-сервер отвечает не на тот адрес, клиент не получает ответ.
Причина: параметр local-address в настройках relay должен совпадать с IP-адресом маршрутизатора на этом VLAN-интерфейсе.
[admin@MikroTik] ># Проверяем /ip/dhcp-relay/print detail /ip/address/print where interface=vlan100 # local-address и address на интерфейсе должны совпадать
Ошибка 3: DHCP-сервер не знает подсеть relay
Симптомы: relay пересылает запрос, DHCP-сервер получает его, но не может определить подсеть клиента.
Причина: на DHCP-сервере не настроена network/pool для подсети, из которой приходит relay (giaddr). Сервер не знает, из какого пула выдать IP.
Решение: на DHCP-сервере должны быть настроены pool и network для каждой подсети, обслуживаемой relay:
[admin@MikroTik] ># На DHCP-сервере /ip/dhcp-server/network/add address=192.168.100.0/24 gateway=192.168.100.1 /ip/pool/add name=pool-vlan100 ranges=192.168.100.10-192.168.100.254
Ошибка 4: Option 82 не добавляется
Симптомы: в lease на DHCP-сервере нет информации agent-circuit-id / agent-remote-id.
Причина: забыли включить add-relay-info=yes в настройках relay.
[admin@MikroTik] ># Проверяем /ip/dhcp-relay/print detail where name=relay-vlan100 # Включаем Option 82 /ip/dhcp-relay/set relay-vlan100 add-relay-info=yes
Ошибка 5: Firewall блокирует DHCP-пакеты
Симптомы: relay настроен правильно, IP есть, но запросы не доходят до DHCP-сервера.
Причина: правила firewall блокируют UDP-порты 67/68 или трафик между relay и DHCP-сервером.
Решение:
[admin@MikroTik] ># Разрешаем DHCP-трафик /ip/firewall/filter/add chain=forward protocol=udp dst-port=67,68 action=accept \ comment="Allow DHCP relay traffic" place-before=0 # Разрешаем трафик между relay и DHCP-сервером /ip/firewall/filter/add chain=input protocol=udp dst-port=67 action=accept \ comment="Allow DHCP to router" place-before=0
Ошибка 6: giaddr = 0.0.0.0
Симптомы: DHCP-сервер получает relay-запросы с giaddr=0.0.0.0, не может определить подсеть.
Причина: relay настроен на bridge-интерфейсе, у которого нет IP-адреса, или IP назначен на неправильном интерфейсе.
Решение: relay должен быть настроен на VLAN-интерфейсе (а не на bridge), и у этого VLAN-интерфейса должен быть IP-адрес. local-address должен быть указан явно.
Ошибка 7: Дублирование — и DHCP Server, и DHCP Relay на одном интерфейсе
Симптомы: непредсказуемое поведение, клиенты получают адреса то от локального сервера, то от удалённого.
Причина: на одном интерфейсе нельзя одновременно включить DHCP Server и DHCP Relay. Это конфликтующие функции.
Решение: используйте либо Server, либо Relay на каждом конкретном интерфейсе. Не оба.
[admin@MikroTik] ># Проверяем наличие конфликта /ip/dhcp-server/print where interface=vlan100 /ip/dhcp-relay/print where interface=vlan100 # Должен быть только один из двух
Итоги
DHCP Relay + Option 82 — стандартное решение для централизованного управления IP-адресами в сетях с множеством VLAN. Ключевые правила:
- На каждом интерфейсе relay обязателен IP-адрес (он становится giaddr)
local-addressдолжен совпадать с IP интерфейсаadd-relay-info=yesвключает Option 82- На DHCP-сервере должны быть network/pool для каждой подсети relay
- Не используйте DHCP Server и DHCP Relay на одном интерфейсе
- Включите DHCP Snooping на коммутаторах доступа для защиты
- Для ISP с 10+ VLAN — DHCP Relay однозначно лучше, чем Server per VLAN
Абонент (VLAN 100) Абонент (VLAN 200)
| |
[DHCP Discover broadcast] [DHCP Discover broadcast]
| |
[MikroTik: DHCP Relay] [MikroTik: DHCP Relay]
| |
+---------> [DHCP Server] <-----------+
(unicast)
Один сервер для всех VLAN
[DHCP Server: 172.16.0.10]
|
[MikroTik Router]
/ \
[VLAN 100] [VLAN 200]
192.168.100.0/24 192.168.200.0/24
# --- VLAN-интерфейсы ---
/interface/vlan/add name=vlan100 vlan-id=100 interface=bridge
/interface/vlan/add name=vlan200 vlan-id=200 interface=bridge
# --- IP-адреса (будут использоваться как giaddr) ---
/ip/address/add address=192.168.100.1/24 interface=vlan100 comment="VLAN 100 gateway"
/ip/address/add address=192.168.200.1/24 interface=vlan200 comment="VLAN 200 gateway"
# --- DHCP Relay ---
/ip/dhcp-relay/add name=relay-vlan100 interface=vlan100 \
dhcp-server=172.16.0.10 local-address=192.168.100.1 \
disabled=no comment="Relay for VLAN 100"
/ip/dhcp-relay/add name=relay-vlan200 interface=vlan200 \
dhcp-server=172.16.0.10 local-address=192.168.200.1 \
disabled=no comment="Relay for VLAN 200"
# Если DHCP-сервер тоже MikroTik:
# Пулы для каждой подсети
/ip/pool/add name=pool-vlan100 ranges=192.168.100.10-192.168.100.254
/ip/pool/add name=pool-vlan200 ranges=192.168.200.10-192.168.200.254
# DHCP-сервер на интерфейсе, куда приходит relay
/ip/dhcp-server/add name=dhcp-central interface=ether1 address-pool=pool-vlan100 \
relay=192.168.100.1 disabled=no comment="Central DHCP for VLAN 100"
/ip/dhcp-server/add name=dhcp-central-200 interface=ether1 address-pool=pool-vlan200 \
relay=192.168.200.1 disabled=no comment="Central DHCP for VLAN 200"
# Сети (network) для каждого пула
/ip/dhcp-server/network/add address=192.168.100.0/24 gateway=192.168.100.1 \
dns-server=8.8.8.8,8.8.4.4
/ip/dhcp-server/network/add address=192.168.200.0/24 gateway=192.168.200.1 \
dns-server=8.8.8.8,8.8.4.4
# --- DHCP Relay с Option 82 ---
/ip/dhcp-relay/add name=relay-vlan100 interface=vlan100 \
dhcp-server=172.16.0.10 local-address=192.168.100.1 \
add-relay-info=yes \
disabled=no comment="Relay VLAN 100 with Option 82"
/ip/dhcp-relay/add name=relay-vlan200 interface=vlan200 \
dhcp-server=172.16.0.10 local-address=192.168.200.1 \
add-relay-info=yes \
disabled=no comment="Relay VLAN 200 with Option 82"
[DHCP Server + Billing]
|
[CCR2004 — BRAS/Router]
|
[CRS326 — Aggregation]
/ \
[CSS326 #1] [CSS326 #2] — Access switches
VLAN 101 VLAN 102
| |
Абоненты Абоненты
# CSS326 — коммутатор доступа, дом 1
/system/identity/set name="ACC-HOUSE-01"
/interface/bridge/add name=bridge vlan-filtering=yes
# Uplink (trunk)
/interface/bridge/port/add bridge=bridge interface=sfp-sfpplus1 \
pvid=1 frame-types=admit-only-vlan-tagged
# Абонентские порты (access VLAN 101)
/interface/bridge/port/add bridge=bridge interface=ether1 pvid=101
/interface/bridge/port/add bridge=bridge interface=ether2 pvid=101
/interface/bridge/port/add bridge=bridge interface=ether3 pvid=101
# VLAN table
/interface/bridge/vlan/add bridge=bridge vlan-ids=101 \
tagged=sfp-sfpplus1 \
untagged=ether1,ether2,ether3
# ============================================
# ISP DHCP Relay с Option 82
# ============================================
# --- VLAN-интерфейсы ---
/interface/vlan/add name=vlan101-house1 vlan-id=101 interface=sfp-sfpplus2
/interface/vlan/add name=vlan102-house2 vlan-id=102 interface=sfp-sfpplus2
# --- IP-адреса (giaddr) ---
/ip/address/add address=10.101.0.1/24 interface=vlan101-house1
/ip/address/add address=10.102.0.1/24 interface=vlan102-house2
# --- DHCP Relay с Option 82 ---
/ip/dhcp-relay/add name=relay-house1 interface=vlan101-house1 \
dhcp-server=172.16.0.10 local-address=10.101.0.1 \
add-relay-info=yes \
disabled=no comment="House 1 relay with Option 82"
/ip/dhcp-relay/add name=relay-house2 interface=vlan102-house2 \
dhcp-server=172.16.0.10 local-address=10.102.0.1 \
add-relay-info=yes \
disabled=no comment="House 2 relay with Option 82"
# Пулы адресов
/ip/pool/add name=pool-house1 ranges=10.101.0.10-10.101.0.254
/ip/pool/add name=pool-house2 ranges=10.102.0.10-10.102.0.254
# DHCP-серверы
/ip/dhcp-server/add name=dhcp-house1 interface=ether1 address-pool=pool-house1 \
relay=10.101.0.1 disabled=no
/ip/dhcp-server/add name=dhcp-house2 interface=ether1 address-pool=pool-house2 \
relay=10.102.0.1 disabled=no
# Сети
/ip/dhcp-server/network/add address=10.101.0.0/24 gateway=10.101.0.1 \
dns-server=8.8.8.8,8.8.4.4
/ip/dhcp-server/network/add address=10.102.0.0/24 gateway=10.102.0.1 \
dns-server=8.8.8.8,8.8.4.4
# Статические привязки по Circuit ID (Option 82)
# Формат Circuit ID зависит от версии RouterOS и оборудования
# Пример: привязка порта ether1 коммутатора house1 к конкретному IP
/ip/dhcp-server/lease/add address=10.101.0.100 \
dhcp-option-set="" \
comment="House 1, port 1 — subscriber Ivanov"
# Скрипт создания DHCP Relay для VLAN 101-150
:for i from=101 to=150 do={
/interface/vlan/add name="vlan$i" vlan-id=$i interface=sfp-sfpplus2
/ip/address/add address="10.$i.0.1/24" interface="vlan$i"
/ip/dhcp-relay/add name="relay-vlan$i" interface="vlan$i" \
dhcp-server=172.16.0.10 local-address="10.$i.0.1" \
add-relay-info=yes disabled=no
}
# Просмотр текущих настроек relay
/ip/dhcp-relay/print detail
# По умолчанию Circuit ID содержит:
# - Interface name (имя интерфейса, где получен запрос)
# - VLAN ID (если запрос пришёл из VLAN)
# /etc/dhcp/dhcpd.conf
# Логирование Option 82
if exists agent.circuit-id {
log(info, concat("Option 82 Circuit-ID: ",
binary-to-ascii(16, 8, ":", option agent.circuit-id)));
}
if exists agent.remote-id {
log(info, concat("Option 82 Remote-ID: ",
binary-to-ascii(16, 8, ":", option agent.remote-id)));
}
# Класс для привязки по Circuit ID
class "house1-port1" {
match if option agent.circuit-id = "vlan101-ether1";
}
pool {
allow members of "house1-port1";
range 10.101.0.100 10.101.0.100;
}
# На коммутаторе доступа (CRS/CSS):
# Включаем DHCP Snooping
/interface/bridge/set bridge dhcp-snooping=yes
# Trusted port — uplink (к BRAS/relay)
/interface/bridge/port/set [find interface=sfp-sfpplus1] trusted=yes
# Абонентские порты — untrusted (по умолчанию)
# DHCP-ответы от абонентских портов будут заблокированы
# Статус relay
/ip/dhcp-relay/print
# Подробная информация
/ip/dhcp-relay/print detail
# Статистика (сколько запросов переслано)
/ip/dhcp-relay/print stats
Flags: X - disabled
# NAME INTERFACE DHCP-SERVER LOCAL-ADDRESS ADD-RELAY-INFO
0 relay-vlan100 vlan100 172.16.0.10 192.168.100.1 yes
1 relay-vlan200 vlan200 172.16.0.10 192.168.200.1 yes
# Просмотр lease (выданных адресов)
/ip/dhcp-server/lease/print
# Подробный вывод с Option 82
/ip/dhcp-server/lease/print detail
# Фильтр по подсети
/ip/dhcp-server/lease/print where address~"10.101"
# Ping от клиента до gateway
/ping address=192.168.100.1
# Ping от BRAS до DHCP-сервера
/ping address=172.16.0.10
# Проверка маршрута от DHCP-сервера обратно
/tool/traceroute address=192.168.100.10
# Захват DHCP-пакетов на интерфейсе relay
/tool/sniffer/set filter-port=67-68 filter-interface=vlan100 \
file-name=dhcp-capture memory-limit=1000KiB
/tool/sniffer/start
# ... подождать, пока клиент запросит IP ...
/tool/sniffer/stop
# Просмотр захваченных пакетов
/tool/sniffer/packet/print detail
# Таблица DHCP Snooping
/interface/bridge/host/print where dhcp-snooping=yes
# Логи DHCP Snooping
/log/print where topics~"dhcp"
# Проверяем наличие IP
/ip/address/print where interface=vlan100
# Если нет — добавляем
/ip/address/add address=192.168.100.1/24 interface=vlan100
# Проверяем
/ip/dhcp-relay/print detail
/ip/address/print where interface=vlan100
# local-address и address на интерфейсе должны совпадать
# На DHCP-сервере
/ip/dhcp-server/network/add address=192.168.100.0/24 gateway=192.168.100.1
/ip/pool/add name=pool-vlan100 ranges=192.168.100.10-192.168.100.254
# Проверяем
/ip/dhcp-relay/print detail where name=relay-vlan100
# Включаем Option 82
/ip/dhcp-relay/set relay-vlan100 add-relay-info=yes
# Разрешаем DHCP-трафик
/ip/firewall/filter/add chain=forward protocol=udp dst-port=67,68 action=accept \
comment="Allow DHCP relay traffic" place-before=0
# Разрешаем трафик между relay и DHCP-сервером
/ip/firewall/filter/add chain=input protocol=udp dst-port=67 action=accept \
comment="Allow DHCP to router" place-before=0
# Проверяем наличие конфликта
/ip/dhcp-server/print where interface=vlan100
/ip/dhcp-relay/print where interface=vlan100
# Должен быть только один из двух