# DHCP Server

> DHCP сервер на VyOS - автоматическая выдача IP-адресов, статические резервирования, DHCP опции, PXE boot и high availability

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


VyOS использует Kea DHCP Server (начиная с версии 1.5.x) для предоставления DHCPv4 и DHCPv6 сервисов.

## Важное изменение в VyOS 1.5.x

VyOS 1.5 перешел с ISC DHCP на Kea DHCP. Основные изменения:

**ISC DHCP (VyOS 1.4):**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping host1 mac-address '00:50:56:00:00:01'
```

**Kea DHCP (VyOS 1.5):**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping host1 mac '00:50:56:00:00:01'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping host1 ip-address '192.168.1.10'
```

Ключевые отличия:
- `mac-address` → `mac`
- Требуется указание `ip-address` или `hostname` для статических маппингов

## IPv4 DHCP Server

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

Минимальная конфигурация DHCP сервера:

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option default-router '192.168.1.1'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server '192.168.1.1'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 start '192.168.1.100'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 stop '192.168.1.200'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 subnet-id 1
```

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

```
service dhcp-server
  └── shared-network-name <name>
      ├── authoritative
      ├── subnet <prefix>
      │   ├── subnet-id <id>
      │   ├── option
      │   │   ├── default-router <ip>
      │   │   ├── name-server <ip>
      │   │   ├── domain-name <domain>
      │   │   └── ...
      │   ├── range <id>
      │   │   ├── start <ip>
      │   │   └── stop <ip>
      │   ├── static-mapping <name>
      │   │   ├── mac <mac-address>
      │   │   ├── ip-address <ip>
      │   │   └── hostname <name>
      │   ├── lease <seconds>
      │   └── exclude <ip>
      └── ...
```

### Shared Network

Shared network группирует несколько подсетей, которые находятся в одном физическом сегменте:

```
set service dhcp-server shared-network-name OFFICE subnet 192.168.1.0/24 subnet-id 1
set service dhcp-server shared-network-name OFFICE subnet 192.168.2.0/24 subnet-id 2
```

Параметр `authoritative` указывает, что сервер является авторитетным для этой сети:
```
set service dhcp-server shared-network-name LAN authoritative
```

### Subnet Parameters

#### Subnet ID

Уникальный идентификатор подсети (обязательный параметр в Kea):
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 subnet-id 1
```

#### Default Router (Gateway)

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option default-router '192.168.1.1'
```

#### DNS Servers

Один DNS сервер:
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server '192.168.1.1'
```

Множественные DNS серверы:
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server '192.168.1.1'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server '8.8.8.8'
```

#### Domain Name

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option domain-name 'example.local'
```

#### Domain Search

Список доменов для поиска:
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option domain-search 'example.local'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option domain-search 'example.com'
```

#### Lease Time

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 lease 86400
```

Значение в секундах. По умолчанию: 86400 (24 часа).

#### NTP Servers

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option ntp-server '192.168.1.1'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option ntp-server '0.pool.ntp.org'
```

### Address Ranges

Динамические диапазоны IP-адресов для автоматического назначения:

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 start '192.168.1.100'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 stop '192.168.1.200'
```

Множественные диапазоны:
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 start '192.168.1.100'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 stop '192.168.1.150'

set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 1 start '192.168.1.200'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 1 stop '192.168.1.250'
```

### Excluded Addresses

Исключение адресов из распределения:

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 exclude 192.168.1.1
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 exclude 192.168.1.2
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 exclude 192.168.1.3
```

### Static Mappings

Статические привязки MAC-адресов к IP-адресам.

**Базовый static mapping:**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 mac '00:50:56:00:00:01'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 ip-address '192.168.1.10'
```

**С hostname:**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 mac '00:50:56:00:00:01'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 hostname 'server1.example.local'
```

**С описанием:**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 mac '00:50:56:00:00:01'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 ip-address '192.168.1.10'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 description 'Production Web Server'
```

**Отключение static mapping:**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping server1 disable
```

### DHCP Options

#### Bootfile Name (для PXE)

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option bootfile-name 'pxelinux.0'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option bootfile-server '192.168.1.5'
```

#### TFTP Server

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option tftp-server-name '192.168.1.5'
```

#### WPAD URL

Web Proxy Auto-Discovery:
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option wpad-url 'http://wpad.example.local/wpad.dat'
```

#### Vendor Options

```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 vendor-option cisco option 150 value '192.168.1.5'
```

## DHCPv6 Server

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

```
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/64 subnet-id 1
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/64 address-range start 2001:db8::100 stop 2001:db8::200
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/64 option name-server 2001:db8::1
```

### Prefix Delegation

DHCPv6 Prefix Delegation для выдачи префиксов клиентам:

```
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/48 subnet-id 1
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/48 prefix-delegation prefix 2001:db8:1000::/52 delegated-length 56
```

### Static Mappings для DHCPv6

```
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/64 static-mapping server1 identifier '00:01:00:01:12:34:56:78:9a:bc:de:f0:12:34'
set service dhcp-server shared-network-name LANv6 subnet 2001:db8::/64 static-mapping server1 ipv6-address '2001:db8::100'
```

## Dynamic DNS (DDNS) Integration

Автоматическое обновление DNS записей при выдаче DHCP адресов:

```
set service dhcp-server dynamic-dns-update enable
set service dhcp-server dynamic-dns-update server ddns.example.local zone example.local
set service dhcp-server dynamic-dns-update server ddns.example.local key keyname
```

## High Availability

### Active-Active Mode

```
set service dhcp-server high-availability mode active-active
set service dhcp-server high-availability peer-address '192.168.1.2'
set service dhcp-server high-availability source-address '192.168.1.1'
set service dhcp-server high-availability name 'dhcp-ha-pair'
```

### Active-Passive Mode

```
set service dhcp-server high-availability mode active-passive
set service dhcp-server high-availability peer-address '192.168.1.2'
set service dhcp-server high-availability source-address '192.168.1.1'
set service dhcp-server high-availability name 'dhcp-ha-pair'
```

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

### Домашняя сеть

```
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 option default-router '192.168.1.1'
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 option name-server '192.168.1.1'
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 option domain-name 'home.local'
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 range 0 start '192.168.1.100'
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 range 0 stop '192.168.1.200'
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 subnet-id 1
set service dhcp-server shared-network-name HOME subnet 192.168.1.0/24 lease 86400
```

### Корпоративная сеть с VLAN

```
# VLAN 10 - Management
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 option default-router '192.168.10.1'
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 option name-server '192.168.10.1'
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 option domain-name 'mgmt.corp.local'
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 range 0 start '192.168.10.100'
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 range 0 stop '192.168.10.200'
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 subnet-id 10
set service dhcp-server shared-network-name MGMT subnet 192.168.10.0/24 lease 3600

# VLAN 20 - Workstations
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 option default-router '192.168.20.1'
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 option name-server '192.168.20.1'
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 option domain-name 'corp.local'
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 range 0 start '192.168.20.50'
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 range 0 stop '192.168.20.250'
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 subnet-id 20
set service dhcp-server shared-network-name WORK subnet 192.168.20.0/24 lease 43200
```

### Серверы со статическими адресами

```
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 option default-router '192.168.100.1'
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 option name-server '192.168.100.1'
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 subnet-id 100

# Web Server
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 static-mapping web1 mac '00:50:56:00:01:01'
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 static-mapping web1 ip-address '192.168.100.10'
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 static-mapping web1 hostname 'web1.corp.local'

# Database Server
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 static-mapping db1 mac '00:50:56:00:01:02'
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 static-mapping db1 ip-address '192.168.100.20'
set service dhcp-server shared-network-name SERVERS subnet 192.168.100.0/24 static-mapping db1 hostname 'db1.corp.local'
```

### PXE Boot сервер

```
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 option default-router '192.168.50.1'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 option name-server '192.168.50.1'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 option bootfile-name 'pxelinux.0'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 option bootfile-server '192.168.50.5'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 option tftp-server-name '192.168.50.5'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 range 0 start '192.168.50.100'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 range 0 stop '192.168.50.200'
set service dhcp-server shared-network-name PXE subnet 192.168.50.0/24 subnet-id 50
```

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

### Просмотр аренд (leases)

Все активные аренды:
```
show dhcp server leases
```

Аренды конкретной подсети:
```
show dhcp server leases subnet 192.168.1.0/24
```

Конкретный адрес:
```
show dhcp server leases address 192.168.1.100
```

### Статистика

```
show dhcp server statistics
```

### Перезапуск сервера

```
restart dhcp server
```

### Логи

Просмотр логов:
```
show log dhcp
monitor log | grep dhcp
```

## Файлы конфигурации и данных

### VyOS 1.5.x (Kea DHCP)

- Конфигурация: генерируется из VyOS CLI
- Leases файл: `/config/dhcp4.leases`
- Логи: `/var/log/kea/kea-dhcp4.log`

### VyOS 1.4.x (ISC DHCP) - для справки

- Конфигурация: `/run/dhcp-server/dhcpd.conf`
- Leases файл: `/var/lib/dhcp/dhcpd.leases`

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

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

Проверьте статус сервиса:
```
show service dhcp-server
```

Проверьте конфигурацию:
```
show service dhcp-server shared-network-name LAN
```

Мониторинг в реальном времени:
```
monitor log | grep dhcp
```

Перезапустите сервис:
```
restart dhcp server
```

### Static mapping не работает

Убедитесь, что указаны обязательные параметры:
- `mac` (MAC-адрес)
- `ip-address` или `hostname`

Проверьте правильность MAC-адреса:
```
show service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping
```

### Конфликты адресов

Проверьте exclude и static mappings:
```
show service dhcp-server shared-network-name LAN subnet 192.168.1.0/24
```

Очистите старые аренды (осторожно!):
```
restart dhcp server
```

### DHCP Relay проблемы

Если DHCP сервер на другом сегменте, настройте DHCP relay на интерфейсе:
```
set service dhcp-relay interface eth0
set service dhcp-relay server 192.168.1.1
```

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

1. **Планирование адресов** - резервируйте диапазоны для статических адресов
2. **Используйте exclude** - для серверов и сетевого оборудования
3. **Документируйте static mappings** - используйте описания
4. **Настройте lease time** - короткие для гостевых сетей, длинные для стабильных
5. **Резервное копирование** - сохраняйте конфигурацию регулярно
6. **Мониторинг** - следите за использованием адресов
7. **High Availability** - для критичных сетей настройте HA
8. **Логирование** - регулярно проверяйте логи на ошибки

## Миграция с VyOS 1.4 на 1.5

При миграции обновите static mappings:

**Старый формат (1.4):**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping host1 mac-address '00:50:56:00:00:01'
```

**Новый формат (1.5):**
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping host1 mac '00:50:56:00:00:01'
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 static-mapping host1 ip-address '192.168.1.10'
```

Используйте скрипт для массовой конвертации если у вас много статических маппингов.

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

- [DNS Forwarding](/docs/vyos/services/vyos-dns/) - интеграция с DNS
- [Dynamic DNS](/docs/vyos/services/vyos-ddns/) - автоматическое обновление DNS записей
- [High Availability](/docs/vyos/ha/) - отказоустойчивость DHCP

