# DHCPv6 Server в VyOS

> DHCPv6 сервер в VyOS - автоматическая раздача IPv6-адресов, Prefix Delegation, DUID, статические привязки и интеграция с SLAAC

Source: https://opennix.org/docs/vyos/services/vyos-dhcpv6/



DHCPv6 (Dynamic Host Configuration Protocol for IPv6) - это протокол автоматической конфигурации IPv6-адресов и параметров сети для клиентов. VyOS предоставляет полнофункциональный DHCPv6-сервер для централизованного управления IPv6-адресацией в сети.

## Обзор

DHCPv6 используется для:

- **Автоматическое назначение IPv6 адресов**: Централизованное управление адресацией
- **Конфигурация параметров**: DNS-серверы, домен поиска, NTP-серверы
- **Статические резервирования**: Фиксированные адреса для серверов и оборудования
- **Prefix delegation**: Делегирование префиксов для роутеров (DHCPv6-PD)
- **Интеграция с SLAAC**: Работа совместно с Router Advertisement

### DHCPv6 vs SLAAC

| Характеристика | DHCPv6 | SLAAC (Stateless) |
|----------------|--------|-------------------|
| Назначение адреса | Stateful (сервер контролирует) | Stateless (клиент генерирует) |
| DNS-серверы | Да | Через RDNSS (RA) |
| Домен поиска | Да | Через DNSSL (RA) |
| Централизованное управление | Да | Ограниченное |
| Статические резервирования | Да | Нет |
| Отслеживание клиентов | Да (lease tracking) | Нет |

**Режимы работы**:
- **Stateful DHCPv6**: Полное управление адресами (managed flag в RA)
- **Stateless DHCPv6**: Только параметры, адреса через SLAAC (other-config flag)
- **Гибридный**: SLAAC для адресов + DHCPv6 для параметров

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

### Простой DHCPv6 сервер

```bash
# Shared network для DHCPv6
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::200

# DNS-серверы
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8844

# Домен поиска
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 domain-search example.com

# Применить на интерфейс
set service dhcpv6-server shared-network-name LAN interface eth1

commit
save
```

### Router Advertisement для managed режима

DHCPv6 требует Router Advertisement для информирования клиентов:

```bash
# Router Advertisement на интерфейсе
set service router-advert interface eth1 prefix 2001:db8:1::/64

# Managed flag (клиенты используют DHCPv6 для адресов)
set service router-advert interface eth1 managed-flag

# Other-config flag (клиенты используют DHCPv6 для параметров)
set service router-advert interface eth1 other-config-flag

commit
save
```

### Статическое резервирование (static mapping)

```bash
# Статическое резервирование по DUID
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping server1 identifier 00:01:00:01:12:34:56:78:ab:cd:ef:01:23:45
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping server1 ipv6-address 2001:db8:1::10

commit
save
```

**Примечание**: DHCPv6 использует DUID (DHCP Unique Identifier) вместо MAC-адреса.

## Расширенная конфигурация

### Stateless DHCPv6 (только параметры)

```bash
# DHCPv6 для параметров (без адресов)
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8844
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 domain-search example.com

# НЕ устанавливать address-range (клиенты получают адреса через SLAAC)

set service dhcpv6-server shared-network-name LAN interface eth1

# Router Advertisement без managed flag
set service router-advert interface eth1 prefix 2001:db8:1::/64
set service router-advert interface eth1 other-config-flag  # Только параметры

commit
save
```

### DHCPv6 Prefix Delegation (PD)

Prefix Delegation позволяет делегировать IPv6 префиксы downstream роутерам:

```bash
# Prefix delegation pool
set service dhcpv6-server shared-network-name LAN subnet 2001:db8::/48 prefix-delegation prefix 2001:db8:1000::/52 delegated-length 56

# Применить на интерфейс
set service dhcpv6-server shared-network-name LAN interface eth1

commit
save
```

Downstream роутер запросит /56 префикс из pool 2001:db8:1000::/52.

### Множественные shared networks

```bash
# LAN 1
set service dhcpv6-server shared-network-name LAN1 subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::200
set service dhcpv6-server shared-network-name LAN1 subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN1 interface eth1

# LAN 2
set service dhcpv6-server shared-network-name LAN2 subnet 2001:db8:2::/64 address-range start 2001:db8:2::100 stop 2001:db8:2::200
set service dhcpv6-server shared-network-name LAN2 subnet 2001:db8:2::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN2 interface eth2

commit
save
```

### Lease time configuration

```bash
# Настройка времени аренды
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 lease-time default 86400  # 24 часа
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 lease-time minimum 3600   # 1 час
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 lease-time maximum 172800 # 48 часов

commit
save
```

### NTP и SIP серверы

```bash
# NTP серверы через DHCPv6
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 nis-server 2001:db8:1::50

# SIP серверы (для VoIP)
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 sip-server-address 2001:db8:1::60

commit
save
```

### Vendor options

```bash
# Vendor-specific options
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 vendor-option cisco option 1 value 'option-value'

commit
save
```

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

### Пример 1: Базовый managed DHCPv6

```bash
# DHCPv6 сервер
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::200
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8844
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 domain-search example.com
set service dhcpv6-server shared-network-name LAN interface eth1

# Router Advertisement
set service router-advert interface eth1 prefix 2001:db8:1::/64
set service router-advert interface eth1 managed-flag
set service router-advert interface eth1 other-config-flag

# IPv6 на интерфейсе
set interfaces ethernet eth1 address 2001:db8:1::1/64

commit
save
```

### Пример 2: Stateless DHCPv6 + SLAAC

```bash
# DHCPv6 только для параметров (без адресов)
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 domain-search example.com
set service dhcpv6-server shared-network-name LAN interface eth1

# Router Advertisement для SLAAC (без managed flag)
set service router-advert interface eth1 prefix 2001:db8:1::/64
set service router-advert interface eth1 other-config-flag  # Только параметры через DHCPv6

# IPv6 на интерфейсе
set interfaces ethernet eth1 address 2001:db8:1::1/64

commit
save
```

### Пример 3: Статические резервирования для серверов

```bash
# DHCPv6 pool
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::200
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN interface eth1

# Статические резервирования
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping web-server identifier 00:01:00:01:aa:bb:cc:dd:11:22:33:44:55:66
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping web-server ipv6-address 2001:db8:1::10

set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping db-server identifier 00:01:00:01:aa:bb:cc:dd:77:88:99:aa:bb:cc
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping db-server ipv6-address 2001:db8:1::11

set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping dns-server identifier 00:01:00:01:aa:bb:cc:dd:dd:ee:ff:00:11:22
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping dns-server ipv6-address 2001:db8:1::53

# Router Advertisement
set service router-advert interface eth1 prefix 2001:db8:1::/64
set service router-advert interface eth1 managed-flag

commit
save
```

### Пример 4: DHCPv6 Prefix Delegation для филиалов

**Головной офис (делегирует префиксы)**:

```bash
# DHCPv6 с Prefix Delegation
set service dhcpv6-server shared-network-name WAN subnet 2001:db8::/48 prefix-delegation prefix 2001:db8:1000::/52 delegated-length 56
set service dhcpv6-server shared-network-name WAN interface eth0

# Router Advertisement на WAN
set service router-advert interface eth0 prefix 2001:db8::/64

# IPv6 на WAN интерфейсе
set interfaces ethernet eth0 address 2001:db8::1/64

commit
save
```

**Филиал (запрашивает prefix delegation)**:

```bash
# DHCPv6 client для получения префикса
set interfaces ethernet eth0 dhcpv6-options prefix-delegation interface eth1 address 1
set interfaces ethernet eth0 dhcpv6-options prefix-delegation interface eth1 sla-id 0

# Router Advertisement на LAN для клиентов
set service router-advert interface eth1 prefix ::/64  # Будет использован делегированный префикс

commit
save
```

### Пример 5: Множественные VLAN с DHCPv6

```bash
# VLAN 10 - Management
set interfaces ethernet eth1 vif 10 address 2001:db8:10::1/64
set service dhcpv6-server shared-network-name MGMT subnet 2001:db8:10::/64 address-range start 2001:db8:10::100 stop 2001:db8:10::150
set service dhcpv6-server shared-network-name MGMT subnet 2001:db8:10::/64 name-server 2001:db8:10::53
set service dhcpv6-server shared-network-name MGMT interface eth1.10

set service router-advert interface eth1.10 prefix 2001:db8:10::/64
set service router-advert interface eth1.10 managed-flag

# VLAN 20 - Users
set interfaces ethernet eth1 vif 20 address 2001:db8:20::1/64
set service dhcpv6-server shared-network-name USERS subnet 2001:db8:20::/64 address-range start 2001:db8:20::100 stop 2001:db8:20::500
set service dhcpv6-server shared-network-name USERS subnet 2001:db8:20::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name USERS interface eth1.20

set service router-advert interface eth1.20 prefix 2001:db8:20::/64
set service router-advert interface eth1.20 managed-flag

# VLAN 30 - Guest (stateless)
set interfaces ethernet eth1 vif 30 address 2001:db8:30::1/64
set service dhcpv6-server shared-network-name GUEST subnet 2001:db8:30::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name GUEST interface eth1.30

set service router-advert interface eth1.30 prefix 2001:db8:30::/64
set service router-advert interface eth1.30 other-config-flag  # Stateless

commit
save
```

### Пример 6: DHCPv6 с VRF

```bash
# VRF для изоляции
set vrf name CUSTOMER-A table 100

# Интерфейс в VRF
set interfaces ethernet eth1 vrf CUSTOMER-A
set interfaces ethernet eth1 address 2001:db8:100::1/64

# DHCPv6 в VRF
set service dhcpv6-server shared-network-name VRF-A subnet 2001:db8:100::/64 address-range start 2001:db8:100::100 stop 2001:db8:100::200
set service dhcpv6-server shared-network-name VRF-A subnet 2001:db8:100::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name VRF-A interface eth1

# Router Advertisement
set service router-advert interface eth1 prefix 2001:db8:100::/64
set service router-advert interface eth1 managed-flag

commit
save
```

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

### Просмотр active leases

```bash
# Показать все DHCPv6 leases
show dhcpv6 server leases

# Пример вывода:
# IPv6 address       DUID                                          State
# 2001:db8:1::100    00:01:00:01:12:34:56:78:aa:bb:cc:dd:ee:ff    active
```

### Просмотр статистики

```bash
# Статистика DHCPv6 сервера
show dhcpv6 server statistics

# Вывод включает:
# - Количество активных leases
# - Доступные адреса в pool
# - Использование pool (%)
```

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

```bash
# Показать конфигурацию DHCPv6
show configuration service dhcpv6-server

# Показать Router Advertisement
show configuration service router-advert
```

### Логи DHCPv6

```bash
# Логи DHCPv6 сервера
show log | match dhcpv6

# Real-time мониторинг
monitor log | match dhcpv6

# Детальные логи (если включен debug)
show log dhcp6
```

### Проверка DUID клиента

На клиенте (Linux):

```bash
# Просмотр DUID
cat /var/lib/dhcp/dhclient6.leases | grep ia-na

# Windows PowerShell
Get-NetIPConfiguration | Select-Object InterfaceAlias, IPv6Address

# macOS
ipconfig getv6packet en0
```

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

```bash
# Linux - запрос DHCPv6 адреса
sudo dhclient -6 -v eth0

# Просмотр полученного адреса
ip -6 addr show eth0

# Просмотр DNS через DHCPv6
cat /etc/resolv.conf
```

### Проверка Router Advertisement

```bash
# На роутере
show ipv6 route

# Отправка RA вручную (для теста)
sudo radvdump

# На клиенте (Linux)
ip -6 route show
```

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

### Проблема: Клиенты не получают IPv6 адреса

**Диагностика**:

```bash
# 1. Проверка DHCPv6 конфигурации
show configuration service dhcpv6-server

# 2. Проверка Router Advertisement
show configuration service router-advert

# 3. Проверка IPv6 forwarding
sysctl net.ipv6.conf.all.forwarding

# 4. Логи
show log | match dhcpv6

# 5. Проверка интерфейса
show interfaces ethernet eth1
```

**Решение**:

```bash
# Убедиться, что managed-flag установлен
set service router-advert interface eth1 managed-flag

# Проверить address-range
show configuration service dhcpv6-server shared-network-name LAN

# Перезапуск сервиса (если необходимо)
restart dhcpv6 server

commit
save
```

### Проблема: DHCPv6 работает, но нет DNS

**Причина**: DNS передается только через DHCPv6 или RDNSS в RA.

**Решение**:

```bash
# Добавить name-server в DHCPv6
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888

# Или использовать RDNSS в Router Advertisement
set service router-advert interface eth1 name-server 2001:4860:4860::8888

commit
save
```

### Проблема: Статическое резервирование не работает

**Причина**: Неправильный DUID.

**Диагностика**:

```bash
# Проверка DUID в логах
show log | match dhcpv6 | match DUID

# На клиенте (Linux)
cat /var/lib/dhcp/dhclient6.leases
```

**Решение**:

```bash
# Использовать правильный DUID из логов
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping server1 identifier <correct-duid>
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping server1 ipv6-address 2001:db8:1::10

commit
save

# Обновить lease на клиенте
# Linux: sudo dhclient -6 -r eth0 && sudo dhclient -6 eth0
```

### Проблема: Prefix Delegation не работает

**Диагностика**:

```bash
# На сервере - проверка PD конфигурации
show configuration service dhcpv6-server | match prefix-delegation

# На клиенте - проверка dhcpv6-options
show configuration interfaces ethernet eth0 dhcpv6-options

# Логи
show log | match "prefix delegation"
```

**Решение**:

```bash
# На сервере - убедиться, что PD настроен
set service dhcpv6-server shared-network-name WAN subnet 2001:db8::/48 prefix-delegation prefix 2001:db8:1000::/52 delegated-length 56

# На клиенте - настроить PD
set interfaces ethernet eth0 dhcpv6-options prefix-delegation interface eth1 address 1
set interfaces ethernet eth0 dhcpv6-options prefix-delegation interface eth1 sla-id 0

commit
save
```

### Проблема: DHCPv6 pool исчерпан

**Диагностика**:

```bash
# Проверка leases
show dhcpv6 server leases

# Статистика использования
show dhcpv6 server statistics
```

**Решение**:

```bash
# Расширить address-range
delete service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::500

# Или уменьшить lease time
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 lease-time default 3600  # 1 час

commit
save
```

### Проблема: Клиенты получают адреса через SLAAC вместо DHCPv6

**Причина**: Managed flag не установлен в RA.

**Решение**:

```bash
# Установить managed-flag
set service router-advert interface eth1 managed-flag

# Перезапуск RA
restart router-advert

commit
save

# На клиентах обновить конфигурацию
# Linux: sudo dhclient -6 -r eth0 && sudo dhclient -6 eth0
```

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

### 1. Выбор правильного режима

```bash
# Managed DHCPv6 - для полного контроля
set service router-advert interface eth1 managed-flag

# Stateless - для простоты (SLAAC + DHCPv6 параметры)
set service router-advert interface eth1 other-config-flag
```

### 2. Резервирование адресов для критичных сервисов

```bash
# Статические резервирования для серверов
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping critical-server identifier <duid>
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping critical-server ipv6-address 2001:db8:1::10
```

### 3. Правильный размер pool

Планируйте размер address-range с запасом:

```bash
# Для 100 клиентов - pool на 200-300 адресов
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::400
```

### 4. DNS конфигурация

Всегда настраивайте DNS-серверы:

```bash
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8888
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:4860:4860::8844
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 domain-search example.com
```

### 5. Мониторинг использования pool

Регулярно проверяйте использование:

```bash
show dhcpv6 server statistics
```

### 6. Lease time для различных сценариев

```bash
# Стабильная сеть - длинный lease time
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 lease-time default 86400  # 24 часа

# Guest network - короткий lease time
set service dhcpv6-server shared-network-name GUEST subnet 2001:db8:30::/64 lease-time default 3600  # 1 час
```

### 7. Документирование статических резервирований

Документируйте все static mappings:

```bash
# Комментарии в конфигурации
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 static-mapping web-server ipv6-address 2001:db8:1::10
# Web server - Apache, production
```

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

Используйте firewall для защиты DHCPv6:

```bash
set firewall ipv6 name LAN_LOCAL rule 100 action accept
set firewall ipv6 name LAN_LOCAL rule 100 protocol udp
set firewall ipv6 name LAN_LOCAL rule 100 destination port 546-547
```

### 9. Интеграция с DHCPv4

Поддерживайте dual-stack:

```bash
# DHCPv4
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 default-router 192.168.1.1

# DHCPv6
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 address-range start 2001:db8:1::100 stop 2001:db8:1::200
```

### 10. Логирование и мониторинг

Настройте логирование для аудита:

```bash
set system syslog file dhcpv6.log facility daemon level info
```

## Полезные команды

```bash
# Показать DHCPv6 leases
show dhcpv6 server leases

# Статистика
show dhcpv6 server statistics

# Конфигурация DHCPv6
show configuration service dhcpv6-server

# Конфигурация Router Advertisement
show configuration service router-advert

# Логи
show log | match dhcpv6
monitor log | match dhcpv6

# Restart DHCPv6 server
restart dhcpv6 server

# Restart Router Advertisement
restart router-advert

# Проверка IPv6 connectivity
ping 2001:db8:1::100

# IPv6 routing table
show ipv6 route

# Проверка интерфейсов
show interfaces
```

## Интеграция с другими функциями

### DHCPv6 + DNS Forwarding

```bash
# DHCPv6 указывает на локальный DNS
set service dhcpv6-server shared-network-name LAN subnet 2001:db8:1::/64 name-server 2001:db8:1::1

# DNS Forwarding на роутере
set service dns forwarding listen-address 2001:db8:1::1
set service dns forwarding name-server 2001:4860:4860::8888
```

### DHCPv6 + Firewall

```bash
# Разрешить DHCPv6 трафик
set firewall ipv6 name WAN_LOCAL rule 100 action accept
set firewall ipv6 name WAN_LOCAL rule 100 protocol udp
set firewall ipv6 name WAN_LOCAL rule 100 source port 547
set firewall ipv6 name WAN_LOCAL rule 100 destination port 546
```

### DHCPv6 + High Availability

В HA setup DHCPv6 pool должен быть разделен между роутерами или использовать failover (пока не поддерживается в VyOS напрямую).

## Заключение

DHCPv6 Server в VyOS предоставляет полнофункциональное управление IPv6 адресацией для современных сетей. Поддержка как stateful (managed), так и stateless режимов, prefix delegation, статических резервирований и интеграция с Router Advertisement делают VyOS мощной платформой для IPv6 развертывания.

Основные преимущества DHCPv6 в VyOS:
- Полный контроль над IPv6 адресацией
- Статические резервирования для критичных устройств
- Prefix Delegation для hierarchical networks
- Интеграция с SLAAC
- Централизованное управление параметрами (DNS, NTP)

Рекомендации для production:
- Выбирайте правильный режим (managed vs stateless)
- Планируйте размер pool с запасом
- Используйте статические резервирования для серверов
- Настраивайте DNS и domain-search
- Мониторьте использование pool
- Документируйте все резервирования
- Интегрируйте с dual-stack (IPv4 + IPv6)
- Применяйте firewall rules для защиты

DHCPv6 в VyOS обеспечивает enterprise-grade управление IPv6 инфраструктурой с гибкостью конфигурации и надежностью, необходимой для production environments.

