Как настроить Cloudflare Dynamic DNS

Предположим, вы опубликовали веб-сайт из своей домашней сети и создали DNS-запись, указывающую на общедоступный IP-адрес вашего роутера. Как вы будете поддерживать актуальность вашей DNS-записи при изменении общедоступного IP-адреса? Возможно, вам стоит рассмотреть настройку динамического DNS от Cloudflare.

Поставщики интернет-услуг (ISP) обычно назначают своим абонентам динамические IP-адреса, которые могут меняться в любое время. В результате ваша DNS-запись остается указывать на IP-адрес, который больше не принадлежит вам, и ваш сайт становится недоступным.

Продолжайте читать, потому что этот учебник поможет вам поддерживать актуальность вашей DNS-записи с использованием интерфейса программирования приложений (API) Cloudflare и PowerShell. Давайте начнем!

Предварительные требования

Если вы планируете следовать этому учебнику практически, вот требования, которые вам потребуются.

  • A computer with PowerShell 7.1 where you’ll run the Cloudflare dynamic DNS update script. This tutorial will use a Windows 10 computer.
  • A script editor of your choice. This tutorial will use Visual Studio Code v1.59.1 (recommended).
  • A domain that you already own. The example domain in this tutorial is lazyexchangeadmin.cyou.

Бесплатные домены верхнего уровня (TLD), такие как .ml, .ga., .tk, .cf и .gq, не применимы для автоматизации динамического DNS от Cloudflare и не будут работать с этим учебником.

Sample DNS A record in Cloudflare

Что такое Cloudflare Dynamic DNS?

DNS-записи по своей природе статичны и плохо сочетаются с динамическими IP-адресами. Теперь, чтобы решить эту проблему, вам нужно настроить динамический DNS. К счастью, Cloudflare предоставляет API, который позволяет управлять DNS-записями программно.

Чтобы настроить динамический DNS Cloudflare, вам нужно запустить процесс на клиенте внутри вашей сети, который выполняет два основных действия: получение текущего общедоступного IP-адреса вашей сети и автоматическое обновление соответствующей DNS-записи.

На рисунке ниже показана общая диаграмма того, как происходит обновление динамического DNS в Cloudflare.

Cloudflare Dynamic DNS update flow

Существует много клиентов динамического DNS, доступных для установки, в основном для систем Linux, таких как сервер Ubuntu или Raspberry PI. Также существуют сторонние сервисы динамического DNS, которые могут быть платными или бесплатными. Но в этом руководстве вы развернете скрипт обновления DNS, который работает на PowerShell 7.1.

Получение токена API Cloudflare

При программном обновлении динамической записи DNS в Cloudflare ваш скрипт должен аутентифицироваться в Cloudflare API. Только после этого Cloudflare позволит вам вносить изменения в DNS-записи вашей учетной записи.

Cloudflare позволяет создавать токены API с достаточными разрешениями для своего назначения. Затем вы можете использовать имя пользователя вашей учетной записи Cloudflare и полученный токен API для аутентификации в Cloudflare API.

Для создания токена API Cloudflare выполните следующие шаги.

1. Откройте ваш браузер, перейдите по адресу https://dash.cloudflare.com/login/ и войдите в свою учетную запись Cloudflare.

2. После входа в панель управления Cloudflare нажмите на кнопку профиля в верхнем правом углу и выберите Мой профиль.

Opening your Cloudflare profile page

3. Затем нажмите на вкладку Токены API. В разделе Токены API нажмите кнопку Создать токен. В данном примере предполагается, что вы еще не создали никаких токенов API.

Clicking Create Token

4. На списке шаблонов токенов API нажмите на шаблон Редактировать зону DNS, чтобы использовать его. Этот шаблон позволяет создать токен API с правами редактирования для всех или выбранных DNS-зон в вашем аккаунте.

Selecting the Edit zone DNS API token template

5. В разделе Ресурсы зоны на странице Создать токен нажмите на крайний правый выпадающий список и выберите DNS-зону, которую необходимо включить в доступ этого токена API. После выбора DNS-зоны нажмите Продолжить к обзору.

По желанию, чтобы ограничить срок действия токена API, заполните Дата начала и Дата окончания в разделе TTL. Если оставить пустым, у токена API не будет срока действия.

Selecting the DNS Zone

6. Проверьте обзор и убедитесь, что у API есть разрешение DNS:Редактирование для предварительно выбранной DNS-зоны. Наконец, нажмите Создать токен, чтобы создать токен API.

Reviewing the API token permission

7. После создания токена API скопируйте его значение и обязательно сохраните его в безопасном месте. Обращайтесь к токену API так же, как к паролю.

Copying the API Token

8. Вернитесь на вкладку Токены API и подтвердите существование созданного вами токена API.

Verifying the API Token

Настройка сценария обновления Cloudflare Dynamic DNS

Теперь у вас есть учетная запись Cloudflare и токен API Cloudflare с правами редактирования DNS-зоны. Что дальше? Вам нужно будет использовать токен API и интегрировать его с сценарием, который будет программно обновлять запись динамического DNS Cloudflare.

Этот учебник предоставляет вам рабочий сценарий PowerShell специально для обновления записи DNS в Cloudflare.

Сохранение сценария

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

1. Решите, в какую папку сохранить сценарий, и создайте эту папку, если она еще не существует. В этом примере местоположение сценария – C:\CloudflareDDNS.

2. Откройте ваш редактор кода, такой как VSCode, и создайте новый файл сценария PowerShell с именем Update-CloudflareDDNS.ps1. Сохраните сценарий внутри папки C:\CloudflareDDNS.

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

#требования -Версия 7.1

[cmdletbinding()]
param (
    [parameter(Mandatory)]
    $Email,
    [parameter(Mandatory)]
    $Token,
    [parameter(Mandatory)]
    $Domain,
    [parameter(Mandatory)]
    $Record
)

# Постройте заголовки запроса единожды. Эти заголовки будут использоваться на протяжении всего сценария.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Регион Тест Токена
## Этот блок проверяет, что ваш ключ API действителен.
## В противном случае сценарий будет завершен.

$uri = "https://api.cloudflare.com/client/v4/user/tokens/verify"

$auth_result = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($auth_result.result)) {
    Write-Output "API token validation failed. Error: $($auth_result.errors.message). Terminating script."
    # Завершить сценарий
    return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#Конец Региона

#Регион Получения идентификатора зоны
## Извлекает идентификатор зоны домена на основе названия зоны. Если идентификатор не найден, сценарий будет завершен.
$uri = "https://api.cloudflare.com/client/v4/zones?name=$($Domain)"
$DnsZone = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($DnsZone.result)) {
    Write-Output "Search for the DNS domain [$($Domain)] return zero results. Terminating script."
    # Завершить сценарий
    return
}
## Сохранить идентификатор зоны DNS
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#Конец Региона

#Регион Получения DNS-записи
## Извлекает сведения о существующей DNS-записи из Cloudflare.
$uri = "https://api.cloudflare.com/client/v4/zones/$($zone_id)/dns_records?name=$($Record)"
$DnsRecord = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($DnsRecord.result)) {
    Write-Output "Search for the DNS record [$($Record)] return zero results. Terminating script."
    # Завершить сценарий
    return
}
## Сохранить текущий IP-адрес в DNS-записи
$old_ip = $DnsRecord.result.content
## Сохранить значение типа DNS-записи
$record_type = $DnsRecord.result.type
## Сохранить идентификатор DNS-записи
$record_id = $DnsRecord.result.id
## Сохранить значение времени жизни DNS-записи
$record_ttl = $DnsRecord.result.ttl
## Сохранить значение прокси DNS-записи
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#Конец Региона

#Регион Получения текущего публичного IP-адреса
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#Конец Региона

#Регион Обновления записи Dynamic DNS
## Сравнить текущий IP-адрес с DNS-записью
## Если текущий IP-адрес не соответствует IP-адресу DNS-записи, обновите DNS-запись.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## Обновить DNS-запись новым IP-адресом
    $uri = "https://api.cloudflare.com/client/v4/zones/$($zone_id)/dns_records/$($record_id)"
    $body = @{
        type    = $record_type
        name    = $Record
        content = $new_ip
        ttl     = $record_ttl
        proxied = $record_proxied
    } | ConvertTo-Json

    $Update = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -SkipHttpErrorCheck -Body $body
    if (($Update.errors)) {
        Write-Output "DNS record update failed. Error: $($Update[0].errors.message)"
        ## Завершить сценарий
        return
    }

    Write-Output "DNS record update successful."
    return ($Update.result)
}
else {
    Write-Output "The current IP address and DNS record IP address are the same. There's no need to update."
}
#Конец Региона

Запуск сценария

Теперь, когда вы сохранили скрипт обновления динамического DNS Cloudflare, что дальше? Прежде чем развертывать скрипт, важно протестировать его функциональность. Для успешного запуска скрипта необходимы четыре детали:

  • Email – это адрес электронной почты вашей учетной записи Cloudflare.
  • Token – токен API, который вы ранее создали в своей учетной записи Cloudflare.
  • Domain – имя DNS-домена, содержащее запись DNS, которую вы хотите обновить. (например, lazyexchangeadmin.cyou).
  • Record – запись DNS, которую вы хотите обновить. (например, demo.lazyexchangeadmin.cyou).

Для запуска скрипта выполните следующие шаги.

1. Во-первых, откройте сеанс PowerShell. Или, если вы используете VSCode, используйте терминал PowerShell в VSCode.

2. Затем выполните поиск записи DNS, чтобы подтвердить текущий IP-адрес записи DNS. Для этого выполните команду Resolve-DnsName, как показано ниже. Убедитесь предоставить полностью квалифицированное доменное имя (FQDN) с параметром -Name.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

Команда должна вернуть запись DNS, которую вы искали, включая ее IP-адрес.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Теперь вызовите сценарий Update-CloudflareDDNS.ps1, чтобы обновить запись DNS в Cloudflare, выполнив следующую команду. Убедитесь, что изменены Email, Token, Domain и Record. Эта команда предполагает, что ваш сценарий находится в C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

C:\CloudflareDDNS\Update-CloudflareDDNS.ps1 `
-Email '[email protected]' `
-Token 'kGW8n........eJl5a' `
-Domain 'lazyexchangeadmin.cyou' `
-Record 'demo.lazyexchangeadmin.cyou'

Затем сценарий выполняет следующие действия, как показано на скриншоте ниже.

  1. Проверяет правильность API-токена.
  2. Находит домен, содержащий запись DNS для обновления.
  3. Находит запись DNS для обновления.
  4. Сравнивает IP-адрес записи DNS с фактическим внешним или общедоступным IP-адресом.
  5. Обновляет IP-адрес записи DNS в Cloudflare.
  6. Отображает результат обновления динамического DNS.
Running the Cloudflare dynamic DNS update script

4. Вернитесь на панель управления Cloudflare и проверьте, отражается ли запись DNS новым IP-адресом. На скриншоте ниже показано, что IP-адрес изменился на значение внешнего IP-адреса после выполнения сценария обновления.

Verifying the DNS record in Cloudflare

5. Наконец, выполните еще один поиск записи DNS, как вы делали на шаге 2, чтобы подтвердить, был ли новый IP-адрес уже публично распространен.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

Распространение записи DNS может занимать несколько минут, часов или даже дней. В этом примере распространение Cloudflare заняло менее минуты.

Looking up a DNS record after the Cloudflare dynamic DNS update

Планирование задачи обновления динамического DNS Cloudflare

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

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

Определение действия запланированной задачи

У вашего запланированного задания должно быть действие, которое вы можете создать, запустив командлет New-ScheduledTaskAction. В этом примере действие заключается в запуске сценария Update-CloudflareDDNS.ps1 с использованием исполняемого файла PowerShell pwsh.exe.

Для этого откройте новое окно PowerShell с правами администратора. Затем скопируйте и выполните приведенный ниже код в PowerShell. Обязательно измените переменные $scriptPath, $Email, $Token, $Domain и $Record.

# Определите свойства действия запланированной задачи
## Укажите путь к сценарию PowerShell
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## Адрес электронной почты учетной записи Cloudflare
$Email = '[email protected]'
## Токен API Cloudflare
$Token = 'kGW8n........eJl5a'
## Имя домена DNS
$Domain = 'lazyexchangeadmin.cyou'
## Запись DNS для обновления
$Record = 'demo.lazyexchangeadmin.cyou'

# Создайте объект действия запланированной задачи
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Создание триггера запланированной задачи

После того как вы определили, что будет выполнять задача, вы должны создать триггер или расписание для задачи, запустив командлет New-ScheduledTaskTrigger. Скопируйте код ниже и выполните его в PowerShell, чтобы создать новый триггер задачи, который будет запускаться каждые пять минут в течение десяти лет.

# Создайте новое расписание триггера для запланированной задачи
## Триггер = каждые 5 минут в течение 10 лет.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Регистрация новой запланированной задачи в системе

Наконец, вы готовы зарегистрировать новую запланированную задачу на компьютере. Для этого вам нужно выполнить командлет Register-ScheduledTask, так же, как показано в коде ниже. Скопируйте код ниже и выполните его в PowerShell, чтобы зарегистрировать запланированную задачу.

Результатом будет запланированная задача, выполняющаяся от имени локальной учетной записи SYSTEM. Не стесняйтесь назначать другую учетную запись пользователя для выполнения запланированной задачи при необходимости.

# Зарегистрировать запланированную задачу в системе.
## Название запланированной задачи
$TaskName = 'Update Cloudflare Dynamic DNS'
## Описание запланированной задачи
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Создать запланированную задачу
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Как видно ниже, команда создала запланированную задачу, и статус готовности отображается. С этого момента скрипт будет выполняться каждые пять минут.

Registering the New Scheduled Task

Заключение

Поддерживать актуальность DNS-записей при изменении динамических IP-адресов не обязательно сложно. Вам даже не нужно платить за услугу динамического DNS! Управляя вашими DNS-зонами в Cloudflare, вы можете воспользоваться их API, что позволит вам программно обновлять ваши DNS-записи.

В этом учебном пособии вы узнали, как обновить динамическую DNS-запись Cloudflare с использованием комбинации вызовов API, PowerShell 7 и запланированных задач. Все это позволяет настроить ваш механизм обновления динамического DNS Cloudflare один раз и держать его в актуальном состоянии без участия пользователя.

Рассмотрите ли вы возможность управления вашими DNS-зонами с помощью Cloudflare, чтобы воспользоваться преимуществами его API? Или вы знаете более удобный и доступный способ?

Source:
https://adamtheautomator.com/cloudflare-dynamic-dns/