# DNS Forwarding

> Настройка DNS forwarding на VyOS: кэширующий DNS resolver, upstream серверы, split-horizon DNS, DNSSEC, авторитативные зоны для Yandex Cloud и VK Cloud

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


VyOS использует PowerDNS Recursor для предоставления DNS forwarding сервиса - легковесной DNS инфраструктуры для небольших и средних сетей.

## Обзор

DNS Forwarding позволяет:
- Кэшировать DNS запросы для ускорения разрешения имен
- Перенаправлять запросы на upstream DNS серверы
- Обеспечивать split-horizon DNS (разные ответы для разных доменов)
- Функционировать как рекурсивный DNS сервер
- Хостить авторитативные DNS зоны

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

### Минимальная настройка

```
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
commit
```

Эта конфигурация:
- Слушает на адресе 192.168.1.1
- Принимает запросы от сети 192.168.1.0/24
- Использует DNS серверы системы для upstream

### Указание upstream DNS серверов

Явное указание DNS серверов:

```
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '8.8.4.4'
commit
```

### Использование системных DNS серверов

```
set service dns forwarding system
commit
```

Это использует DNS серверы, настроенные в системе (например, полученные через DHCP на WAN интерфейсе).

### Использование DNS от DHCP клиента

```
set service dns forwarding dhcp eth0
commit
```

DNS сервер будет использовать nameservers, полученные через DHCP на интерфейсе eth0.

## Listen Address

Адреса, на которых DNS сервер принимает запросы:

Один адрес:
```
set service dns forwarding listen-address '192.168.1.1'
```

Множественные адреса:
```
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding listen-address '192.168.2.1'
set service dns forwarding listen-address '::1'
```

Слушать на всех интерфейсах (не рекомендуется):
```
set service dns forwarding listen-address '0.0.0.0'
```

## Access Control

### Allow From

Разрешение запросов от конкретных сетей:

```
set service dns forwarding allow-from '192.168.1.0/24'
set service dns forwarding allow-from '192.168.2.0/24'
set service dns forwarding allow-from '10.0.0.0/8'
```

По умолчанию, если не указано, разрешены запросы только с localhost.

### Ignore Hosts File

Игнорирование локального файла /etc/hosts:

```
set service dns forwarding ignore-hosts-file
commit
```

## Domain-Specific Forwarding

Перенаправление запросов для конкретных доменов на специфичные DNS серверы.

### Базовый пример

Отправка запросов для домена example.com на корпоративный DNS:

```
set service dns forwarding domain example.com name-server '192.168.100.1'
commit
```

### Split-Horizon DNS

Различные DNS серверы для внутренних и внешних доменов:

```
# Внутренние домены на внутренний DNS
set service dns forwarding domain corp.local name-server '192.168.1.10'
set service dns forwarding domain internal.local name-server '192.168.1.10'

# Внешние запросы на публичные DNS
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '1.1.1.1'

commit
```

### Reverse DNS зоны

Перенаправление обратных DNS зон:

```
set service dns forwarding domain 1.168.192.in-addr.arpa name-server '192.168.1.10'
set service dns forwarding domain 2.168.192.in-addr.arpa name-server '192.168.2.10'
commit
```

### Рекурсивный поиск в подменах

Добавление опции `addNTA` для игнорирования DNSSEC:

```
set service dns forwarding domain example.com addnta
commit
```

## Кэширование

### Cache Size

Размер кэша DNS (количество записей):

```
set service dns forwarding cache-size 10000
commit
```

По умолчанию: 10000 записей.

Для высоконагруженных сетей:
```
set service dns forwarding cache-size 50000
commit
```

### Negative TTL

Время кэширования отрицательных ответов (NXDOMAIN):

```
set service dns forwarding negative-ttl 3600
commit
```

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

## DNSSEC

DNS Security Extensions для проверки подлинности DNS ответов.

### Режимы DNSSEC

```
set service dns forwarding dnssec <mode>
```

Доступные режимы:

- **off** - DNSSEC отключен (по умолчанию)
- **process-no-validate** - обрабатывать DNSSEC записи, но не валидировать
- **process** - обрабатывать и валидировать
- **log-fail** - логировать неудачи валидации
- **validate** - строгая валидация (отклонять невалидные ответы)

Рекомендуемая настройка:
```
set service dns forwarding dnssec validate
commit
```

## Authoritative Domains

Хостинг собственных DNS зон на VyOS.

### Создание зоны

```
set service dns forwarding authoritative-domain example.local
commit
```

### Добавление записей

#### A Record (IPv4)

```
set service dns forwarding authoritative-domain example.local records a server1 address '192.168.1.10'
set service dns forwarding authoritative-domain example.local records a server2 address '192.168.1.20'
commit
```

#### AAAA Record (IPv6)

```
set service dns forwarding authoritative-domain example.local records aaaa server1 address '2001:db8::10'
commit
```

#### CNAME Record (Alias)

```
set service dns forwarding authoritative-domain example.local records cname www target 'server1.example.local'
commit
```

#### MX Record (Mail)

```
set service dns forwarding authoritative-domain example.local records mx mail priority 10
set service dns forwarding authoritative-domain example.local records mx mail server 'mail.example.local'
commit
```

#### NS Record (Name Server)

```
set service dns forwarding authoritative-domain example.local records ns ns1 target 'dns1.example.local'
commit
```

#### PTR Record (Reverse DNS)

```
set service dns forwarding authoritative-domain 1.168.192.in-addr.arpa records ptr 10 target 'server1.example.local'
commit
```

#### TXT Record

```
set service dns forwarding authoritative-domain example.local records txt spf value 'v=spf1 mx ~all'
commit
```

#### SRV Record (Service)

```
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 hostname 'ldap.example.local'
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 port 389
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 priority 10
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 weight 100
commit
```

## Производительность и таймауты

### Timeout

Таймаут для DNS запросов (миллисекунды):

```
set service dns forwarding timeout 1500
commit
```

По умолчанию: 1500ms.

### Max Cache Entries

Максимальное количество кэшируемых записей:

```
set service dns forwarding max-cache-entries 100000
commit
```

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

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

```
# Базовая настройка
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'

# Публичные DNS серверы
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '1.1.1.1'

# Кэш
set service dns forwarding cache-size 10000

commit
```

### Корпоративная сеть с split-horizon

```
# Слушать на management интерфейсе
set service dns forwarding listen-address '192.168.10.1'
set service dns forwarding allow-from '192.168.0.0/16'

# Внутренние домены на корпоративный DNS
set service dns forwarding domain corp.local name-server '192.168.1.10'
set service dns forwarding domain corp.local name-server '192.168.1.11'

# Обратные зоны
set service dns forwarding domain 10.168.192.in-addr.arpa name-server '192.168.1.10'
set service dns forwarding domain 20.168.192.in-addr.arpa name-server '192.168.1.10'

# Внешние запросы
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '8.8.4.4'

# Кэш и DNSSEC
set service dns forwarding cache-size 50000
set service dns forwarding dnssec validate

commit
```

### Авторитативная зона для локальной сети

```
# DNS forwarding
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
set service dns forwarding name-server '8.8.8.8'

# Локальный домен
set service dns forwarding authoritative-domain home.local

# Серверы
set service dns forwarding authoritative-domain home.local records a router address '192.168.1.1'
set service dns forwarding authoritative-domain home.local records a nas address '192.168.1.10'
set service dns forwarding authoritative-domain home.local records a printer address '192.168.1.20'

# Алиасы
set service dns forwarding authoritative-domain home.local records cname gateway target 'router.home.local'
set service dns forwarding authoritative-domain home.local records cname storage target 'nas.home.local'

commit
```

### Multi-site с несколькими локациями

```
# DNS forwarding
set service dns forwarding listen-address '10.0.0.1'
set service dns forwarding allow-from '10.0.0.0/8'

# HQ site
set service dns forwarding domain hq.corp.local name-server '10.1.0.10'

# Branch office 1
set service dns forwarding domain branch1.corp.local name-server '10.10.0.10'

# Branch office 2
set service dns forwarding domain branch2.corp.local name-server '10.20.0.10'

# Общий корпоративный домен
set service dns forwarding domain corp.local name-server '10.1.0.10'
set service dns forwarding domain corp.local name-server '10.1.0.11'

# Интернет
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '1.1.1.1'

# Производительность
set service dns forwarding cache-size 100000
set service dns forwarding dnssec validate

commit
```

### DNSSEC с валидацией

```
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'

# DNS серверы с DNSSEC поддержкой
set service dns forwarding name-server '1.1.1.1'
set service dns forwarding name-server '9.9.9.9'

# Включить DNSSEC валидацию
set service dns forwarding dnssec validate

# Увеличить cache для DNSSEC
set service dns forwarding cache-size 20000

commit
```

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

### Очистка кэша

Полная очистка кэша:
```
reset dns forwarding all
```

Очистка для конкретного домена:
```
reset dns forwarding domain example.com
```

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

```
restart dns forwarding
```

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

Показать статистику DNS:
```
show dns forwarding statistics
```

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

Проверка разрешения имен через VyOS DNS:
```
nslookup example.com 192.168.1.1
```

или

```
dig @192.168.1.1 example.com
```

### Логи

Просмотр логов DNS:
```
show log dns forwarding
monitor log | grep recursor
```

## Интеграция с DHCP

DHCP сервер автоматически может использовать DNS forwarding.

В конфигурации DHCP указать:
```
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server '192.168.1.1'
```

Где 192.168.1.1 - адрес VyOS с DNS forwarding.

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

### DNS не отвечает

Проверьте конфигурацию:
```
show service dns forwarding
```

Проверьте, запущен ли сервис:
```
show dns forwarding statistics
```

Проверьте firewall:
```
show firewall ipv4 input filter
```

Убедитесь, что порт 53 UDP открыт:
```
set firewall ipv4 input filter rule 30 action accept
set firewall ipv4 input filter rule 30 destination port 53
set firewall ipv4 input filter rule 30 protocol udp
set firewall ipv4 input filter rule 30 source address 192.168.1.0/24
commit
```

### Медленное разрешение имен

Увеличьте размер кэша:
```
set service dns forwarding cache-size 50000
commit
```

Проверьте upstream DNS серверы:
```
dig @8.8.8.8 example.com
```

Измените upstream на более быстрые:
```
set service dns forwarding name-server '1.1.1.1'
set service dns forwarding name-server '8.8.8.8'
commit
```

### DNSSEC проблемы

Если валидация вызывает проблемы, отключите:
```
set service dns forwarding dnssec off
commit
```

Или используйте менее строгий режим:
```
set service dns forwarding dnssec process
commit
```

### Split-horizon не работает

Убедитесь, что domain-specific правила указаны правильно:
```
show service dns forwarding
```

Порядок важен - более специфичные домены должны быть указаны раньше.

Проверьте тестированием:
```
dig @192.168.1.1 server.corp.local
```

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

### Ограничение доступа

Всегда используйте `allow-from` для ограничения источников:
```
set service dns forwarding allow-from '192.168.1.0/24'
```

Никогда не используйте `0.0.0.0/0` в allow-from - это откроет DNS для всего интернета (DNS amplification атаки).

### Firewall правила

Дополнительно ограничьте через firewall:
```
set firewall ipv4 input filter rule 30 action accept
set firewall ipv4 input filter rule 30 destination port 53
set firewall ipv4 input filter rule 30 protocol udp
set firewall ipv4 input filter rule 30 source address 192.168.1.0/24
commit
```

### Rate Limiting

Используйте firewall rate limiting для защиты от DoS:
```
set firewall ipv4 input filter rule 30 action accept
set firewall ipv4 input filter rule 30 destination port 53
set firewall ipv4 input filter rule 30 protocol udp
set firewall ipv4 input filter rule 30 limit rate 50/second
commit
```

### DNSSEC

Включайте DNSSEC для защиты от DNS spoofing:
```
set service dns forwarding dnssec validate
commit
```

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

1. **Используйте allow-from** - всегда ограничивайте источники запросов
2. **Множественные upstream** - указывайте 2-3 upstream DNS сервера
3. **DNSSEC** - включайте для безопасности
4. **Кэш** - настраивайте размер кэша под нагрузку
5. **Split-horizon** - разделяйте внутренние и внешние домены
6. **Firewall** - дополнительно защищайте через firewall
7. **Мониторинг** - регулярно проверяйте статистику и логи
8. **Резервирование** - используйте несколько DNS серверов
9. **Документирование** - документируйте domain-specific forwarding
10. **Тестирование** - проверяйте разрешение имен после изменений

## Публичные DNS серверы

Рекомендуемые публичные DNS:

- **Cloudflare**: 1.1.1.1, 1.0.0.1 (быстрые, приватные)
- **Google**: 8.8.8.8, 8.8.4.4 (надежные)
- **Quad9**: 9.9.9.9, 149.112.112.112 (блокировка вредоносных доменов)
- **OpenDNS**: 208.67.222.222, 208.67.220.220 (фильтрация контента)

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

- [DHCP Server](/docs/vyos/services/vyos-dhcp/) - интеграция DHCP с DNS
- [Dynamic DNS](/docs/vyos/services/vyos-ddns/) - автоматическое обновление DNS
- [Firewall](/docs/vyos/firewall/) - защита DNS сервиса

