Tutorial
Развертывание и управление DNS с использованием DNSControl в Debian 10
Автор выбрал Electronic Frontier Foundation Inc для получения пожертвований в рамках программы Write for DOnations.
Введение
DNSControl — это инструмент, построенный по принципу «инфраструктура как код», который поддерживает развертывание и управление зонами DNS с использованием стандартных принципов разработки программного обеспечения, включая контроль версий, тестирование и автоматизированное развертывание. Инструмент DNSControl разработан Stack Exchange и написан на Go.
Использование DNSControl помогает избавиться от многих сложностей ручного управления DNS, поскольку файлы зон хранятся в программируемом формате. Инструмент позволяет одновременно развертывать зоны для нескольких поставщиков DNS, определять ошибки синтаксиса и автоматически извлекать конфигурации DNS, за счет чего снижается риск человеческой ошибки. Также DNSControl часто используется для быстрого переноса DNS на другого провайдера; например, в случае DDoS-атаки или выхода системы из строя.
В этом обучающем руководстве мы научимся устанавливать и настраивать DNSControl, создадим базовую конфигурацию DNS и начнем развертывание записей DNS на рабочем провайдере. Для этого обучающего руководства мы используем DigitalOcean в качестве примера провайдера DNS. Если вы хотите использовать другого провайдера, настройки будут выглядеть очень похоже. После завершения работы вы сможете управлять своей конфигурацией DNS и тестировать ее в безопасной среде, отключенной от сети, а затем автоматически развертывать в производственной среде.
Предварительные требования
Для прохождения этого обучающего руководства вам потребуется следующее:
- Один сервер Debian 10, настроенный в соответствии с указаниями по начальной настройке сервера Debian 10, включая пользователя sudo без привилегий root и активированный брандмауэр для блокировки ненужных портов.
your-server-ipv4-address
обозначает IP-адрес сервера, где вы размещаете свой сайт или домен.your-server-ipv6-address
обозначает адрес IPv6 сервера, где вы размещаете свой сайт или домен. - Полностью зарегистрированное доменное имя с хостингом DNS у поддерживаемого провайдера. В этом обучающем руководстве мы используем доменное имя
your_domain
и DigitalOcean как провайдера услуг. - Ключ DigitalOcean API (персональный токен доступа) с разрешениями чтения и записи. Его создание описано в материале Создание персонального токена доступа.
Подготовив все вышеперечисленное, войдите на сервер без привилегий root, чтобы начать подготовку.
Шаг 1 — Установка DNSControl
Инструмент DNSControl написан на языке Go, и поэтому вначале вам нужно установить Go на свой сервер и задать GOPATH
.
Go доступен в репозиториях программного обеспечения Debian по умолчанию, и поэтому его можно установить с помощью стандартных инструментов управления пакетами.
Также вам нужно будет установить Git, поскольку это требуется, чтобы дать Go возможность загрузки и установки программного обеспечения DNSControl из репозитория на GitHub.
Для начала мы обновим указатель локальных пакетов, чтобы отразить последние изменения на предыдущих уровнях:
- sudo apt update
Затем мы установим пакеты golang-go
и git
:
- sudo apt install golang-go git
После подтверждения установки apt
выполнит загрузку и установку Go и Git, а также всех требуемых зависимостей.
Далее вы настроите требуемые переменные среды path для Go. Дополнительную информацию можно получить в обучающем материале по GOPATH. Для начала отредактируем файл ~/.profile
:
- nano ~/.profile
Добавим в конец файла следующие строки:
...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"
После добавления этих строк в конец файла мы сохраним и закроем его. Затем мы перезагрузим профиль, для чего выйдем из системы и снова войдем в нее или снова укажем файл в качестве источника:
- source ~/.profile
Мы установили и настроили Go и теперь можем перейти к установке DNSControl.
Команду go get
можно использовать для доставки копии кода, его автоматической компиляции и установки в директорию Go:
- go get github.com/StackExchange/dnscontrol
После этого мы можем проверить установленную версию и убедиться, что все работает правильно:
- dnscontrol version
Экран результатов должен выглядеть примерно следующим образом:
Outputdnscontrol 2.9-dev
Если выводится сообщение об ошибке dnscontrol: command not found
, необходимо еще раз проверить настройки путей Go.
Мы установили DNSControl и теперь можем создать директорию конфигурации и подключить DNSControl к провайдеру DNS, чтобы дать инструменту возможность вносить изменения в ваши записи DNS.
Шаг 2 — Настройка DNSControl
На этом шаге мы создадим требуемые директории конфигурации DNSControl и подключим их к нашему провайдеру DNS, чтобы начать вносить изменения в записи DNS в реальном времени.
Вначале нам нужно создать новую директорию для хранения конфигурации DNSControl и перейти в нее:
- mkdir ~/dnscontrol
- cd ~/dnscontrol
Примечание. В этом обучающем модуле мы рассматриваем начальную настройку DNSControl, но для использования в производственной среде рекомендуется хранить конфигурацию DNSControl в системе контроля версий (VCS), такой как Git. Это дает преимущества полного контроля версий, интеграции с CI/CD для тестирования, удобства откатов при развертывании и т. д.
Если вы планируете использовать DNSControl для записи файлов зоны BIND, вам также следует создать директорию zones
:
- mkdir ~/dnscontrol/zones
Файлы зоны BIND представляют собой чистый стандартизированный метод сохранения зон и записей DNS в простом текстовом формате. Они первоначально использовались для программного обеспечения сервера BIND DNS, однако сейчас они широко используются в качестве стандартного метода хранения зон DNS. Файлы зоны BIND, предоставляемые DNSControl, очень полезны, если их нужно импортировать в персонализированный или собственный сервер DNS, а также для целей аудита.
Если вы хотите просто использовать DNSControl для передачи изменений DNS управляемому провайдеру, директория zones
не потребуется.
Далее требуется настроить файл creds.json
, что позволит DNSControl выполнить аутентификацию вашего провайдера DNS и внести изменения. Формат файла creds.json
может немного отличаться в зависимости от используемого провайдера DNS. Ознакомьтесь со списком провайдеров в официальной документации DNSControl, чтобы найти конфигурацию для вашего провайдера.
Создайте файл creds.json
в директории ~/dnscontrol
:
- cd ~/dnscontrol
- nano creds.json
Добавьте в файл образец конфигурации creds.json
для вашего провайдера DNS. Если вы используете DigitalOcean в качестве своего провайдера DNS, вы можете использовать следующее:
{
"digitalocean": {
"token": "your-digitalocean-oauth-token"
}
}
Этот файл сообщает DNSControl, к каким провайдерам DNS нужно подключаться.
Необходимо указать форму аутентификации для провайдера DNS. Обычно это ключ API или токен OAuth, однако для некоторых провайдеров требуется дополнительная информация, как описано в списке провайдеров в официальной документации DNSControl.
Предупреждение. Этот токен предоставляет доступ к учетной записи провайдера DNS, так что его следует защитить паролем. Также необходимо убедиться, что если вы используете систему контроля версий, файл с токеном исключен (например, с помощью .gitignore
) или зашифрован.
Если в качестве провайдера DNS используется DigitalOcean, можно использовать требуемый токен OAuth в параметрах учетной записи DigitalOcean, сгенерированных при выполнении предварительных требований.
Если вы используете нескольких провайдеров DNS, например для разных доменных имен или делегированных зон DNS, вы можете определить их в том же самом файле creds.json
.
Мы выполнили настройку первоначальных директорий конфигурации DNSControl и настроили файл creds.json
так, чтобы DNSControl мог проходить аутентификацию у провайдера DNS и вносить изменения. Теперь мы создадим конфигурацию для наших зон DNS.
Шаг 3 — Создание файла конфигурации DNS
На этом шаге мы создадим начальный файл конфигурации DNS, который будет содержать записи DNS для вашего доменного имени или делегированной зоны DNS.
dnsconfig.js
— основной файл конфигурации DNS для DNSControl. В этом файле зоны DNS и соответствующие им записи определяются с использованием синтаксиса JavaScript. Этот синтаксис называется DSL или предметно-ориентированный язык. Дополнительную информацию можно найти на странице JavaScript DSL в официальной документации по DNSControl.
Вначале создадим файл конфигурации DNS в директории ~/dnscontrol
:
- cd ~/dnscontrol
- nano dnsconfig.js
Затем добавим в файл следующий образец конфигурации:
// Providers:
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');
// Domains:
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address')
);
В файле образца определяется доменное имя или зона DNS определенного провайдера. В данном случае это домен your_domain
на хостинге DigitalOcean. Пример записи A
также определен для зоны root (@
) и указывает на адрес IPv4 сервера, где размещен ваш домен или сайт.
Базовый файл конфигурации DNSControl состоит из трех основных функций:
NewRegistrar(имя, тип, метаданные)
: определяет регистратора домена для доменного имени. DNSControl может использовать эту функцию для внесения требуемых изменений, в частности для модификации авторитетных серверов имен. Если вы хотите использовать DNSControl только для управления зонами DNS, их можно оставить какNONE
.NewDnsProvider(имя, тип, метаданные)
: определяет провайдера DNS для доменного имени или делегированной зоны. Здесь DNSControl применяет вносимые нами изменения DNS.D(имя, регистратор, модификаторы)
: определяет доменное имя или делегируемую зону DNS для управления DNSControl, а также присутствующие в зоне записи DNS.
Мы должны настроить NewRegistrar()
, NewDnsProvider()
и D()
соответствующим образом, используя список провайдеров в официальной документации по DNSControl.
Если в качестве провайдера DNS используется DigitalOcean и нам требуется только вносить изменения DNS (а не авторитетных серверов имен), образцы из предыдущего блока кода подойдут для наших целей.
После завершения следует сохранить и закрыть файл.
На этом шаге мы настроили файл конфигурации DNS для DNSControl с определением соответствующих провайдеров. Далее мы заполним файл полезными записями DNS.
Шаг 4 — Заполнение файла конфигурации DNS
Далее мы можем заполнить файл конфигурации DNS полезными записями DNS для нашего сайта или сервиса, используя синтаксис DNSControl.
В отличие от традиционных файлов зоны BIND, где записи DNS имеют формат построчных необработанных данных, в DNSControl записи DNS определяются как параметр функции D()
(модификатор домена), как мы вкратце показали на шаге 3.
Модификатор домена существует для каждого стандартного типа записей DNS, включая A
, AAAA
, MX
, TXT
, NS
, CAA
и т. д. Полный список доступных типов записей можно найти в разделе Модификаторы домена в документации по DNSControl.
Также доступны модификаторы отдельных записей (модификаторы записей). Они в основном используются для настройки TTL (времени существования) для отдельных записей. Полный список доступных модификаторов записей можно найти в разделе Модификаторы записей документации по DNSControl. Модификаторы записей необязательны для использования, в большинстве простых случаев их можно опускать.
Синтаксис настройки записей DNS немного отличается для каждого типа записей. Далее приведены несколько примеров наиболее распространенных типов записей:
Записи
A
:- Назначение: указывают на адрес IPv4.
- Синтаксис:
A('name', 'address', необязательные модификаторы записи)
- Пример:
A('@', 'your-server-ipv4-address', TTL(30))
Записи
AAAA
:- Назначение: указывают на адрес IPv6.
- Синтаксис:
AAAA('name', 'address', необязательные модификаторы записи)
- Пример:
AAAA('@', 'your-server-ipv6-address')
(модификатор записи опущен, поэтому используется TTL по умолчанию)
Записи
CNAME
:- Назначение: делают домен или субдомен псевдонимом другого домена или субдомена.
- Синтаксис:
CNAME('name', 'target', необязательные модификаторы записи)
- Пример:
CNAME('subdomain1', 'example.org.')
(обратите внимание, что если значение содержит точку, завершающий символ.
обязательно должен присутствовать в конце)
Записи
MX
:- Назначение: направление электронной почты на определенные серверы или адреса.
- Синтаксис:
MX('name', 'priority', 'target', необязательные модификаторы записи)
- Пример:
MX('@', 10, 'mail.example.net')
(обратите внимание, что если значение содержит точку, завершающий символ.
обязательно должен присутствовать в конце)
Записи
TXT
:- Назначение: добавление произвольного обычного текста, часто используется для конфигураций без собственного выделенного типа записи.
- Синтаксис:
TXT('name', 'content', необязательные модификаторы записи)
- Пример:
TXT('@', 'Это запись TXT. ')
Записи
CAA
:- Назначение: ограничение и отчет о центрах сертификации (СА), которые могут выпускать сертификаты TLS для доменов или субдоменов.
- Синтаксис:
CAA('name', 'tag', 'value', необязательные модификаторы записи)
- Пример:
CAA('@', 'issue', 'letsencrypt.org')
Чтобы начать добавлять записи DNS для нашего домена или делегированной зоны DNS, нам нужно отредактировать файл конфигурации DNS:
- nano dnsconfig.js
Далее мы можем начать указывать параметры для существующей функции D()
, используя синтаксис,описанный в предыдущем списке и в разделе Модификаторы доменов официальной документации DNSControl. Для разделения записей должна использоваться запятая (,
).
Приведенный здесь блок кода содержит полный образец базовой конфигурации DNS, предназначенный для справочных целей:
...
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address'),
A('www', 'your-server-ipv4-address'),
A('mail', 'your-server-ipv4-address'),
AAAA('@', 'your-server-ipv6-address'),
AAAA('www', 'your-server-ipv6-address'),
AAAA('mail', 'your-server-ipv6-address'),
MX('@', 10, 'mail.your_domain.'),
TXT('@', 'v=spf1 -all'),
TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;')
);
После завершения начальной настройки DNS следует сохранить и закрыть файл.
На этом шаге мы можем настроить начальный файл конфигурации DNS, содержащий наши записи DNS. Далее нам нужно будет протестировать конфигурацию и развернуть ее.
Шаг 5 — Тестирование и развертывание конфигурации DNS
На этом шаге мы проведем проверку локального синтаксиса нашей конфигурации DNS, а затем внесем изменения на рабочий сервер/провайдер DNS.
Вначале мы перейдем в директорию dnscontrol
:
- cd ~/dnscontrol
Затем мы используем функцию preview
в DNSControl для проверки синтаксиса файла и вывода вносимых изменений (без их фактического внесения):
- dnscontrol preview
Если файл конфигурации DNS имеет правильный синтаксис, DNSControl выведет обзор изменений, которые будут произведены. Результат должен выглядеть примерно так:
Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE A your_domain your-server-ipv4-address ttl=300
#2: CREATE A www.your_domain your-server-ipv4-address ttl=300
#3: CREATE A mail.your_domain your-server-ipv4-address ttl=300
#4: CREATE AAAA your_domain your-server-ipv6-address ttl=300
#5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
#6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
#7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
----- Registrar: none...0 corrections
Done. 8 corrections.
Если вы увидите предупреждение об ошибке в составе результатов, DNSControl даст дополнительные данные о сущности ошибки и ее расположении в файле.
Предупреждение. Следующая команда вносит изменения в рабочие записи DNS и возможно в другие параметры. Необходимо убедиться, что мы готовы к этому. В частности, следует сделать резервную копию существующий конфигурации DNS на случай, если потребуется произвести откат.
В заключение мы можем передать изменения на рабочий провайдер DNS:
- dnscontrol push
Результат будет выглядеть примерно так:
Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
SUCCESS!
#2: CREATE A your_domain your-server-ipv4-address ttl=300
SUCCESS!
#3: CREATE AAAA your_domain your-server-ipv6-address ttl=300
SUCCESS!
#4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#6: CREATE A www.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#7: CREATE A mail.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
SUCCESS!
----- Registrar: none...0 corrections
Done. 8 corrections.
Если теперь мы проверим параметры DNS нашего домена на панели управления DigitalOcean, мы увидим изменения.
Также мы можем проверить создание записи, отправив запрос DNS для нашего домена или делегированной зоны с помощью команды dig
.
Если команда dig
не установлена, необходимо установить пакет dnsutils
:
- sudo apt install dnsutils
После установки команды dig
мы сможем использовать ее для запроса DNS нашего домена. Мы увидим, что записи обновлены соответствующим образом:
- dig +short your_domain
В результатах выводится IP-адрес и запись DNS из вашей зоны, которая была развернута с помощью DNSControl. Распространение записей DNS может занять некоторое время, поэтому можно подождать и запустить команду чуть позже.
На этом заключительном шаге мы выполнили проверку локального синтаксиса файла конфигурации DNS, развернули его на рабочем провайдере DNS и убедились, что изменения были внесены успешно.
Заключение
В этом обучающем руководстве мы выполнили настройку DNSControl и развертывание конфигурации DNS на рабочем провайдере. Теперь мы можем управлять изменениями конфигурации DNS и тестировать их в безопасной автономной среде, прежде чем внедрять их в производственную среду.
Если вы хотите узнать об этом больше, DNSControl предусматривает интеграцию с конвейером CI/CD, что позволяет проводить детальные испытания и обеспечивает дополнительный контроль над развертыванием в производственной среде. Также можно интегрировать DNSControl в процессы сборки и развертывания инфраструктуры, что позволит развертывать серверы и добавлять их в службу DNS в полностью автоматическом режиме.
Если вас интересует дополнительная информация о DNSControl, следующие материалы DigitalOcean содержат описание дальнейших шагов по интеграции DNSControl в рабочие процессы управления изменениями и развертывания инфраструктуры: