Развертывание и управление DNS с помощью OctoDNS в Debian 10

OctoDNS – это инструмент, работающий по принципу «инфраструктура как код», который позволяет развертывать и управлять DNS-зонами. Для этого он использует стандартные принципы разработки программного обеспечения, в том числе контроль версий, тестирование и автоматическое развертывание. OctoDNS был создан GitHub и написан на Python.

Инструмент OctoDNS позволяет устранить многие недостатки ручного управления DNS, так как файлы зон хранятся в структурированном формате (YAML). Он может развертывать зоны для нескольких провайдеров DNS одновременно, определять синтаксические ошибки, автоматически активировать конфигурацию DNS, снижая риск человеческой ошибки. Другое распространенное применение OctoDNS – это синхронизация конфигурации DNS между различными провайдерами, такими как система тестирования и производства, или между действующей средой и средами восстановления после отказа.

OctoDNS похож на DNSControl – это аналогичный инструмент, созданный Stack Exchange и написанный на Go. В отличие от OctoDNS, DNSControl применяет для определения зон язык конфигурации на основе JavaScript, что позволяет использовать передовые программные характеристики, такие как петли, и указывать несколько подобных записей в пределах одной зоны.

В этом мануале вы узнаете, как устанавливать и настраивать OctoDNS. Также вы создадите базовую конфигурацию DNS и начнете развертывать записи DNS действующего провайдера. В рамках этого мануале мы будем использовать условный DNS-провайдер: вам нужно будет указать данные своего провайдера. В результате вы получите возможность управлять DNS и проверять конфигурацию в надежной оффлайн-среде, а затем автоматически развернуть ее в производство.

Требования

  • Сервер Debian 10, настроенный по этому мануалу. В мануале мы будем использовать условные IP-адреса your-server-ipv4-address и your-server-ipv6-address.
  • FRDN и DNS от поддерживаемых провайдеров. Полный список таких провайдеров вы найдете здесь.
  • API ключ (токен доступа) вашего провайдера с правом на чтение и запись.

1: Установка OctoDNS

OctoDNS распространяется как pip-пакет Python и работает в виртуальной среде (virtualenv), поэтому начинать нужно с установки зависимостей. Virtualenv – это изолированная среда Python, которая позволяет устанавливать индивидуальные библиотеки и конфигурацию, никак не влияя на общесистемную установку Python. Python и virtualenv доступны в стандартных репозиториях Debian, что позволяет устанавливать их с помощью обычных инструментов управления пакетами.

Начните с обновления локального индекса пакетов, чтобы загрузить все новые версии:

sudo apt update

Затем установите пакеты python и virtualenv:

sudo apt install python virtualenv

После подтверждения установки apt загрузит и установит Python, virtualenv и все необходимые им зависимости.

Затем нужно создать необходимые каталоги для OctoDNS, где будут храниться настройки DNS и программы. Начните с создания каталогов ~/octodns и ~/octodns/config:

mkdir ~/octodns ~/octodns/config

Перейдите в каталог ~/octodns:

cd ~/octodns

Затем вам нужно создать виртуальную среду Python – изолированную среду с собственными библиотеками и конфигурацией. Она нужна для запуска OctoDNS.

virtualenv env

Включите среду с помощью этой команды:

source env/bin/activate

Вы получите такой вывод:

Running virtualenv with interpreter /usr/bin/python2
New python executable in /home/user/octodns/env/bin/python2
Also creating executable in /home/user/octodns/env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

Командная строка оболочки Bash теперь будет включать префикс с именем виртуальной среды. Это показывает, что в настоящее время вы работаете в рамках virtualenv:

(env) user@myserver:~/octodns$

Если вы хотите выйти из virtualenv, вы можете использовать команду deactivate. Но пока вы работает с этим мануалом, не выходите из virtualenv.

Теперь, когда вы установили и настроили Python и virtualenv, вы можете установить OctoDNS. OctoDNS распространяется в виде pip-пакета Python. Инструмент pip является стандартным менеджером пакетов и библиотек Python.

Вы можете установить pip-пакет OctoDNS в virtualenv с помощью следующей команды:

pip install octodns

После этого запросите установленную версию, чтобы убедиться, что все работает:

octodns-sync --version

Вывод будет выглядеть примерно так:

octoDNS 0.9.9

Если вы видите ошибку:

octodns-sync: command not found

убедитесь, что вы находитесь в virtualenv.

Установив OctoDNS, вы можете создать необходимые конфигурационные файлы для подключения OctoDNS к вашему провайдеру DNS, чтобы он мог вносить изменения в ваши записи.

2: Настройка OctoDNS

На этом этапе нужно создать конфигурационные файлы для OctoDNS и подключить инструмент к вашему провайдеру DNS, чтобы он мог начать вносить изменения в записи DNS.

Примечание: В этом мануале мы сосредоточимся на начальной настройке OctoDNS; однако в среде производства рекомендуется хранить конфигурацию OctoDNS в системе управления версиями (VCS), например, в Git. Так вы получите полный контроль версий, интеграцию с CI/CD для тестирования, плавный откат развертываний и много других преимуществ.

Для начала нужно настроить файл config.yaml, который определяет DNS зоны для OctoDNS и позволяет ему пройти аутентификацию у DNS провайдера и вносить изменения.

Формат config.yaml немного отличается в зависимости от поставщика DNS. Пожалуйста, проверьте список поддерживаемых провайдеров в официальной документации OctoDNS, чтобы найти конфигурацию для вашего провайдера. По этой гиперссылке сведения о конфигурации представлены в виде комментариев в фактическом коде Python для вашего провайдера, ссылка на этот код находится в столбце Provider. Найдя код Python для своего провайдера, вы можете найти и соответствующий комментарий к коду – он находится непосредственно под class ProviderNameProvider. Например:

class Route53Provider(BaseProvider):
'''
AWS Route53 Provider
route53:
class: octodns.provider.route53.Route53Provider
# The AWS access key id
access_key_id:
# The AWS secret access key
secret_access_key:
# The AWS session token (optional)
# Only needed if using temporary security credentials
session_token:

Перейдите в каталог ~/octodns/config:

cd ~/octodns/config

Создайте файл config.yaml:

nano config.yaml

Добавьте в файл скопированный образец конфигурации для вашего провайдера. Например:

---
providers:
config:
class: octodns.provider.yaml.YamlProvider
directory: ./config
default_ttl: 300
enforce_order: True
digitalocean:
class: octodns.provider.digitalocean.DigitalOceanProvider
token: your-digitalocean-oauth-token
zones:
your-domain.:
sources:
- config
targets:
- digitalocean

Примечание: Ваши конфигурации будут отличаться, если вы используете другого провайдера.

Этот файл сообщает OctoDNS, к каким DNS-провайдерам вы хотите подключиться, и какие DNS-зонами этих провайдеров он должен управлять.

Затем вам нужно настроить аутентификацию для вашего DNS-провайдера. Обычно для этого используется ключ API или токен OAuth.

Если вы не хотите хранить свой токен доступа в виде простого текста в конфигурационном файле, вы можете передать его как переменную среды при запуске программы. Чтобы сделать это, нужно использовать следующую строку token: в config.yaml:

token: env/MYPROVIDER\_OAUTH\_TOKEN

Затем перед запуском OctoDNS установите в соответствующей переменной среды ваш токен доступа, и OctoDNS прочитает его оттуда при запуске:

export MYPROVIDER\_OAUTH\_TOKEN=your-oauth-token

Важно! Этот токен предоставит доступ к учетной записи вашего DNS-провайдера, поэтому вы должны защищать его так же, как и пароль. Если вы используете систему контроля версий, убедитесь, что файл, содержащий токен, игнорируется (например, с помощью .gitignore), либо каким-либо образом надежно зашифрован.

Если у вас несколько разных DNS провайдеров – например, для нескольких доменных имен или делегированных зон DNS – вы можете определить их все в одном файле config.yaml.

Итак, вы настроили исходный конфигурационный файл OctoDNS, чтобы программа могла проходить аутентификацию у вашего DNS-провайдера и вносить изменения. Затем нужно создать конфигурацию для ваших зон DNS.

3: Создание конфигурационного файла DNS

Теперь нужно создать исходный конфигурационный файл DNS, который будет содержать DNS-записи для вашего доменного имени или делегированной зоны DNS.

Каждая DNS-зона, которой вы хотите управлять с помощью OctoDNS, будет иметь свой собственный файл, например, your-domain.yaml. В этом файле определяются DNS записи зоны в формате YAML.

Для начала перейдите в каталог ~/octodns/config:

cd ~/octodns/config

Затем создайте и откройте your-domain.yaml в редакторе:

nano your-domain.yaml

Добавьте следующие конфигурации в файл:

---
'':
- type: A
value: your-server-ipv4-address
www:
- type: A
value: your-server-ipv4-address

Этот файл определяет зону DNS с двумя записями A, указывающими на адрес IPv4, на котором вы размещаете свой домен или веб-сайт. Одна запись A предназначена для корневого домена (например, your-domain), а вторая – для субдомена с префиксом www (например, www.your-domain).

Сохраните и закройте файл.

Только что вы настроили базовый файл зоны DNS для OctoDNS с двумя основными записями A, указывающими на IPv4-адрес вашего домена или веб-сайта. Давайте расширим файл некоторыми полезными записями DNS.

4: Добавление других DNS-записей

Теперь вы можете заполнить файл удобным набором записей DNS для вашего веб-сайта или сервиса, используя язык YAML.

В отличие от традиционных файлов зон BIND, куда записи DNS вносятся в простом построчном формате, записи DNS в OctoDNS определяются как ключи и подключи YAML с рядом связанных значений (как показано в разделе 3).

Ключом верхнего уровня обычно является ‘name’,  что по сути представляет идентификатор записи. Примеры DNS ‘name’: www, subdomain1 и mail. В OctoDNS есть два специальных имени: пара одинарных кавычек » – для корневой записи (обычно обозначается как «@»);’*’ – для групповых записей. Обязательным значением каждого ключа (записи DNS) является type. Он определяет тип записи DNS в этом ключе верхнего уровня YAML. type поддерживает все стандартные типы записей DNS, включая A, AAAA, MX, TXT, NS, CNAME. Полный список доступных типов вы найдете здесь.

Значения для ваших записей DNS определяются либо в ключах верхнего уровня (если у вас только одно значение), либо как список (если у вас есть несколько значений, например, несколько IP- или MX-адресов).

К примеру, чтобы определить одно значение, вы можете использовать следующую конфигурацию:

'www':
type: A
value: 203.0.113.1

Чтобы определить несколько значений для одной записи, используйте:

'www':
type: A
values:
- 203.0.113.1
- 203.0.113.2

Синтаксис настройки DNS-записей незначительно отличается для каждого типа. Ниже мы приведем примеры некоторых наиболее распространенных типов.

Записи А

Цель: направить на адрес IPv4.

Синтаксис:

'name':
type: A
value: ipv4-address

Пример

'www':
type: A
value: your-server-ipv4-address

Записи АААА

Цель: направить на адрес IPv6.

Синтаксис:

'name':
type: AAAA
value: ipv6-address

Пример:

'www':
type: AAAA
value: your-server-ipv6-address

Записи CNAME

Цель: Сделать домен/поддомен алиасом другого домена.

Синтаксис:

'name':
type: CNAME
value: fully-qualified-domain-name

Пример:

'www':
type: CNAME
value: www.example.org

Записи MX

Цель: направить электронную почту на определенные серверы/адреса.

Синтаксис:

'name':
type: MX
value:
exchange: mail-server
preference: priority-value

Обратите внимание, если в значении MX присутствуют точки, нужно обязательно поставить точку в конце.

Пример:

'':
type: MX
value:
exchange: mail.your-domain.
preference: 10

Записи TXT

Цель: добавить произвольный простой текст (часто используется для конфигураций без собственного выделенного типа записи).

Синтаксис:

'name':
type: TXT
value: content

Пример:
'':
type: TXT
value: This is a TXT record.

Чтобы приступить к добавлению записей DNS для вашего домена или делегированной зоны DNS, откройте конфигурационный файл DNS в редакторе:

cd ~/octodns/config
nano your-domain.yaml

Затем вы можете начать заполнение своей зоны DNS, используя показанный выше синтаксис, а также этот раздел официальной документации OctoDNS.

Для справки приводим следующий блок кода. Он содержит полный список конфигураций для начальной настройки DNS:

---
'':
- type: A
value: your-server-ipv4-address
- type: AAAA
value: your-server-ipv6-address
- type: MX
value:
exchange: mail.your-domain.
preference: 10
- type: TXT
value: v=spf1 -all
_dmarc:
type: TXT
value: v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;
mail:
- type: A
value: your-server-ipv4-address
- type: AAAA
value: your-server-ipv6-address
www:
- type: A
value: your-server-ipv4-address
- type: AAAA
value: your-server-ipv6-address

После завершения начальной настройки DNS сохраните и закройте файл.

Теперь давайте протестируем конфигурацию и развернем ее.

5: Тестирование и развертывание конфигурации DNS

На этом этапе пора запустить локальную проверку синтаксиса DNS, а затем развернуть изменения на работающем DNS-сервере/провайдере.

Перейдите в каталог octodns:

cd ~/octodns

Убедитесь, что вы все еще работаете в virtualenv, посмотрев на префикс в командной строке:

(env) user@myserver:~/octodns$

Далее, используйте команду octodns-validate, чтобы проверить синтаксис конфигурационных файлов. В команде необходимо указать путь к файлу:

octodns-validate --config=./config/config.yaml

Если синтаксис YAML вашего конфигурационного файла DNS правильный, OctoDNS не вернет никакого вывода. Если вы увидите сообщение об ошибке или предупреждение, в нем OctoDNS предоставит подробную информацию о том, где находится ошибка в файле.

Затем вы можете выполнить пробный запуск конфигурации DNS, который покажет, какие изменения будут внесены, фактически не внося их:

octodns-sync --config=./config/config.yaml

Вы должны получить примерно такой вывод:

********************************************************************************
* your-domain.
********************************************************************************
* myprovider (MyProvider)
*   Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config)
*   Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config)
*   Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config)
*   Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config)
*   Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config)
*   Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config)
*   Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config)
*   Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;']> (config)
*   Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config)
*   Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2
********************************************************************************

Примечание: Следующая команда внесет изменения в ваши записи DNS и, возможно, в другие настройки. На всякий случай сделаете резервную копию существующей конфигурации DNS, а также убедитесь, что у вас есть возможность откатить настройки, если это будет необходимо.

Сейчас вы можете загрузить изменения:

octodns-sync --config=./config/config.yaml --doit

Примечание: В некоторых случаях OctoDNS откажется от внесения изменений, если их будет очень много. Это функция автоматической защиты от случайных неправильных настроек. Если вы столкнулись с таким отказом, вы можете повторно запустить octodns-sync, используя опцию —force, но убедитесь, что вы готовы к этому.

Вы увидите вывод, подобный тому, что видели при пробном прогоне, но с новым фрагментом:

2019-07-07T23:17:27 INFO  MyProvider[myprovider] apply: making changes
2019-07-07T23:17:30 INFO  Manager sync:   9 total changes

Если теперь вы проверите настройки DNS для своего домена в панели управления провайдера, вы увидите все свои изменения.

Вы также можете проверить создание записи, запустив DNS-запрос для вашего домена или делегированной зоны с помощью команды dig.

Если у вас не установлен инструмент dig, вам нужно установить пакет dnsutils:

sudo apt install dnsutils

После того, как вы установили dig, вы можете использовать эту команду для проверки DNS. Вы увидите, что записи были обновлены:

dig +short your-domain

В выводе будет IP-адрес и соответствующая запись DNS из зоны, развернутой с помощью OctoDNS. На обновление записей DNS может уйти некоторое время, поэтому вам, возможно, придется подождать и запустить эту команду позже.

Итак, вы выполнили локальную проверку синтаксиса в конфигурации DNS, затем развернули файл на действующем провайдере DNS и проверили, что изменения были внесены успешно.

Заключение

Теперь вы умеете устанавливать и настраивать OctoDNS, а также выполнять настройку DNS для вашего провайдера.

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

Если вы хотите продолжить изучение этого вопроса, попробуйте интегрировать OctoDNS в конвейер CI/CD, что позволит вам проводить углубленные тесты и лучше контролировать развертывание в рабочей среде. Вы также можете изучить интеграцию OctoDNS в процессы сборки и развертывания инфраструктуры, что позволит вам развертывать серверы и автоматически добавлять их в DNS.

Читайте также:

Tags: , , ,