# Name Server - Системные DNS серверы

> Настройка системных DNS серверов и domain-search в VyOS - примеры для Yandex Cloud, VK Cloud и других облачных провайдеров

Source: https://opennix.org/docs/vyos/system/vyos-name-server/


Данная страница описывает настройку системных DNS серверов (name-server) и списка доменов для поиска (domain-search) в VyOS. Эти параметры определяют, как система VyOS разрешает доменные имена для всех системных операций.

## Обзор

Системные DNS серверы в VyOS используются для:

- **Разрешения доменных имен** для всех системных процессов
- **Обновления пакетов** через apt/dpkg
- **NTP синхронизации** (если NTP серверы указаны по имени)
- **Загрузки образов контейнеров** (Docker/Podman)
- **VPN подключений** к удаленным endpoint по имени
- **Syslog отправки** на удаленные серверы по имени
- **Monitoring и alerting** систем
- **API вызовов** к внешним сервисам

### Важные замечания

**Отличие от DNS forwarding:**
- `system name-server` - DNS для самой системы VyOS
- `service dns forwarding` - DNS сервер, который VyOS предоставляет клиентам

**Приоритет конфигурации:**
- Статическая конфигурация `system name-server` имеет приоритет над DNS, полученными через DHCP
- Если настроены оба, используются только статические серверы
- DHCP DNS используются только если `system name-server` не настроен

**VRF ограничения:**
- В текущих версиях VyOS нет способа принудительно направить системный DNS трафик через определенный VRF
- Системные DNS запросы используют default VRF независимо от настроек management VRF

**Файл конфигурации:**
- Конфигурация DNS записывается в `/etc/resolv.conf`
- Файл генерируется автоматически при commit, не редактируйте вручную
- Изменения применяются немедленно ко всем системным процессам

## Конфигурация DNS серверов

### Базовая настройка

#### IPv4 DNS серверы

```bash
# Добавить первый DNS сервер
set system name-server 8.8.8.8

# Добавить второй DNS сервер (резервный)
set system name-server 8.8.4.4

# Применить конфигурацию
commit
save
```

#### IPv6 DNS серверы

```bash
# Добавить IPv6 DNS сервер
set system name-server 2001:4860:4860::8888
set system name-server 2001:4860:4860::8844

commit
save
```

#### Dual-stack конфигурация

```bash
# Смешанная конфигурация IPv4 + IPv6
set system name-server 8.8.8.8
set system name-server 8.8.4.4
set system name-server 2001:4860:4860::8888
set system name-server 2001:4860:4860::8844

commit
save
```

### Множественные DNS серверы

VyOS поддерживает настройку нескольких DNS серверов. Порядок имеет значение - серверы опрашиваются последовательно в порядке добавления.

```bash
# Первый сервер - основной (используется первым)
set system name-server 192.168.1.53

# Второй сервер - резервный
set system name-server 192.168.1.54

# Третий сервер - fallback
set system name-server 8.8.8.8

commit
save
```

**Поведение резолвера:**
- При недоступности первого сервера автоматически используется второй
- При недоступности второго - третий
- Timeout на каждый сервер составляет 5 секунд по умолчанию
- Максимум 3 сервера рекомендуется (ограничение `/etc/resolv.conf`)

### Удаление DNS серверов

```bash
# Удалить конкретный DNS сервер
delete system name-server 8.8.4.4

# Удалить все DNS серверы
delete system name-server

commit
save
```

## Domain Search List

### Описание

Domain-search (список доменов для поиска) определяет суффиксы, автоматически добавляемые к неполным доменным именам при резолюции.

**Принцип работы:**
- При запросе короткого имени (например, `server1`) система добавляет суффиксы из списка
- Запросы выполняются последовательно: `server1.first-domain.com`, `server1.second-domain.com`, и т.д.
- При нахождении первого успешного разрешения поиск прекращается
- Полные доменные имена (с точкой в конце или содержащие точки) не модифицируются

**Ограничения RFC:**
- Максимум 6 доменов в списке
- Каждый домен: максимум 253 символа
- Допустимые символы: буквы, цифры, дефисы, точки
- Домен не может начинаться или заканчиваться дефисом

### Конфигурация

#### Базовая настройка

```bash
# Добавить первый домен для поиска
set system domain-search vyos.io

# Добавить дополнительные домены
set system domain-search vyos.net
set system domain-search vyos.network

commit
save
```

#### Результат в /etc/resolv.conf

```bash
# После применения конфигурации:
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# search vyos.io vyos.net vyos.network
```

#### Проверка работы

```bash
# При настроенном domain-search: example.com

# Запрос короткого имени
vyos@router:~$ ping server1
# Система пробует: server1.example.com

# Запрос с точкой в конце (FQDN) - суффикс не добавляется
vyos@router:~$ ping server1.other-domain.org.
# Система запрашивает: server1.other-domain.org (без изменений)

# Запрос полного имени (содержит точки) - суффикс добавляется
vyos@router:~$ ping server1.local
# Система пробует: server1.local.example.com, затем server1.local
```

### Удаление domain-search

```bash
# Удалить конкретный домен
delete system domain-search vyos.network

# Удалить все домены
delete system domain-search

commit
save
```

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

### Статическая vs DHCP конфигурация

VyOS поддерживает получение DNS серверов через DHCP на WAN интерфейсах, но статическая конфигурация имеет приоритет.

**Поведение:**
1. Если настроены статические `system name-server` - используются только они
2. Если статические серверы не настроены, используются DNS из DHCP
3. Если DHCP не предоставляет DNS и нет статических - система использует встроенный fallback (127.0.0.1 для локального кэша DNS, если включен)

#### Пример 1: Только статические серверы

```bash
# Статическая конфигурация
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# DHCP на WAN интерфейсе (предоставляет DNS, но они игнорируются)
set interfaces ethernet eth0 address dhcp

commit
save

# Результат: используются только 8.8.8.8 и 8.8.4.4
```

#### Пример 2: Только DHCP серверы

```bash
# Нет статической конфигурации name-server

# DHCP на WAN интерфейсе (предоставляет DNS)
set interfaces ethernet eth0 address dhcp

commit
save

# Результат: используются DNS серверы, полученные через DHCP
```

#### Пример 3: Гибридная конфигурация (не работает как ожидается)

```bash
# ОШИБКА: Попытка совместить статические и DHCP DNS
set system name-server 8.8.8.8
set interfaces ethernet eth0 address dhcp

# Результат: используется только 8.8.8.8, DHCP DNS игнорируются
```

**Рекомендация:**
- Для production систем используйте только статические DNS серверы
- DHCP DNS оставляйте для временных или тестовых конфигураций
- Не смешивайте оба подхода - это приводит к путанице

### Переопределение DHCP DNS

Если нужно использовать статические DNS вместо DHCP:

```bash
# Отключить получение DNS через DHCP на интерфейсе
set interfaces ethernet eth0 address dhcp
set interfaces ethernet eth0 dhcp-options no-default-route
set interfaces ethernet eth0 dhcp-options reject nameserver

# Настроить статические DNS
set system name-server 8.8.8.8
set system name-server 8.8.4.4

commit
save
```

**Примечание:** Опция `reject nameserver` может быть недоступна в некоторых версиях VyOS. В таком случае просто настройте статические серверы - они будут иметь приоритет.

## Облачные провайдеры

### Yandex Cloud

Yandex Cloud предоставляет внутренние DNS серверы для резолюции внутренних имен виртуальных машин и сервисов.

#### Использование внутреннего DNS Yandex Cloud

```bash
# Внутренний DNS сервер Yandex Cloud (второй IP из подсети)
# Для подсети 10.128.0.0/24 это будет 10.128.0.2
set system name-server 10.128.0.2

commit
save
```

**Принцип работы:**
- Каждая подсеть в Yandex Cloud имеет встроенный DNS сервер на втором IP адресе
- Для подсети `10.128.0.0/24` DNS: `10.128.0.2`
- Для подсети `192.168.1.0/24` DNS: `192.168.1.2`
- Резолвит внутренние FQDN виртуальных машин: `vm-name.auto.internal`

#### Использование публичных DNS Yandex

```bash
# Публичные DNS серверы Yandex (77.88.8.8)
set system name-server 77.88.8.8
set system name-server 77.88.8.1

commit
save
```

**Характеристики Yandex DNS:**
- Адреса: `77.88.8.8`, `77.88.8.1`
- Поддержка DNSSEC
- Фильтрация вредоносных сайтов (опционально)
- Низкая латентность для клиентов в России

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

```bash
# Внутренний DNS для локальных имен + публичный для интернета
set system name-server 10.128.0.2
set system name-server 77.88.8.8
set system name-server 77.88.8.1

# Domain-search для внутренних имен
set system domain-search auto.internal
set system domain-search ru-central1.internal

commit
save
```

#### Пример полной конфигурации для Yandex Cloud

```bash
configure

# Hostname
set system host-name vyos-gateway-ru-central1-a
set system domain-name ru-central1.internal

# DNS конфигурация
# Первый - внутренний DNS Yandex Cloud (резолвит *.auto.internal)
set system name-server 10.128.0.2

# Второй - публичный DNS Yandex (для внешних имен)
set system name-server 77.88.8.8

# Третий - резервный публичный DNS
set system name-server 77.88.8.1

# Domain search для автоматического добавления суффиксов
set system domain-search ru-central1.internal
set system domain-search auto.internal

# NTP серверы (для проверки DNS резолюции)
set service ntp server ntp1.yandex.ru
set service ntp server ntp2.yandex.ru

commit
save
exit
```

**Проверка:**

```bash
# Проверить внутреннюю резолюцию
vyos@vyos-gateway-ru-central1-a:~$ nslookup vm-name.auto.internal
# Должен резолвится через 10.128.0.2

# Проверить внешнюю резолюцию
vyos@vyos-gateway-ru-central1-a:~$ nslookup google.com
# Должен резолвится через 77.88.8.8

# Проверить конфигурацию
vyos@vyos-gateway-ru-central1-a:~$ cat /etc/resolv.conf
# nameserver 10.128.0.2
# nameserver 77.88.8.8
# nameserver 77.88.8.1
# search ru-central1.internal auto.internal
```

### VK Cloud (Cloud.ru)

VK Cloud предоставляет внутренние DNS серверы для резолюции виртуальных машин внутри проекта.

#### Использование внутреннего DNS VK Cloud

```bash
# Внутренний DNS сервер VK Cloud (второй IP из подсети)
# Для подсети 10.0.0.0/24 это будет 10.0.0.2
set system name-server 10.0.0.2

commit
save
```

**Принцип работы:**
- Аналогично Yandex Cloud, каждая подсеть имеет DNS на втором IP
- Резолвит внутренние FQDN виртуальных машин
- Формат FQDN: `vm-name.mcs.local` или `vm-name.cloud.local`

#### Использование публичных DNS VK Cloud

VK Cloud не предоставляет публичные DNS серверы. Рекомендуется использовать:

```bash
# Google DNS
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# Или Cloudflare DNS
set system name-server 1.1.1.1
set system name-server 1.0.0.1

# Или Yandex DNS
set system name-server 77.88.8.8
set system name-server 77.88.8.1

commit
save
```

#### Пример полной конфигурации для VK Cloud

```bash
configure

# Hostname
set system host-name vyos-gateway-msk1
set system domain-name msk1.cloud.vk.com

# DNS конфигурация
# Внутренний DNS VK Cloud (резолвит локальные VM)
set system name-server 10.0.0.2

# Публичные DNS для внешних имен
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# Domain search
set system domain-search msk1.cloud.vk.com
set system domain-search mcs.local

# NTP
set service ntp server 0.ru.pool.ntp.org
set service ntp server 1.ru.pool.ntp.org

commit
save
exit
```

### AWS (Amazon Web Services)

AWS предоставляет внутренний DNS резолвер для каждого VPC.

#### Использование Amazon Route 53 Resolver

```bash
# Amazon Route 53 Resolver (VPC DNS)
# Всегда доступен на IP: <VPC_CIDR_BASE> + 2
# Для VPC 10.0.0.0/16 это будет 10.0.0.2
set system name-server 10.0.0.2

commit
save
```

**Принцип работы:**
- Адрес DNS: `<VPC_CIDR_BASE> + 2`
- Резолвит внутренние EC2 имена: `ip-10-0-1-5.ec2.internal`
- Резолвит Route 53 Private Hosted Zones
- Перенаправляет публичные запросы в интернет

#### Пример для AWS

```bash
configure

# Hostname
set system host-name vyos-gateway-us-east-1a
set system domain-name us-east-1.compute.internal

# DNS конфигурация
set system name-server 10.0.0.2

# Domain search для EC2
set system domain-search us-east-1.compute.internal
set system domain-search ec2.internal

# NTP (AWS Time Sync Service)
set service ntp server 169.254.169.123

commit
save
exit
```

### Azure (Microsoft Azure)

Azure предоставляет встроенный DNS для каждого виртуального сетевого окружения.

#### Использование Azure DNS

```bash
# Azure Virtual Network DNS
# Адрес: 168.63.129.16 (специальный Azure metadata IP)
set system name-server 168.63.129.16

commit
save
```

**Принцип работы:**
- Адрес: `168.63.129.16` (используется для всех VNet)
- Резолвит внутренние Azure VM имена
- Поддерживает Azure Private DNS Zones
- Перенаправляет публичные запросы

#### Пример для Azure

```bash
configure

# Hostname
set system host-name vyos-gateway-westeurope
set system domain-name internal.cloudapp.net

# DNS конфигурация
set system name-server 168.63.129.16

# Domain search
set system domain-search internal.cloudapp.net

# NTP (Azure NTP)
set service ntp server time.windows.com

commit
save
exit
```

### Google Cloud Platform (GCP)

GCP предоставляет внутренний DNS резолвер для каждой VPC сети.

#### Использование Google Cloud DNS

```bash
# Google Cloud DNS (metadata server)
set system name-server 169.254.169.254

# Или использовать внутренний DNS VPC
# Для подсети 10.128.0.0/20 это будет 10.128.0.2
set system name-server 10.128.0.2

commit
save
```

**Принцип работы:**
- Metadata DNS: `169.254.169.254`
- VPC DNS: `<SUBNET_CIDR_BASE> + 2`
- Резолвит внутренние GCP VM имена: `vm-name.c.project-id.internal`
- Поддерживает Cloud DNS Private Zones

#### Пример для GCP

```bash
configure

# Hostname
set system host-name vyos-gateway-europe-west1-b
set system domain-name c.my-project-id.internal

# DNS конфигурация
set system name-server 169.254.169.254
set system name-server 10.128.0.2

# Domain search
set system domain-search c.my-project-id.internal

# NTP (Google Public NTP)
set service ntp server time.google.com

commit
save
exit
```

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

### Пример 1: Корпоративная сеть с внутренним DNS

**Задача:** Настроить VyOS для использования корпоративного DNS с резервными публичными серверами.

```bash
configure

# DNS конфигурация
# Основной корпоративный DNS (Active Directory)
set system name-server 192.168.1.10

# Резервный корпоративный DNS
set system name-server 192.168.1.11

# Публичный резервный (на случай отказа корпоративных)
set system name-server 8.8.8.8

# Domain search для корпоративных доменов
set system domain-search corp.example.com
set system domain-search example.com

# Hostname
set system host-name vyos-gateway
set system domain-name corp.example.com

commit
save
exit
```

**Проверка:**

```bash
# Проверить резолюцию корпоративных имен
nslookup dc01
# Должен резолвится как dc01.corp.example.com через 192.168.1.10

# Проверить резолюцию внешних имен
nslookup google.com
# Должен резолвится через корпоративный DNS

# Проверить конфигурацию
cat /etc/resolv.conf
```

### Пример 2: Edge router с публичными DNS

**Задача:** Настроить пограничный маршрутизатор с надежными публичными DNS.

```bash
configure

# DNS конфигурация с несколькими провайдерами
# Google DNS
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# Cloudflare DNS
set system name-server 1.1.1.1

# Hostname
set system host-name vyos-edge-router
set system domain-name edge.local

commit
save
exit
```

### Пример 3: Multi-site с условной forwarding

**Задача:** Головной офис с филиалами, каждый филиал имеет свой DNS домен.

```bash
configure

# Основной офис (Москва)
set system host-name vyos-hq-moscow
set system domain-name moscow.corp.local

# DNS серверы
# Локальный DNS (резолвит moscow.corp.local)
set system name-server 192.168.1.53

# DNS головного офиса (резолвит corp.local и филиалы)
set system name-server 10.0.0.53

# Публичный резервный
set system name-server 8.8.8.8

# Domain search для всех филиалов
set system domain-search moscow.corp.local
set system domain-search spb.corp.local
set system domain-search ekb.corp.local
set system domain-search corp.local

commit
save
exit
```

**Филиал (Санкт-Петербург):**

```bash
configure

set system host-name vyos-branch-spb
set system domain-name spb.corp.local

# Локальный DNS филиала
set system name-server 192.168.2.53

# DNS головного офиса через VPN
set system name-server 10.0.0.53

# Публичный резервный
set system name-server 8.8.8.8

# Domain search
set system domain-search spb.corp.local
set system domain-search corp.local

commit
save
exit
```

### Пример 4: DMZ с ограниченным DNS

**Задача:** DMZ роутер, который должен резолвить только определенные домены.

```bash
configure

set system host-name vyos-dmz
set system domain-name dmz.example.com

# DNS сервер с whitelist для DMZ
set system name-server 10.10.10.53

# Резервный публичный (ограниченный firewall правилами)
set system name-server 8.8.8.8

# Domain search только для DMZ
set system domain-search dmz.example.com

commit
save
exit
```

### Пример 5: IPv6-only сеть

**Задача:** Настроить DNS для IPv6-only инфраструктуры.

```bash
configure

set system host-name vyos-ipv6-router
set system domain-name ipv6.example.com

# Google DNS (IPv6)
set system name-server 2001:4860:4860::8888
set system name-server 2001:4860:4860::8844

# Cloudflare DNS (IPv6)
set system name-server 2606:4700:4700::1111
set system name-server 2606:4700:4700::1001

# Domain search
set system domain-search ipv6.example.com

commit
save
exit
```

### Пример 6: Dual-stack с приоритетом IPv6

**Задача:** Dual-stack сеть с предпочтением IPv6 для DNS.

```bash
configure

set system host-name vyos-dualstack
set system domain-name dualstack.example.com

# IPv6 DNS серверы (приоритет - указаны первыми)
set system name-server 2001:4860:4860::8888
set system name-server 2001:4860:4860::8844

# IPv4 DNS серверы (fallback)
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# Domain search
set system domain-search dualstack.example.com

commit
save
exit
```

## Команды проверки и мониторинга

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

```bash
# Показать настроенные DNS серверы
show configuration system name-server

# Показать domain-search
show configuration system domain-search

# Показать всю системную конфигурацию
show configuration system
```

### Проверка /etc/resolv.conf

```bash
# Просмотр актуального содержимого resolv.conf
cat /etc/resolv.conf

# Пример вывода:
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# search vyos.io vyos.net
```

### Тестирование DNS резолюции

#### Базовые команды

```bash
# DNS lookup с nslookup
nslookup google.com

# Вывод:
# Server:         8.8.8.8
# Address:        8.8.8.8#53
#
# Non-authoritative answer:
# Name:   google.com
# Address: 142.250.185.46
```

```bash
# DNS lookup с dig
dig google.com

# Детальная информация
dig google.com +short

# Проверка конкретного DNS сервера
dig @8.8.8.8 google.com
```

```bash
# DNS lookup с host
host google.com

# Reverse DNS lookup
host 8.8.8.8
```

#### Проверка domain-search

```bash
# При настроенном domain-search: example.com

# Запрос короткого имени (должен добавиться суффикс)
dig server1

# Вывод покажет: server1.example.com

# Проверка с verbose
dig +search server1
```

#### Трассировка DNS запросов

```bash
# Полная трассировка DNS резолюции
dig +trace google.com

# Вывод:
# . 86400 IN NS a.root-servers.net.
# ...
# google.com. 172800 IN NS ns1.google.com.
# ...
# google.com. 300 IN A 142.250.185.46
```

#### Проверка DNSSEC

```bash
# Проверить DNSSEC подписи
dig google.com +dnssec

# Проверить валидность DNSSEC
dig google.com +dnssec +multiline
```

### Мониторинг производительности DNS

```bash
# Измерить время резолюции
time nslookup google.com

# Вывод:
# real    0m0.045s
# user    0m0.012s
# sys     0m0.008s
```

```bash
# Статистика DNS запросов с dig
dig google.com +stats

# Вывод включает:
# ;; Query time: 45 msec
# ;; SERVER: 8.8.8.8#53(8.8.8.8)
# ;; WHEN: Wed Jan 15 10:30:45 MSK 2025
# ;; MSG SIZE  rcvd: 55
```

### Проверка доступности DNS серверов

```bash
# Ping DNS сервера
ping -c 4 8.8.8.8

# Проверить UDP порт 53
nc -vuz 8.8.8.8 53

# Или с nmap
nmap -sU -p 53 8.8.8.8
```

### Проверка DNS для определенного домена

```bash
# Запрос всех DNS записей
dig example.com ANY

# Запрос конкретных типов записей
dig example.com A      # IPv4 адрес
dig example.com AAAA   # IPv6 адрес
dig example.com MX     # Mail exchange
dig example.com NS     # Name servers
dig example.com TXT    # Text records
dig example.com SOA    # Start of authority
```

### Проверка reverse DNS

```bash
# Reverse lookup (PTR запись)
dig -x 8.8.8.8

# Или с host
host 8.8.8.8

# Или с nslookup
nslookup 8.8.8.8
```

### Логирование DNS запросов

```bash
# Включить debug логирование DNS (временно)
sudo tcpdump -i any port 53 -vv

# Логировать DNS запросы в файл
sudo tcpdump -i any port 53 -w /tmp/dns-traffic.pcap

# Анализ сохраненного файла
sudo tcpdump -r /tmp/dns-traffic.pcap -vv
```

### Проверка DNS кэша

```bash
# VyOS не имеет встроенного DNS кэша на уровне системы
# Но если включен dns forwarding, можно проверить его кэш

# Показать статистику dns forwarding (если настроен)
show dns forwarding statistics

# Очистить кэш dns forwarding (если настроен)
reset dns forwarding cache
```

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

### Проблема 1: DNS не резолвит имена

**Симптомы:**
- Команды `nslookup`, `dig`, `host` возвращают ошибки
- Система не может обновить пакеты через `apt update`
- NTP не синхронизируется (если NTP серверы указаны по имени)

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

```bash
# Проверить конфигурацию DNS
show configuration system name-server

# Проверить /etc/resolv.conf
cat /etc/resolv.conf

# Проверить доступность DNS серверов
ping 8.8.8.8

# Проверить UDP порт 53
nc -vuz 8.8.8.8 53

# Проверить DNS резолюцию
nslookup google.com
```

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

```bash
# Если DNS серверы не настроены - настроить
configure
set system name-server 8.8.8.8
set system name-server 8.8.4.4
commit
save
exit

# Проверить firewall правила (DNS должен быть разрешен)
show firewall

# Добавить правило, если DNS блокируется
configure
set firewall name WAN_LOCAL rule 100 action accept
set firewall name WAN_LOCAL rule 100 protocol udp
set firewall name WAN_LOCAL rule 100 destination port 53
commit
save
exit

# Проверить результат
nslookup google.com
```

### Проблема 2: Медленная DNS резолюция

**Симптомы:**
- Команды DNS занимают несколько секунд
- Веб-браузинг медленный
- SSH подключения долго устанавливаются

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

```bash
# Измерить время резолюции
time nslookup google.com

# Проверить RTT к DNS серверам
ping -c 10 8.8.8.8

# Проверить статистику dig
dig google.com +stats

# Трассировка до DNS сервера
traceroute 8.8.8.8
```

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

```bash
# Использовать более быстрые или близкие DNS серверы
configure

# Удалить медленные серверы
delete system name-server 8.8.8.8

# Добавить быстрые локальные серверы
set system name-server 192.168.1.53  # Локальный DNS
set system name-server 77.88.8.8     # Yandex DNS (для России)

commit
save
exit

# Проверить улучшение
time nslookup google.com
```

### Проблема 3: Domain-search не работает

**Симптомы:**
- Короткие имена не резолвятся
- Необходимо указывать полные FQDN

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

```bash
# Проверить конфигурацию domain-search
show configuration system domain-search

# Проверить /etc/resolv.conf
cat /etc/resolv.conf | grep search

# Тестовый запрос
dig +search server1
```

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

```bash
# Настроить domain-search
configure
set system domain-search example.com
commit
save
exit

# Проверить /etc/resolv.conf
cat /etc/resolv.conf
# Должна быть строка: search example.com

# Тестовый запрос
dig server1
# Должен резолвится как server1.example.com
```

### Проблема 4: DNS резолвит только IPv6 или только IPv4

**Симптомы:**
- Dual-stack имена резолвятся только в один тип адресов
- Нет A или AAAA записей

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

```bash
# Проверить IPv4 резолюцию
dig google.com A

# Проверить IPv6 резолюцию
dig google.com AAAA

# Проверить оба
dig google.com A AAAA
```

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

```bash
# Убедиться, что используются DNS серверы, поддерживающие оба протокола
configure

# Для dual-stack использовать современные DNS
set system name-server 8.8.8.8
set system name-server 2001:4860:4860::8888

commit
save
exit

# Проверить оба типа записей
dig google.com A
dig google.com AAAA
```

### Проблема 5: Конфликт статических и DHCP DNS

**Симптомы:**
- DNS серверы меняются после перезагрузки
- /etc/resolv.conf содержит неожиданные серверы

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

```bash
# Проверить статическую конфигурацию
show configuration system name-server

# Проверить DHCP конфигурацию на интерфейсах
show configuration interfaces ethernet

# Проверить /etc/resolv.conf
cat /etc/resolv.conf
```

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

```bash
# Вариант 1: Использовать только статические DNS
configure
set system name-server 8.8.8.8
set system name-server 8.8.4.4
commit
save
exit

# Вариант 2: Использовать только DHCP DNS
configure
delete system name-server
commit
save
exit

# Вариант 3: Отключить DHCP DNS на интерфейсе (если поддерживается)
configure
set interfaces ethernet eth0 dhcp-options no-default-route
commit
save
exit
```

### Проблема 6: DNS не резолвит внутренние cloud имена

**Симптомы:**
- Внешние имена резолвятся, внутренние (*.auto.internal, *.ec2.internal) - нет
- Используются публичные DNS вместо облачных

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

```bash
# Проверить конфигурацию DNS
show configuration system name-server

# Попытаться резолвить внутреннее имя
nslookup vm-name.auto.internal

# Проверить, какой DNS сервер используется
dig vm-name.auto.internal
```

**Решение (Yandex Cloud):**

```bash
configure

# Добавить внутренний DNS Yandex Cloud первым
set system name-server 10.128.0.2

# Затем публичные
set system name-server 77.88.8.8

# Domain-search для внутренних имен
set system domain-search auto.internal
set system domain-search ru-central1.internal

commit
save
exit

# Проверить
nslookup vm-name.auto.internal
```

**Решение (AWS):**

```bash
configure

# Использовать VPC DNS
set system name-server 10.0.0.2

# Domain-search для EC2
set system domain-search us-east-1.compute.internal
set system domain-search ec2.internal

commit
save
exit

# Проверить
nslookup ip-10-0-1-5.ec2.internal
```

### Проблема 7: VRF routing для DNS не работает

**Симптомы:**
- Management VRF настроен, но DNS трафик идет через default VRF
- DNS недоступен в изолированном VRF

**Объяснение:**

В текущих версиях VyOS нет способа направить системный DNS трафик через определенный VRF. Это известное ограничение.

**Workaround:**

```bash
# Вариант 1: Использовать DNS сервер доступный из default VRF
configure
set system name-server 8.8.8.8  # Публичный DNS через default route
commit
save
exit

# Вариант 2: Настроить static route для DNS сервера
configure
set protocols static route 192.168.1.53/32 next-hop 10.0.0.1
commit
save
exit

# Вариант 3: Использовать DNS forwarding с source-address
# (позволяет указать source IP для запросов)
configure
set service dns forwarding listen-address 127.0.0.1
set service dns forwarding name-server 192.168.1.53
set service dns forwarding source-address 10.0.0.10
commit
save
exit

# Изменить system name-server на localhost
configure
set system name-server 127.0.0.1
commit
save
exit
```

### Проблема 8: DNSSEC валидация не работает

**Симптомы:**
- DNSSEC-подписанные домены не резолвятся
- Ошибки валидации DNSSEC

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

```bash
# Проверить DNSSEC валидацию
dig google.com +dnssec

# Проверить, поддерживает ли DNS сервер DNSSEC
dig @8.8.8.8 . DNSKEY
```

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

```bash
# Использовать DNS серверы с поддержкой DNSSEC
configure

# Google DNS (поддерживает DNSSEC)
set system name-server 8.8.8.8

# Cloudflare DNS (поддерживает DNSSEC)
set system name-server 1.1.1.1

# Yandex DNS (поддерживает DNSSEC)
set system name-server 77.88.8.8

commit
save
exit

# Проверить DNSSEC
dig google.com +dnssec
```

## Лучшие практики (Best Practices)

### 1. Выбор DNS серверов

**Используйте минимум 2 DNS сервера:**

```bash
# Хорошо: 2-3 сервера
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# Плохо: только один сервер
set system name-server 8.8.8.8
```

**Выбирайте близкие по RTT серверы:**

```bash
# Проверить RTT
ping -c 10 8.8.8.8
ping -c 10 77.88.8.8
ping -c 10 1.1.1.1

# Использовать сервер с наименьшим RTT
# Для России обычно:
set system name-server 77.88.8.8  # Yandex, ~5-10ms
set system name-server 8.8.8.8    # Google, ~20-30ms
```

**Комбинируйте разных провайдеров:**

```bash
# Диверсификация провайдеров DNS
set system name-server 77.88.8.8   # Yandex
set system name-server 8.8.8.8     # Google
set system name-server 1.1.1.1     # Cloudflare
```

### 2. Облачные инфраструктуры

**Всегда используйте внутренний облачный DNS первым:**

```bash
# Yandex Cloud
set system name-server 10.128.0.2   # Внутренний DNS
set system name-server 77.88.8.8    # Публичный резервный

# AWS
set system name-server 10.0.0.2     # VPC DNS
set system name-server 8.8.8.8      # Публичный резервный

# Azure
set system name-server 168.63.129.16  # Azure DNS
set system name-server 8.8.8.8        # Публичный резервный
```

**Настраивайте domain-search для внутренних имен:**

```bash
# Yandex Cloud
set system domain-search auto.internal
set system domain-search ru-central1.internal

# AWS
set system domain-search us-east-1.compute.internal
set system domain-search ec2.internal
```

### 3. Корпоративные сети

**Приоритизируйте внутренние DNS:**

```bash
# Корпоративный DNS первый (резолвит internal.corp.com)
set system name-server 192.168.1.10

# Резервный корпоративный
set system name-server 192.168.1.11

# Публичный только как last resort
set system name-server 8.8.8.8
```

**Используйте domain-search для удобства:**

```bash
set system domain-search corp.example.com
set system domain-search example.com

# Позволяет использовать:
# ping dc01 -> dc01.corp.example.com
# ping exchange -> exchange.corp.example.com
```

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

**Используйте только доверенные DNS серверы:**

```bash
# Хорошо: известные публичные DNS
set system name-server 8.8.8.8     # Google
set system name-server 1.1.1.1     # Cloudflare
set system name-server 77.88.8.8   # Yandex

# Плохо: случайные неизвестные DNS
set system name-server 123.45.67.89
```

**Рассмотрите DNS over TLS/HTTPS для конфиденциальности:**

Примечание: VyOS не поддерживает DoT/DoH напрямую через system name-server, но можно настроить через dns forwarding или внешний DNS proxy.

```bash
# Вариант с dns forwarding (требует дополнительных шагов)
set service dns forwarding listen-address 127.0.0.1
set service dns forwarding name-server 1.1.1.1
# Дополнительная настройка DoH требует ручной конфигурации

set system name-server 127.0.0.1
```

**Мониторьте DNS трафик:**

```bash
# Периодически проверяйте DNS запросы
sudo tcpdump -i any port 53 -c 100

# Ищите подозрительные запросы
```

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

**Минимизируйте latency:**

```bash
# Проверить RTT к различным DNS серверам
ping -c 10 8.8.8.8
ping -c 10 77.88.8.8
ping -c 10 1.1.1.1

# Использовать самые быстрые
```

**Ограничьте количество domain-search записей:**

```bash
# Хорошо: 1-3 домена
set system domain-search corp.local
set system domain-search local

# Плохо: слишком много доменов (замедляет резолюцию)
set system domain-search domain1.com
set system domain-search domain2.com
set system domain-search domain3.com
set system domain-search domain4.com
set system domain-search domain5.com
set system domain-search domain6.com
```

**Используйте локальный DNS кэш:**

```bash
# Настроить dns forwarding как локальный кэш
set service dns forwarding listen-address 127.0.0.1
set service dns forwarding cache-size 10000
set service dns forwarding name-server 8.8.8.8
set service dns forwarding name-server 8.8.4.4

# Изменить system name-server на localhost
set system name-server 127.0.0.1

commit
save
```

### 6. Резервирование

**Избыточность DNS серверов:**

```bash
# Минимум 2, рекомендуется 3
set system name-server 192.168.1.10
set system name-server 192.168.1.11
set system name-server 8.8.8.8
```

**Географическая избыточность:**

```bash
# DNS серверы в разных дата-центрах
set system name-server 10.0.1.53   # DC1
set system name-server 10.1.1.53   # DC2
set system name-server 8.8.8.8     # Публичный резервный
```

### 7. Мониторинг и алертинг

**Регулярно проверяйте DNS:**

```bash
# Скрипт мониторинга DNS
sudo tee /config/scripts/dns-monitor.sh > /dev/null <<'EOF'
#!/bin/bash
# Мониторинг DNS резолюции

DNS_SERVERS="8.8.8.8 8.8.4.4"
TEST_DOMAIN="google.com"
TIMEOUT=5

for server in $DNS_SERVERS; do
    response=$(dig @$server $TEST_DOMAIN +time=$TIMEOUT +tries=1 +short 2>&1)
    if [ $? -eq 0 ] && [ -n "$response" ]; then
        echo "DNS $server: OK"
        logger -t dns-monitor "DNS $server: OK"
    else
        echo "DNS $server: FAILED"
        logger -t dns-monitor "ERROR: DNS $server FAILED"
        # Отправить алерт
    fi
done
EOF

chmod +x /config/scripts/dns-monitor.sh

# Запланировать проверку каждые 5 минут
set system task-scheduler task dns-monitor interval '*/5 * * * *'
set system task-scheduler task dns-monitor executable path '/config/scripts/dns-monitor.sh'

commit
save
```

**Алертинг на потерю DNS:**

```bash
# Интеграция с системой мониторинга
# Например, отправка в syslog для анализа SIEM
set system syslog host 10.0.0.100 facility local7 level warning
```

### 8. Документирование

**Документируйте выбор DNS серверов:**

```bash
# Добавьте комментарии в конфигурацию
configure
set system name-server 192.168.1.10
set system name-server 192.168.1.11
set system name-server 8.8.8.8

commit comment "DNS: 192.168.1.10/11 - корпоративные AD DNS, 8.8.8.8 - резервный"
save
```

**Храните историю изменений:**

```bash
# Просмотр истории изменений DNS
show system commit

# Сравнение конфигураций
show system commit diff 10
```

### 9. IPv6 Ready

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

```bash
# IPv4 + IPv6 DNS серверы
set system name-server 8.8.8.8
set system name-server 8.8.4.4
set system name-server 2001:4860:4860::8888
set system name-server 2001:4860:4860::8844

commit
save
```

### 10. Testing и Validation

**Тестируйте DNS после изменений:**

```bash
# После изменения конфигурации DNS всегда тестируйте
nslookup google.com
nslookup internal-server.corp.local
ping -c 4 ntp.pool.org

# Проверить время резолюции
time nslookup google.com

# Проверить domain-search
dig +search server1
```

## Интеграция с другими сервисами VyOS

### NTP

DNS используется для резолюции NTP серверов, указанных по имени:

```bash
configure

# DNS для резолюции NTP серверов
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# NTP серверы по имени (требуют DNS резолюции)
set service ntp server 0.pool.ntp.org
set service ntp server 1.pool.ntp.org

commit
save
exit

# Проверить, что NTP серверы резолвятся
nslookup 0.pool.ntp.org
show ntp
```

### Syslog

DNS используется для резолюции удаленных syslog серверов:

```bash
configure

# DNS конфигурация
set system name-server 8.8.8.8

# Syslog сервер по имени
set system syslog host syslog.corp.local facility all level info
set system syslog host syslog.corp.local protocol tcp
set system syslog host syslog.corp.local port 514

commit
save
exit

# Проверить резолюцию syslog сервера
nslookup syslog.corp.local
```

### DNS Forwarding

System name-server может использоваться вместе с dns forwarding:

```bash
configure

# System DNS (для самой VyOS системы)
set system name-server 8.8.8.8
set system name-server 8.8.4.4

# DNS Forwarding (для клиентов LAN)
set service dns forwarding listen-address 192.168.1.1
set service dns forwarding name-server 8.8.8.8
set service dns forwarding name-server 8.8.4.4

commit
save
exit
```

Разница:
- `system name-server` - используется самой системой VyOS
- `service dns forwarding name-server` - upstream серверы для клиентов

### VPN

DNS используется для резолюции удаленных VPN endpoint:

```bash
configure

# DNS конфигурация
set system name-server 8.8.8.8

# IPsec VPN с peer по имени
set vpn ipsec site-to-site peer vpn-gateway.example.com
set vpn ipsec site-to-site peer vpn-gateway.example.com authentication mode pre-shared-secret
set vpn ipsec site-to-site peer vpn-gateway.example.com authentication pre-shared-secret secret123

commit
save
exit

# Проверить резолюцию VPN peer
nslookup vpn-gateway.example.com
```

### Containers

DNS используется для загрузки container images:

```bash
configure

# DNS конфигурация
set system name-server 8.8.8.8

# Container с image из registry по имени
set container name nginx image docker.io/nginx:latest

commit
save
exit

# Проверить резолюцию registry
nslookup docker.io
```

## Скрипты автоматизации

### Скрипт проверки DNS здоровья

```bash
sudo tee /config/scripts/dns-health-check.sh > /dev/null <<'EOF'
#!/bin/bash
# DNS Health Check Script

# Параметры
TEST_DOMAINS="google.com cloudflare.com yandex.ru"
DNS_SERVERS=$(grep ^nameserver /etc/resolv.conf | awk '{print $2}')
TIMEOUT=5

echo "=== DNS Health Check ==="
echo "Date: $(date)"
echo ""

# Проверка каждого DNS сервера
for dns in $DNS_SERVERS; do
    echo "Testing DNS server: $dns"

    # Проверка доступности DNS сервера
    if ping -c 1 -W 1 $dns > /dev/null 2>&1; then
        echo "  [OK] DNS server is reachable"
    else
        echo "  [FAIL] DNS server is unreachable"
        continue
    fi

    # Проверка резолюции тестовых доменов
    for domain in $TEST_DOMAINS; do
        start=$(date +%s%N)
        result=$(dig @$dns $domain +time=$TIMEOUT +tries=1 +short 2>&1)
        end=$(date +%s%N)

        if [ $? -eq 0 ] && [ -n "$result" ]; then
            duration=$(( ($end - $start) / 1000000 ))
            echo "  [OK] $domain resolved in ${duration}ms"
        else
            echo "  [FAIL] $domain resolution failed"
        fi
    done

    echo ""
done

echo "=== DNS Health Check Complete ==="
EOF

chmod +x /config/scripts/dns-health-check.sh

# Запустить проверку
/config/scripts/dns-health-check.sh
```

### Скрипт автоматического выбора лучшего DNS

```bash
sudo tee /config/scripts/dns-benchmark.sh > /dev/null <<'EOF'
#!/bin/bash
# DNS Benchmark Script

DNS_CANDIDATES="8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 77.88.8.8 77.88.8.1"
TEST_DOMAIN="google.com"
TEST_COUNT=10

echo "=== DNS Benchmark ==="

declare -A dns_times

for dns in $DNS_CANDIDATES; do
    echo -n "Testing $dns ... "

    total=0
    success=0

    for i in $(seq 1 $TEST_COUNT); do
        start=$(date +%s%N)
        dig @$dns $TEST_DOMAIN +time=2 +tries=1 +short > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            end=$(date +%s%N)
            duration=$(( ($end - $start) / 1000000 ))
            total=$(( $total + $duration ))
            success=$(( $success + 1 ))
        fi
    done

    if [ $success -gt 0 ]; then
        avg=$(( $total / $success ))
        dns_times[$dns]=$avg
        echo "Average: ${avg}ms (${success}/${TEST_COUNT} success)"
    else
        echo "FAILED"
    fi
done

echo ""
echo "=== Recommended DNS Servers ==="

# Сортировать по времени
for dns in "${!dns_times[@]}"; do
    echo "${dns_times[$dns]} $dns"
done | sort -n | head -3 | while read time dns; do
    echo "set system name-server $dns  # ${time}ms"
done
EOF

chmod +x /config/scripts/dns-benchmark.sh

# Запустить benchmark
/config/scripts/dns-benchmark.sh
```

### Скрипт экспорта DNS конфигурации

```bash
sudo tee /config/scripts/export-dns-config.sh > /dev/null <<'EOF'
#!/bin/vbash
# Export DNS Configuration to JSON

source /opt/vyatta/etc/functions/script-template

OUTPUT_FILE="/config/dns-config-export.json"

echo "{" > "$OUTPUT_FILE"
echo "  \"timestamp\": \"$(date -Iseconds)\"," >> "$OUTPUT_FILE"
echo "  \"hostname\": \"$(hostname)\"," >> "$OUTPUT_FILE"
echo "  \"name_servers\": [" >> "$OUTPUT_FILE"

# Получить DNS серверы
NAMESERVERS=$(grep ^nameserver /etc/resolv.conf | awk '{print $2}')
FIRST=1
for ns in $NAMESERVERS; do
    if [ $FIRST -eq 1 ]; then
        FIRST=0
    else
        echo "," >> "$OUTPUT_FILE"
    fi
    echo -n "    \"$ns\"" >> "$OUTPUT_FILE"
done

echo "" >> "$OUTPUT_FILE"
echo "  ]," >> "$OUTPUT_FILE"
echo "  \"domain_search\": [" >> "$OUTPUT_FILE"

# Получить domain-search
SEARCH=$(grep ^search /etc/resolv.conf | sed 's/search //')
FIRST=1
for domain in $SEARCH; do
    if [ $FIRST -eq 1 ]; then
        FIRST=0
    else
        echo "," >> "$OUTPUT_FILE"
    fi
    echo -n "    \"$domain\"" >> "$OUTPUT_FILE"
done

echo "" >> "$OUTPUT_FILE"
echo "  ]" >> "$OUTPUT_FILE"
echo "}" >> "$OUTPUT_FILE"

echo "DNS configuration exported to $OUTPUT_FILE"
cat "$OUTPUT_FILE"
EOF

chmod +x /config/scripts/export-dns-config.sh

# Запустить экспорт
/config/scripts/export-dns-config.sh
```

## Связанные документы

- [System Configuration](/docs/vyos/system/) - Общая конфигурация системы
- [Host Name](/docs/vyos/system/vyos-host-name/) - Настройка имени хоста и статических записей
- [DNS Forwarding](/docs/vyos/services/vyos-dns/) - DNS сервер для клиентов
- [NTP](/docs/vyos/services/vyos-ntp/) - Настройка времени и NTP
- [Syslog](/docs/vyos/system/vyos-syslog/) - Настройка системного логирования
- [VPN](/docs/vyos/vpn/) - VPN конфигурация
- [Containers](/docs/vyos/containers/) - Управление контейнерами

## Дополнительные ресурсы

- [RFC 1034 - Domain Names - Concepts and Facilities](https://tools.ietf.org/html/rfc1034)
- [RFC 1035 - Domain Names - Implementation and Specification](https://tools.ietf.org/html/rfc1035)
- [RFC 1123 - Requirements for Internet Hosts](https://tools.ietf.org/html/rfc1123)
- [VyOS Documentation - Name Server](https://docs.vyos.io/en/latest/configuration/system/name-server.html)
- [Yandex Cloud DNS](https://cloud.yandex.ru/docs/vpc/concepts/dhcp-options)
- [AWS VPC DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)
- [Azure DNS](https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances)
- [Google Cloud DNS](https://cloud.google.com/vpc/docs/dns)
- [Public DNS Comparison](https://www.dnsperf.com/)

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

Правильная настройка системных DNS серверов (name-server) и списка доменов для поиска (domain-search) в VyOS критически важна для корректной работы всех системных компонентов. DNS используется для обновления пакетов, синхронизации времени через NTP, отправки логов на удаленные серверы, установки VPN соединений и множества других операций.

Ключевые моменты:

1. **Избыточность**: Всегда настраивайте минимум 2-3 DNS сервера для отказоустойчивости
2. **Производительность**: Выбирайте DNS серверы с низким RTT для вашего региона
3. **Облачная интеграция**: Используйте внутренние облачные DNS серверы для резолюции внутренних имен
4. **Безопасность**: Используйте только доверенные DNS серверы
5. **Мониторинг**: Регулярно проверяйте работоспособность DNS
6. **Документирование**: Документируйте выбор DNS серверов и изменения конфигурации

Следуйте рекомендациям из раздела "Лучшие практики" для обеспечения надежной и производительной DNS инфраструктуры в вашей сети VyOS.

