Руководство по настройке DNS
Подробная инструкция по работе с зонами, проверке записей и настройке шифрованного DNS
DNS зона — это область ответственности за определенный домен. Например, зона example.com содержит все DNS записи для этого домена и его поддоменов.
Создание зоны
- Перейдите в раздел DNS Зоны в боковом меню
- Нажмите кнопку Добавить зону
- Введите имя домена (например,
example.com) - Зона будет создана с настройками SOA по умолчанию
Параметры SOA
При создании зоны автоматически заполняются параметры SOA (Start of Authority):
- Serial — версия зоны (увеличивается при каждом изменении)
- Refresh — интервал обновления для secondary NS (секунды)
- Retry — интервал повторной попытки при ошибке обновления
- Expire — время, после которого secondary NS перестает отвечать
- Minimum TTL — время кэширования негативных ответов (NXDOMAIN)
После создания зоны добавьте необходимые DNS записи. Ниже описаны поддерживаемые типы:
| Тип | Имя | Содержимое | Описание |
|---|---|---|---|
| A | @ | 95.213.189.137 | IPv4 адрес домена |
| AAAA | @ | 2606:2800:220:1::248 | IPv6 адрес домена |
| CNAME | www | example.com | Псевдоним (алиас) на другое имя |
| MX | @ | mail.example.com | Почтовый сервер (приоритет в поле Prio) |
| TXT | @ | v=spf1 mx ~all | Текстовая запись (SPF, DKIM, верификация) |
| NS | @ | ns1.clouddns.ru | Указание NS-серверов |
| SRV | _sip._tcp | 10 60 5060 sip.example.com | Сервисная запись (приоритет вес порт цель) |
| CAA | @ | 0 issue letsencrypt.org | Авторизация выпуска сертификатов |
| PTR | 34 | example.com | Обратная запись (reverse DNS) |
@ означает корень зоны. Например, для зоны example.com запись с именем @ типа A вернет IP адрес при запросе example.com. Запись с именем www ответит на запрос www.example.com.Частые ошибки при создании записей
- MX запись с IP адресом — содержимое MX должно быть именем хоста, а не IP адресом. Используйте
mail.example.com, а не192.168.1.1 - CNAME на корне зоны — нельзя создать CNAME для
@, это нарушает RFC. Используйте A/AAAA записи - Несовпадение имени — убедитесь, что имя записи соответствует запрашиваемому домену. Для корня зоны используйте
@ - Отключенные записи — проверьте, что запись не деактивирована
Чтобы CloudDNS начал обслуживать ваш домен, необходимо делегировать его на наши NS серверы у вашего регистратора домена.
Наши NS серверы
ns1.clouddns.ru ns2.clouddns.ru
Порядок действий
- Войдите в панель управления вашего регистратора домена
- Найдите раздел управления NS серверами (DNS серверы / Nameservers)
- Замените текущие NS серверы на
ns1.clouddns.ruиns2.clouddns.ru - Сохраните изменения
- Дождитесь распространения (от 1 до 48 часов)
После настройки зоны и добавления записей убедитесь, что все работает корректно.
Проверка через dig
Утилита dig — стандартный инструмент для DNS диагностики:
# Проверка A записи напрямую через наш DNS сервер dig @ns1.clouddns.ru A example.com # Проверка MX записи dig @ns1.clouddns.ru MX example.com # Проверка TXT записи (SPF, DKIM) dig @ns1.clouddns.ru TXT example.com # Проверка CNAME dig @ns1.clouddns.ru CNAME www.example.com # Проверка ANY (все записи) dig @ns1.clouddns.ru ANY example.com # Короткий формат (только ответы) dig @ns1.clouddns.ru A example.com +short # Проверка через публичный DNS (после делегирования) dig @77.88.8.8 A example.com
Проверка через nslookup
# Проверка A записи nslookup example.com ns1.clouddns.ru # Проверка MX записи nslookup -type=MX example.com ns1.clouddns.ru # Проверка NS делегирования nslookup -type=NS example.com
Проверка через DoH (curl)
# DNS-over-HTTPS запрос в формате JSON curl -s "https://dns.clouddns.ru/dns-query?name=example.com&type=A" \ -H "Accept: application/dns-json" | jq . # DNS-over-HTTPS запрос в формате wireformat curl -s "https://dns.clouddns.ru/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE" \ -H "Accept: application/dns-message" | hexdump -C
Ожидаемые ответы
- NOERROR — запрос успешен, ответ получен
- NXDOMAIN — имя не существует в зоне (проверьте имя записи)
- REFUSED — зона не обслуживается сервером (проверьте делегирование)
- SERVFAIL — ошибка на сервере (обратитесь в поддержку)
NS серверы делегированы
У регистратора указаны ns1.clouddns.ru и ns2.clouddns.ru. Проверьте: dig NS example.com
A/AAAA записи на корне зоны
Создайте записи с именем @ для основного домена
MX записи для почты
Содержимое — имя хоста (не IP). Приоритет: меньше = важнее. Дополнительно создайте A запись для почтового сервера
TTL значения
Низкий TTL (300с) удобен при отладке. Для продакшена используйте 3600с и выше
SPF/DKIM/DMARC записи
Для почтовых доменов обязательно настройте TXT записи для аутентификации email
Записи не отключены
Убедитесь, что нужные записи активны (не деактивированы)
Время распространения
После изменения NS у регистратора подождите до 48 часов. Записи внутри зоны обновляются за 30 секунд
Web Application Firewall (WAF) — это межсетевой экран уровня приложений, который анализирует HTTP-запросы к вашему сайту и блокирует вредоносный трафик. В CloudDNS WAF работает на базе Coraza (совместим с ModSecurity) и доступен для записей с включенным проксированием.
Как это работает
- Вы создаете A или AAAA запись и включаете проксирование (иконка облака)
- DNS начинает отдавать IP-адрес прокси-сервера CloudDNS вместо вашего origin-сервера
- Весь HTTP/HTTPS трафик проходит через прокси, где применяются правила WAF
- Легитимные запросы пропускаются на ваш origin-сервер, вредоносные — блокируются
Предварительные шаги
- Перейдите на страницу зоны и создайте A-запись с включенным проксированием
- Перейдите в Настройки прокси и проверьте, что origin-адрес указывает на ваш сервер
- Перейдите в Правила WAF для управления защитой
Набор правил OWASP CRS
При создании зоны автоматически включается набор правил OWASP Core Rule Set (CRS) — это проверенный набор из сотен правил, защищающий от основных веб-атак: SQL-инъекции, XSS, path traversal, сканирование уязвимостей и другие угрозы из OWASP Top 10.
Вы можете включать и отключать набор OWASP CRS на странице Правила WAF в разделе «Наборы правил».
Помимо набора OWASP CRS, вы можете создавать собственные правила WAF для точной настройки под ваше приложение.
Структура правила
Каждое правило WAF состоит из четырех частей:
| Поле | Описание |
|---|---|
| Expression | Переменная и оператор для проверки запроса (что анализировать) |
| Action | Действие при срабатывании: deny, block, allow, pass, log, drop |
| Priority | Порядок выполнения (меньше = раньше) |
| Description | Описание правила для удобства администратора |
Доступные действия (Action)
| Действие | Описание |
|---|---|
| deny | Отклонить запрос с кодом 403 Forbidden |
| block | Заблокировать запрос (аналогично deny) |
| drop | Сбросить соединение без ответа |
| allow | Пропустить запрос без дальнейших проверок |
| pass | Продолжить проверку следующими правилами |
| log | Записать в лог без блокировки |
Переменные для Expression
Expression состоит из переменной (что проверять) и оператора (как проверять). Основные переменные:
| Переменная | Что проверяет |
|---|---|
| REMOTE_ADDR | IP-адрес клиента |
| REQUEST_URI | Полный URL запроса (путь + query string) |
| REQUEST_METHOD | HTTP-метод (GET, POST, PUT, DELETE) |
| REQUEST_HEADERS | Все заголовки запроса |
| REQUEST_HEADERS:User-Agent | Заголовок User-Agent |
| ARGS | Все параметры запроса (GET + POST) |
| REQUEST_BODY | Тело POST-запроса |
| GEO:COUNTRY_CODE | Код страны по GeoIP (если доступно) |
Операторы для Expression
| Оператор | Описание |
|---|---|
| @rx pattern | Совпадение по регулярному выражению |
| @eq value | Точное совпадение |
| @contains text | Содержит подстроку |
| @beginsWith prefix | Начинается с указанной строки |
| @endsWith suffix | Заканчивается указанной строкой |
| @ipMatch 1.2.3.0/24 | Совпадение по IP-адресу или подсети (CIDR) |
Примеры правил
Блокировка IP-адреса:
Expression: REMOTE_ADDR @ipMatch 192.168.1.100 Action: deny Описание: Блокировка подозрительного IP
Блокировка подсети:
Expression: REMOTE_ADDR @ipMatch 10.0.0.0/8 Action: deny Описание: Блокировка внутренней подсети
Блокировка ботов по User-Agent:
Expression: REQUEST_HEADERS:User-Agent @rx (sqlmap|nikto|nmap|masscan) Action: deny Описание: Блокировка известных сканеров уязвимостей
Блокировка доступа к админ-панели:
Expression: REQUEST_URI @beginsWith /wp-admin Action: deny Описание: Запрет доступа к WordPress админке
Блокировка подозрительных запросов в URL:
Expression: REQUEST_URI @rx (\.\.[\/]|etc/passwd|/proc/self) Action: deny Описание: Защита от path traversal
Блокировка SQL-инъекций в параметрах:
Expression: ARGS @rx (union.*select|insert.*into|drop.*table) Action: deny Описание: Базовая защита от SQL-инъекций
Разрешение только GET и POST:
Expression: REQUEST_METHOD @rx ^(PUT|DELETE|PATCH|OPTIONS)$ Action: deny Описание: Разрешить только GET и POST методы
Логирование запросов к API:
Expression: REQUEST_URI @beginsWith /api/ Action: log Описание: Логирование всех запросов к API
Ограничения
- Максимальная длина expression — 1024 символа
- Максимальная длина описания — 512 символов
- В expression запрещены символы: двойные кавычки, обратные слеши, переносы строк
- Action должен быть одним из: deny, block, allow, pass, log, drop, redirect
Порядок создания правил
- Перейдите на страницу зоны и нажмите Правила WAF
- Нажмите Добавить правило
- Заполните Expression, выберите Action, укажите приоритет
- Правило можно включать и отключать без удаления
- Изменения применяются в течение 30 секунд
log, чтобы убедиться, что expression срабатывает на нужные запросы. После проверки смените действие на deny.DoH шифрует DNS запросы внутри HTTPS-соединения (порт 443). Трафик неотличим от обычного веб-трафика, что затрудняет его блокировку.
https://dns.clouddns.ru/dns-queryПоддержка в браузерах
- Firefox: Настройки → Сеть → Включить DNS через HTTPS → указать URL
- Chrome/Edge: Настройки → Безопасность → Использовать защищенный DNS → указать URL
Проверка через curl
# Проверка DoH (JSON формат)
curl -s "https://dns.clouddns.ru/dns-query?name=example.com&type=A" \
-H "Accept: application/dns-json"
# Проверка DoH (wireformat, RFC 8484)
echo -n "q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE=" | \
base64 -d | \
curl -s -X POST "https://dns.clouddns.ru/dns-query" \
-H "Content-Type: application/dns-message" \
--data-binary @- | hexdump -CDoT шифрует DNS запросы с помощью TLS на выделенном порту 853. Это стандартный способ шифрования DNS, поддерживаемый большинством ОС и маршрутизаторов.
dns.clouddns.ru, порт 853Проверка через kdig (knot-dnsutils)
# Установка (Debian/Ubuntu) sudo apt install knot-dnsutils # Проверка DoT kdig @dns.clouddns.ru +tls A example.com # С явным указанием порта kdig @dns.clouddns.ru -p 853 +tls A example.com
Проверка через openssl
# Подключение к DoT серверу openssl s_client -connect dns.clouddns.ru:853 -quiet
DoQ — новейший протокол шифрованного DNS, основанный на QUIC (UDP). Обеспечивает низкую задержку за счет отсутствия TCP handshake и встроенного шифрования.
dns.clouddns.ru, порт 853 (UDP/QUIC)Проверка через q (DNS client)
# Установка q (https://github.com/natesales/q) # Linux curl -sL https://github.com/natesales/q/releases/latest/download/q-linux-amd64 \ -o /usr/local/bin/q && chmod +x /usr/local/bin/q # Проверка DoQ q A example.com @quic://dns.clouddns.ru:853
Проверка через dnslookup
# Установка dnslookup go install github.com/ameshkov/dnslookup@latest # Проверка DoQ dnslookup example.com quic://dns.clouddns.ru:853
MikroTik RouterOS 6.47+ поддерживает DoH. RouterOS 7 добавляет улучшенную поддержку с верификацией сертификатов.
DNS-over-HTTPS (RouterOS 6.47+)
# 1. Импортируйте корневые сертификаты /tool fetch url=https://curl.se/ca/cacert.pem /certificate import file-name=cacert.pem passphrase="" # 2. Настройте DoH /ip dns set use-doh-server="https://dns.clouddns.ru/dns-query" verify-doh-cert=yes # 3. Очистите обычные DNS серверы (опционально) /ip dns set servers="" # 4. Разрешите удаленные запросы (если роутер выступает DNS для LAN) /ip dns set allow-remote-requests=yes # 5. Проверьте /ip dns print /ip dns cache print
DNS-over-HTTPS (RouterOS 7)
# RouterOS 7 — упрощенная настройка /ip/dns/set use-doh-server="https://dns.clouddns.ru/dns-query" \ verify-doh-cert=yes # Очистите fallback серверы /ip/dns/set servers="" # Проверка /ip/dns/print /ip/dns/cache/print
Классический DNS (без шифрования)
# Если DoH не нужен — используйте обычный DNS /ip dns set servers=<IP_ВАШЕГО_FORWARDER>:5353 # Проверка /ping dns.clouddns.ru count=3
Перенаправление DNS трафика из LAN
# Перехват всех DNS запросов из LAN и перенаправление на роутер /ip firewall nat add chain=dstnat protocol=tcp dst-port=53 \ action=redirect to-ports=53 comment="Redirect DNS TCP" /ip firewall nat add chain=dstnat protocol=udp dst-port=53 \ action=redirect to-ports=53 comment="Redirect DNS UDP"
DNS-over-TLS через systemd-resolved
systemd-resolved (Ubuntu 18.04+, Fedora, Arch) поддерживает DoT из коробки:
# Редактируем конфигурацию sudo nano /etc/systemd/resolved.conf # Добавьте/измените следующие строки: [Resolve] DNS=<IP_ВАШЕГО_СЕРВЕРА> DNSOverTLS=yes Domains=~. # Перезапустите сервис sudo systemctl restart systemd-resolved # Проверьте статус resolvectl status resolvectl query example.com
DNS-over-TLS через stubby
stubby — легковесный DNS stub resolver с поддержкой DoT:
# Установка
sudo apt install stubby # Debian/Ubuntu
sudo dnf install stubby # Fedora
# Конфигурация: /etc/stubby/stubby.yml
resolution_type: GETDNS_RESOLUTION_STUB
dns_transport_list:
- GETDNS_TRANSPORT_TLS
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
upstream_recursive_servers:
- address_data: <IP_ВАШЕГО_СЕРВЕРА>
tls_auth_name: "dns.clouddns.ru"
tls_port: 853
listen_addresses:
- 127.0.0.1@53
- 0::1@53
# Перезапуск
sudo systemctl restart stubby
# Укажите системе использовать stubby
sudo resolvectl dns eth0 127.0.0.1
# или в /etc/resolv.conf:
# nameserver 127.0.0.1DNS-over-HTTPS через cloudflared (dnsproxy)
cloudflared можно использовать как локальный DoH прокси для любого DoH провайдера:
# Установка dnsproxy (универсальный вариант) wget https://github.com/AdguardTeam/dnsproxy/releases/latest/download/dnsproxy-linux-amd64-*.tar.gz tar xzf dnsproxy-linux-amd64-*.tar.gz sudo mv dnsproxy /usr/local/bin/ # Запуск локального DoH прокси dnsproxy -l 127.0.0.1 -p 53 -u https://dns.clouddns.ru/dns-query # Или в качестве systemd сервиса: sudo tee /etc/systemd/system/dnsproxy.service << 'EOF' [Unit] Description=DNS Proxy (DoH) After=network.target [Service] ExecStart=/usr/local/bin/dnsproxy -l 127.0.0.1 -p 53 \ -u https://dns.clouddns.ru/dns-query Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now dnsproxy # Настройте систему на 127.0.0.1 echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
DNS-over-QUIC через dnsproxy
# dnsproxy поддерживает все протоколы, включая DoQ dnsproxy -l 127.0.0.1 -p 53 -u quic://dns.clouddns.ru:853
Проверка итогового результата
# Проверка текущего DNS резолвера cat /etc/resolv.conf # Проверка через dig dig example.com +short # Проверка DoT соединения resolvectl status | grep -A5 "DNS Server" # Проверка утечки DNS (должен отвечать ваш сервер) dig whoami.cloudflare TXT CH +short
/etc/resolv.conf может перезаписываться. Используйте nmcli или настройте DNS через NetworkManager: nmcli con mod "Connection" ipv4.dns "127.0.0.1"