# DHCP Relay

> Настройка DHCP Relay на VyOS: ретрансляция DHCP запросов, DHCPv4 и DHCPv6 relay, multi-VLAN сети, централизованный DHCP сервер для Yandex Cloud и VK Cloud

Source: https://opennix.org/docs/vyos/services/vyos-dhcp-relay/


DHCP Relay (DHCP Relay Agent) позволяет маршрутизатору пересылать DHCP запросы от клиентов к удаленному DHCP серверу, расположенному в другом сегменте сети.

## Обзор

DHCP Relay решает проблему централизации DHCP сервисов в сетях с множественными подсетями. Вместо установки отдельного DHCP сервера в каждом VLAN или подсети, можно использовать один централизованный DHCP сервер и настроить DHCP relay на маршрутизаторе.

**Основные возможности:**
- Пересылка DHCP запросов между подсетями
- Поддержка DHCPv4 и DHCPv6
- Централизованное управление IP-адресами
- Работа с множественными upstream DHCP серверами
- Настройка hop count и max packet size
- Поддержка relay agent options

**Принцип работы:**

1. Клиент отправляет DHCP DISCOVER broadcast
2. VyOS relay agent перехватывает запрос
3. Relay конвертирует broadcast в unicast
4. Запрос пересылается на указанный DHCP сервер
5. Сервер отвечает relay agent
6. Relay пересылает ответ клиенту

## DHCPv4 Relay

### Базовая конфигурация

Минимальная конфигурация DHCPv4 relay:

```
set service dhcp-relay listen-interface eth1
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.1.4
commit
```

**Компоненты:**
- `listen-interface` - интерфейс, где слушать DHCP запросы от клиентов
- `upstream-interface` - интерфейс для пересылки запросов к серверу
- `server` - IP-адрес DHCP сервера

### Структура конфигурации

```
service dhcp-relay
  ├── listen-interface <interface>
  ├── upstream-interface <interface> [address <ip>]
  ├── server <server-ip>
  └── relay-options
      ├── hop-count <count>
      ├── max-size <bytes>
      ├── port <port>
      └── relay-agents-packets <action>
```

### Listen Interface

Интерфейсы, на которых relay agent слушает DHCP запросы от клиентов:

```
set service dhcp-relay listen-interface eth1
set service dhcp-relay listen-interface eth2
set service dhcp-relay listen-interface eth1.10
set service dhcp-relay listen-interface eth1.20
```

Можно указать несколько интерфейсов для обслуживания множественных VLAN.

### Upstream Interface

Интерфейс для пересылки DHCP запросов к серверу:

```
set service dhcp-relay upstream-interface eth0
```

С указанием конкретного адреса источника:
```
set service dhcp-relay upstream-interface eth0 address 10.0.0.1
```

Полезно когда у upstream интерфейса несколько IP-адресов и нужно указать конкретный для relay трафика.

### DHCP Server

Указание одного или нескольких DHCP серверов:

```
set service dhcp-relay server 10.0.1.4
```

Множественные серверы для избыточности:
```
set service dhcp-relay server 10.0.1.4
set service dhcp-relay server 10.0.1.5
set service dhcp-relay server 10.0.2.4
```

Запросы будут пересылаться на все указанные серверы. Первый ответивший сервер обслужит клиента.

### Relay Options

#### Hop Count

Максимальное количество relay агентов, через которые может пройти запрос:

```
set service dhcp-relay relay-options hop-count 10
```

По умолчанию: **10**

Предотвращает бесконечные петли relay в сложных сетях.

#### Max Size

Максимальный размер DHCP пакета в байтах:

```
set service dhcp-relay relay-options max-size 576
```

По умолчанию: **576** байт (минимальный размер согласно RFC 2131)

Увеличьте если используются большие DHCP опции:
```
set service dhcp-relay relay-options max-size 1500
```

#### Port

Порт для прослушивания DHCP запросов:

```
set service dhcp-relay relay-options port 67
```

По умолчанию: **67** (стандартный DHCP порт)

Изменяйте только если используете нестандартный DHCP сервер.

#### Relay Agents Packets

Обработка пакетов от других relay агентов:

```
set service dhcp-relay relay-options relay-agents-packets <action>
```

Значения:
- **append** - добавить свою relay информацию
- **replace** - заменить существующую relay информацию
- **forward** - пересылать без изменений
- **discard** - отбрасывать пакеты от других relay агентов

Рекомендуется:
```
set service dhcp-relay relay-options relay-agents-packets discard
```

Предотвращает relay loops и конфликты в сложных топологиях.

## DHCPv6 Relay

### Базовая конфигурация DHCPv6

DHCPv6 relay конфигурируется отдельно от DHCPv4:

```
set service dhcpv6-relay listen-interface eth1
set service dhcpv6-relay upstream-interface eth0 address 2001:db8::4
commit
```

**Отличия от DHCPv4:**
- Обязательно указание IPv6 адреса сервера в `upstream-interface`
- Использует UDP порты 547 (клиент) и 546 (сервер)
- Поддерживает multicast адреса

### Структура конфигурации DHCPv6

```
service dhcpv6-relay
  ├── listen-interface <interface>
  ├── upstream-interface <interface>
  │   └── address <ipv6-server>
  ├── max-hop-count <count>
  └── use-interface-id-option
```

### Listen Interface

Интерфейсы для прослушивания DHCPv6 запросов:

```
set service dhcpv6-relay listen-interface eth1
set service dhcpv6-relay listen-interface eth2
set service dhcpv6-relay listen-interface eth1.100
```

### Upstream Interface

Upstream интерфейс с адресом DHCPv6 сервера:

```
set service dhcpv6-relay upstream-interface eth0 address 2001:db8::4
```

Можно указать несколько upstream серверов:
```
set service dhcpv6-relay upstream-interface eth0 address 2001:db8::4
set service dhcpv6-relay upstream-interface eth0 address 2001:db8::5
```

### Max Hop Count

Максимальное количество хопов для DHCPv6:

```
set service dhcpv6-relay max-hop-count 10
```

По умолчанию: **10**

### Interface ID Option

Добавление Interface-ID опции (RFC 3315):

```
set service dhcpv6-relay use-interface-id-option
```

Помогает DHCPv6 серверу идентифицировать интерфейс, с которого пришел запрос.

## Примеры конфигурации

### Простая сеть с одним VLAN

Topology:
```
Clients (192.168.1.0/24) --- eth1 [VyOS] eth0 --- DHCP Server (10.0.0.4)
```

Конфигурация:
```
set service dhcp-relay listen-interface eth1
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.0.4
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

### Multi-VLAN с централизованным DHCP

Topology:
```
VLAN 10 (192.168.10.0/24) --- eth1.10
VLAN 20 (192.168.20.0/24) --- eth1.20  [VyOS] eth0 --- DHCP Server (10.0.1.4)
VLAN 30 (192.168.30.0/24) --- eth1.30
```

Конфигурация:
```
# DHCP Relay
set service dhcp-relay listen-interface eth1.10
set service dhcp-relay listen-interface eth1.20
set service dhcp-relay listen-interface eth1.30
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.1.4

# Relay options
set service dhcp-relay relay-options hop-count 10
set service dhcp-relay relay-options max-size 1500
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

На DHCP сервере (ISC DHCP или Kea) настройте подсети для каждого VLAN:

**Kea DHCP Server (VyOS 1.5):**
```
set service dhcp-server shared-network-name VLAN10 subnet 192.168.10.0/24 subnet-id 10
set service dhcp-server shared-network-name VLAN10 subnet 192.168.10.0/24 option default-router '192.168.10.1'
set service dhcp-server shared-network-name VLAN10 subnet 192.168.10.0/24 range 0 start '192.168.10.100'
set service dhcp-server shared-network-name VLAN10 subnet 192.168.10.0/24 range 0 stop '192.168.10.200'

set service dhcp-server shared-network-name VLAN20 subnet 192.168.20.0/24 subnet-id 20
set service dhcp-server shared-network-name VLAN20 subnet 192.168.20.0/24 option default-router '192.168.20.1'
set service dhcp-server shared-network-name VLAN20 subnet 192.168.20.0/24 range 0 start '192.168.20.100'
set service dhcp-server shared-network-name VLAN20 subnet 192.168.20.0/24 range 0 stop '192.168.20.200'

set service dhcp-server shared-network-name VLAN30 subnet 192.168.30.0/24 subnet-id 30
set service dhcp-server shared-network-name VLAN30 subnet 192.168.30.0/24 option default-router '192.168.30.1'
set service dhcp-server shared-network-name VLAN30 subnet 192.168.30.0/24 range 0 start '192.168.30.100'
set service dhcp-server shared-network-name VLAN30 subnet 192.168.30.0/24 range 0 stop '192.168.30.200'
```

### Множественные DHCP серверы (High Availability)

```
# Primary и secondary DHCP серверы
set service dhcp-relay listen-interface eth1
set service dhcp-relay listen-interface eth2
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.1.4
set service dhcp-relay server 10.0.1.5

# Relay options
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

### DHCPv4 и DHCPv6 Relay вместе

```
# DHCPv4 Relay
set service dhcp-relay listen-interface eth1
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.1.4
set service dhcp-relay relay-options relay-agents-packets discard

# DHCPv6 Relay
set service dhcpv6-relay listen-interface eth1
set service dhcpv6-relay upstream-interface eth0 address 2001:db8::4
set service dhcpv6-relay max-hop-count 10
set service dhcpv6-relay use-interface-id-option

commit
```

### Корпоративная сеть с отделами

```
# Management VLAN 10
set service dhcp-relay listen-interface eth1.10

# IT VLAN 20
set service dhcp-relay listen-interface eth1.20

# Finance VLAN 30
set service dhcp-relay listen-interface eth1.30

# Sales VLAN 40
set service dhcp-relay listen-interface eth1.40

# Upstream к корпоративному DHCP серверу
set service dhcp-relay upstream-interface eth0 address 10.0.0.1
set service dhcp-relay server 10.0.100.4
set service dhcp-relay server 10.0.100.5

# Options
set service dhcp-relay relay-options hop-count 5
set service dhcp-relay relay-options max-size 1500
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

### Yandex Cloud конфигурация

Centralized DHCP для множественных подсетей в Yandex Cloud:

```
# VPC подсети
set service dhcp-relay listen-interface eth1
set service dhcp-relay listen-interface eth2
set service dhcp-relay listen-interface eth3

# Upstream к DHCP серверу в management подсети
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.128.0.100

# Relay options
set service dhcp-relay relay-options hop-count 10
set service dhcp-relay relay-options max-size 1500
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

### VK Cloud конфигурация

Multi-tenant конфигурация с изолированными VLAN:

```
# Tenant A - VLAN 100
set service dhcp-relay listen-interface eth1.100

# Tenant B - VLAN 200
set service dhcp-relay listen-interface eth1.200

# Tenant C - VLAN 300
set service dhcp-relay listen-interface eth1.300

# Upstream
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.1.10
set service dhcp-relay server 10.0.1.11

# Options
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

## Операционные команды

### Просмотр статуса DHCPv4 Relay

```
show dhcp relay-agent
```

Показывает:
- Статус relay agent (running/stopped)
- Конфигурированные интерфейсы
- DHCP серверы
- Relay options

### Просмотр статуса DHCPv6 Relay

```
show dhcpv6 relay-agent
```

### Статистика DHCPv4 Relay

```
show dhcp relay-agent statistics
```

Показывает:
- Количество пересланных пакетов
- Количество полученных ответов
- Ошибки relay

### Статистика DHCPv6 Relay

```
show dhcpv6 relay-agent statistics
```

### Перезапуск DHCPv4 Relay

```
restart dhcp relay-agent
```

### Перезапуск DHCPv6 Relay

```
restart dhcpv6 relay-agent
```

### Мониторинг в реальном времени

```
monitor log | grep dhcp
```

### Тестирование с клиента

На клиентском хосте:

**Linux:**
```bash
sudo dhclient -v eth0
```

**Windows:**
```powershell
ipconfig /release
ipconfig /renew
```

## Мониторинг и диагностика

### Проверка конфигурации

```
show service dhcp-relay
show service dhcpv6-relay
```

### Просмотр логов

DHCPv4 relay:
```
show log | grep dhcrelay
```

DHCPv6 relay:
```
show log | grep dhcrelay6
```

Real-time мониторинг:
```
monitor log | match dhcp
```

### Packet capture

Захват DHCP трафика на listen интерфейсе:
```
monitor traffic interface eth1 filter 'port 67 or port 68'
```

Для DHCPv6:
```
monitor traffic interface eth1 filter 'port 546 or port 547'
```

### Проверка сетевой связности

Проверка доступности DHCP сервера с VyOS:
```
ping 10.0.1.4
```

Проверка маршрута:
```
show ip route 10.0.1.4
```

## Устранение неполадок

### Клиенты не получают адреса

**Проверка 1: Relay agent запущен**
```
show dhcp relay-agent
```

**Проверка 2: Правильность интерфейсов**
```
show service dhcp-relay
show interfaces
```

Убедитесь что:
- listen-interface соответствует клиентскому интерфейсу
- upstream-interface имеет маршрут к DHCP серверу

**Проверка 3: DHCP сервер доступен**
```
ping 10.0.1.4
traceroute 10.0.1.4
```

**Проверка 4: Firewall правила**

На VyOS проверьте input и forward правила:
```
show firewall ipv4 input filter
show firewall ipv4 forward filter
```

Разрешите DHCP трафик:
```
# Input для DHCP relay
set firewall ipv4 input filter rule 100 action accept
set firewall ipv4 input filter rule 100 protocol udp
set firewall ipv4 input filter rule 100 destination port 67
set firewall ipv4 input filter rule 100 source port 68

# Forward для DHCP пакетов
set firewall ipv4 forward filter rule 100 action accept
set firewall ipv4 forward filter rule 100 protocol udp
set firewall ipv4 forward filter rule 100 destination port 67-68

commit
```

**Проверка 5: Логи relay agent**
```
monitor log | grep dhcrelay
```

**Проверка 6: Packet capture**
```
# На listen интерфейсе
monitor traffic interface eth1 filter 'port 67 or port 68'

# На upstream интерфейсе
monitor traffic interface eth0 filter 'port 67 or port 68'
```

Должны видеть:
- DISCOVER от клиента на listen
- DISCOVER forwarded на upstream
- OFFER от сервера на upstream
- OFFER forwarded на listen

### Relay пересылает запросы, но клиенты не получают ответы

**Проблема:** DHCP сервер не знает маршрут обратно к клиентским подсетям.

**Решение:** На DHCP сервере добавьте статический маршрут или default gateway, указывающий на VyOS relay IP.

Например, на DHCP сервере:
```bash
# Linux
sudo ip route add 192.168.10.0/24 via 10.0.1.1
sudo ip route add 192.168.20.0/24 via 10.0.1.1
```

Где 10.0.1.1 - IP адрес VyOS на upstream интерфейсе.

### DHCPv6 relay не работает

**Проверка 1: Правильность IPv6 адреса сервера**
```
show service dhcpv6-relay
```

**Проверка 2: IPv6 connectivity**
```
ping6 2001:db8::4
```

**Проверка 3: Firewall IPv6 правила**
```
show firewall ipv6 input filter

# Разрешить DHCPv6
set firewall ipv6 input filter rule 100 action accept
set firewall ipv6 input filter rule 100 protocol udp
set firewall ipv6 input filter rule 100 destination port 547

set firewall ipv6 forward filter rule 100 action accept
set firewall ipv6 forward filter rule 100 protocol udp
set firewall ipv6 forward filter rule 100 destination port 546-547

commit
```

**Проверка 4: DHCPv6 логи**
```
monitor log | grep dhcrelay6
```

### Relay loops

**Симптомы:** Hop count достигает максимума, пакеты отбрасываются

**Причина:** Неправильная топология с петлями relay агентов

**Решение:**
```
# Установите правильный hop-count
set service dhcp-relay relay-options hop-count 5

# Отбрасывайте пакеты от других relay агентов
set service dhcp-relay relay-options relay-agents-packets discard

commit
```

Проверьте топологию сети на наличие петель relay.

### Большие DHCP опции усекаются

**Проблема:** PXE boot или vendor options не работают

**Решение:** Увеличьте max-size
```
set service dhcp-relay relay-options max-size 1500
commit
```

### Перезапуск не помогает

Проверьте системные ошибки:
```
show log | match error
show log | match dhcp
```

Перезагрузите VyOS:
```
reboot now
```

## Безопасность

### Ограничение интерфейсов

Указывайте только необходимые listen-interface:
```
# Правильно - только клиентские интерфейсы
set service dhcp-relay listen-interface eth1
set service dhcp-relay listen-interface eth2

# Неправильно - не указывайте WAN
# set service dhcp-relay listen-interface eth0
```

### Firewall правила

Разрешите DHCP только на необходимых интерфейсах:

```
# Input на клиентских интерфейсах
set firewall ipv4 input filter rule 100 action accept
set firewall ipv4 input filter rule 100 protocol udp
set firewall ipv4 input filter rule 100 destination port 67
set firewall ipv4 input filter rule 100 inbound-interface name eth1

# Forward для DHCP
set firewall ipv4 forward filter rule 100 action accept
set firewall ipv4 forward filter rule 100 protocol udp
set firewall ipv4 forward filter rule 100 destination port 67-68
set firewall ipv4 forward filter rule 100 inbound-interface name eth1

# Блокируйте DHCP на WAN
set firewall ipv4 input filter rule 90 action drop
set firewall ipv4 input filter rule 90 protocol udp
set firewall ipv4 input filter rule 90 destination port 67
set firewall ipv4 input filter rule 90 inbound-interface name eth0

commit
```

### Защита DHCP сервера

На DHCP сервере настройте firewall для приема запросов только от доверенных relay агентов:

```bash
# Linux iptables
sudo iptables -A INPUT -p udp --dport 67 -s 10.0.1.1 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 67 -j DROP
```

### Relay agent options защита

```
set service dhcp-relay relay-options relay-agents-packets discard
```

Предотвращает атаки через поддельные relay agent опции.

### Rate limiting

Ограничение DHCP запросов:
```
set firewall ipv4 input filter rule 100 limit rate 50/minute
```

## Лучшие практики

1. **Планирование интерфейсов** - четко разделяйте listen и upstream интерфейсы
2. **Резервирование серверов** - используйте минимум 2 DHCP сервера
3. **Hop count** - устанавливайте разумные значения (5-10)
4. **Max size** - увеличивайте для PXE и vendor опций (до 1500)
5. **Relay agents packets** - используйте discard для предотвращения петель
6. **Firewall** - ограничивайте DHCP трафик на необходимых интерфейсах
7. **Логирование** - регулярно проверяйте логи relay agent
8. **Мониторинг** - отслеживайте статистику relay
9. **Документация** - описывайте назначение каждого VLAN
10. **Тестирование** - проверяйте работу после каждого изменения

## Производительность

DHCP relay добавляет минимальную задержку:
- **Latency overhead**: 1-5ms
- **Throughput**: Ограничен только производительностью CPU и сети
- **Connections**: Поддерживает тысячи клиентов одновременно

Relay agent очень легковесен и не создает существенной нагрузки.

## Взаимодействие с другими сервисами

### DNS

DHCP сервер может обновлять DNS через Dynamic DNS:
```
# На DHCP сервере
set service dhcp-server dynamic-dns-update enable
```

### NTP

Включайте NTP опции на DHCP сервере для автоматической настройки времени:
```
set service dhcp-server shared-network-name LAN subnet 192.168.10.0/24 option ntp-server '192.168.10.1'
```

### NAT

При использовании NAT убедитесь, что DHCP трафик не NAT-ится:
```
# NAT exclude для DHCP
set nat source rule 100 outbound-interface name eth0
set nat source rule 100 source address 192.168.0.0/16
set nat source rule 100 destination address '!10.0.1.4'
set nat source rule 100 translation address masquerade
```

## Миграция с локального DHCP на relay

Пошаговая миграция:

**Шаг 1:** Настройте централизованный DHCP сервер со всеми подсетями

**Шаг 2:** Настройте DHCP relay на VyOS:
```
set service dhcp-relay listen-interface eth1
set service dhcp-relay upstream-interface eth0
set service dhcp-relay server 10.0.1.4
```

**Шаг 3:** Отключите локальный DHCP сервер:
```
delete service dhcp-server shared-network-name LAN
commit
```

**Шаг 4:** Активируйте relay:
```
commit
save
```

**Шаг 5:** Тестируйте работу:
```
# На клиенте
sudo dhclient -v eth0
```

**Шаг 6:** Мониторинг:
```
show dhcp relay-agent
monitor log | grep dhcp
```

## Альтернативные решения

### Когда НЕ использовать DHCP relay:

1. **Малые сети** - один VLAN, локальный DHCP проще
2. **Требования к latency** - критичные приложения, чувствительные к задержкам
3. **Изолированные сети** - полностью изолированные без связи с центральным сервером
4. **Failover недоступен** - если нет возможности резервировать централизованный сервер

### Альтернативы:

1. **Локальный DHCP** - на каждом маршрутизаторе/VLAN
2. **DHCP Failover** - пара DHCP серверов с синхронизацией
3. **DHCP Cluster** - кластер DHCP серверов (Kea HA)
4. **Cloud DHCP** - управляемые сервисы в облаках

## Следующие шаги

- [DHCP Server](/docs/vyos/services/vyos-dhcp/) - настройка локального DHCP сервера
- [DHCPv6 Server](/docs/vyos/services/vyos-dhcpv6/) - IPv6 DHCP сервер
- [DNS Forwarding](/docs/vyos/services/vyos-dns/) - интеграция с DNS
- [VLAN Configuration](/docs/vyos/interfaces/vyos-vlan/) - настройка VLAN интерфейсов
- [Firewall](/docs/vyos/firewall/) - защита DHCP сервисов

