[玩转系统] 如何设置 Cloudflare 动态 DNS
作者:精品下载站 日期:2024-12-14 13:08:52 浏览:14 分类:玩电脑
如何设置 Cloudflare 动态 DNS
假设您从家庭网络发布了一个网站,并且创建了一条指向路由器公共 IP 地址的 DNS 记录。当您的公共 IP 地址发生变化时,如何保持 DNS 记录更新?也许您应该考虑设置 Cloudflare 动态 DNS。
互联网服务提供商 (ISP) 通常会为其订户分配动态 IP 地址,该地址可能随时发生变化。因此,您的 DNS 记录仍然指向不再属于您的 IP 地址,并且您的网站将无法访问。
请继续阅读,因为本教程将帮助您使用 Cloudflare 的应用程序编程接口 (API) 和 PowerShell 保持 DNS 记录更新。让我们开始吧!
先决条件
如果您打算亲自学习本教程,则以下是您需要的要求。
- 一台装有 PowerShell 7.1 的计算机,您将在其中运行 Cloudflare 动态 DNS 更新脚本。本教程将使用 Windows 10 计算机。
- 您选择的脚本编辑器。本教程将使用 Visual Studio Code v1.59.1(推荐)。
- 您已经拥有的域。本教程中的示例域是lazyexchangeadmin.cyou。
免费顶级域 (TLD),例如 .ml、.ga.、.tk、.cf 和 .gq,不适用于 Cloudflare 动态 DNS 自动化,并且不适用于本教程。
-
Cloudflare 帐户。一个免费帐户足以在本教程中使用。
- 您必须已将您的域添加到 Cloudflare。
- 您必须已在 Cloudflare 中的域下添加 DNS 记录。本教程中的 DNS A 记录将为 demo.lazyexchangeadmin.cyou,初始 IP 地址为 0.0.0.0。
什么是 Cloudflare 动态 DNS?
DNS 记录本质上是静态的,它不能很好地与动态 IP 地址配合使用。现在,要解决这个问题,您需要设置动态 DNS。幸运的是,Cloudflare 提供了一个 API,允许您以编程方式管理 DNS 记录。
要设置 Cloudflare 动态 DNS,您需要在网络内部的客户端上运行一个进程,该进程执行两个主要操作:获取网络的当前公共 IP 地址并自动更新相应的 DNS 记录。
下图显示了 Cloudflare 动态 DNS 更新流程如何发生的高级图表。
许多动态 DNS 客户端都可以安装,主要适用于 Linux 系统,例如 Ubuntu 服务器或 Raspberry PI。还存在可能付费或免费的第三方动态 DNS 服务。但在本教程中,您将部署在 PowerShell 7.1 上运行的 DNS 更新程序脚本。
获取 Cloudflare API 令牌
以编程方式更新 Cloudflare 动态 DNS 记录时,您的脚本必须向 Cloudflare API 进行自身身份验证。只有这样,Cloudflare 才会允许您更改帐户中的 DNS 记录。
Cloudflare 允许您创建具有足够权限的 API 令牌来实现其目的。然后,您可以使用 Cloudflare 帐户的用户名和生成的 API 令牌通过 Cloudflare API 进行身份验证。
要创建 Cloudflare API 令牌,请按照以下步骤操作。
1. 打开浏览器,导航至 https://dash.cloudflare.com/login/,然后登录您的 Cloudflare 帐户。
2. 登录 Cloudflare 仪表板后,点击右上角的个人资料按钮,然后点击我的个人资料。
3. 接下来,单击API 令牌选项卡链接。在API 令牌部分下,单击创建令牌按钮。下面的示例假设您尚未创建任何 API 令牌。
4. 在 API 令牌模板列表中,单击编辑区域 DNS 模板以使用它。此模板允许您创建一个 API 令牌,该令牌具有对您帐户中所有或选定 DNS 区域的编辑权限。
5. 在创建令牌页面的区域资源部分下,单击最右侧的下拉框并选择要包含在此 API 令牌访问权限中的 DNS 区域。选择 DNS 区域后,单击继续摘要。
(可选)要限制 API 令牌的有效期,请填写 TTL 部分下的开始日期和结束日期。如果留空,API 令牌将没有到期日期。
6. 查看摘要并确保 API 对先前选择的 DNS 区域具有 DNS:Edit 权限。最后,点击创建令牌来创建API令牌。
7. 创建 API 令牌后,复制令牌值并确保安全存储。像对待密码一样对待 API 令牌。
8. 返回 API 令牌选项卡并确认您创建的 API 令牌是否存在。
设置 Cloudflare 动态 DNS 更新脚本
您现在拥有 Cloudflare 帐户和 Cloudflare API 令牌,并有权编辑 DNS 区域。下一步是什么?您需要使用 API 令牌,并将其与以编程方式更新 Cloudflare 动态 DNS 记录的脚本集成。
本教程为您提供了一个专门用于更新 Cloudflare 中的 DNS 记录的工作 PowerShell 脚本。
保存脚本
按照以下步骤将 Cloudflare 动态 DNS PowerShell 脚本保存在您的客户端计算机上。
1. 决定将脚本存储到哪个文件夹,如果尚不存在则创建该文件夹。在此示例中,脚本位置位于C:\CloudflareDDNS。
2. 打开代码编辑器(例如 VSCode),然后创建一个名为 Update-CloudflareDDNS.ps1
的新 PowerShell 脚本文件。将脚本保存在 C:\CloudflareDDNS 文件夹中。
3. 复制下面的脚本,将其粘贴到代码编辑器中,然后保存文件。请参阅内联注释以了解脚本的作用。
#requires -Version 7.1
[cmdletbinding()]
param (
[parameter(Mandatory)]
$Email,
[parameter(Mandatory)]
$Token,
[parameter(Mandatory)]
$Domain,
[parameter(Mandatory)]
$Record
)
# Build the request headers once. These headers will be used throughout the script.
$headers = @{
"X-Auth-Email" = $($Email)
"Authorization" = "Bearer $($Token)"
"Content-Type" = "application/json"
}
#Region Token Test
## This block verifies that your API key is valid.
## If not, the script will terminate.
$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."
# Exit script
return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#EndRegion
#Region Get Zone ID
## Retrieves the domain's zone identifier based on the zone name. If the identifier is not found, the script will terminate.
$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."
# Exit script
return
}
## Store the DNS zone ID
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#End Region
#Region Get DNS Record
## Retrieve the existing DNS record details from 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."
# Exit script
return
}
## Store the existing IP address in the DNS record
$old_ip = $DnsRecord.result.content
## Store the DNS record type value
$record_type = $DnsRecord.result.type
## Store the DNS record id value
$record_id = $DnsRecord.result.id
## Store the DNS record ttl value
$record_ttl = $DnsRecord.result.ttl
## Store the DNS record proxied value
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#EndRegion
#Region Get Current Public IP Address
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#EndRegion
#Region update Dynamic DNS Record
## Compare current IP address with the DNS record
## If the current IP address does not match the DNS record IP address, update the DNS record.
if ($new_ip -ne $old_ip) {
Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
## Update the DNS record with the new IP address
$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)"
## Exit script
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."
}
#EndRegion
运行脚本
现在您已经保存了 Cloudflare 动态 DNS 更新脚本,接下来做什么?在部署脚本之前,测试其功能是否有效至关重要。运行脚本需要四个细节才能成功,它们是:
Email
- 这是您的 Cloudflare 帐户的电子邮件地址。Token
- 您之前从 Cloudflare 帐户创建的 API 令牌。域
- 包含您要更新的 DNS 记录的 DNS 域名。 (例如,lazyexchangeadmin.cyou)。Record
- 您要更新的 DNS 记录。 (例如,demo.lazyexchangeadmin.cyou)。
要运行该脚本,请按以下步骤操作。
1. 首先,打开 PowerShell 会话。或者,如果您使用的是 VSCode,请改用 VSCode PowerShell 终端。
2. 接下来,执行 DNS 记录查找以确认当前 DNS 记录的 IP 地址。为此,请运行 Resolve-DnsName
cmdlet,如下所示。确保使用 -Name
参数提供完全限定域名 (FQDN)。
Resolve-DnsName -Name demo.lazyexchangeadmin.cyou
该命令应返回您查找的 DNS 记录,包括其 IP 地址。
3. 现在,通过运行以下命令调用 Update-CloudflareDDNS.ps1
脚本来更新 Cloudflare 中的 DNS 记录。确保更改电子邮件
、令牌
、域
和记录
。以下命令假定您的脚本位于C:\CloudflareDDNS\Update-CloudflareDDNS.ps1。
C:\CloudflareDDNS\Update-CloudflareDDNS.ps1 `
-Email '[email ' `
-Token 'kGW8n........eJl5a' `
-Domain 'lazyexchangeadmin.cyou' `
-Record 'demo.lazyexchangeadmin.cyou'
然后该脚本执行以下操作,如下面的屏幕截图所示。
- 验证 API 令牌。
- 查找包含要更新的 DNS 记录的域。
- 找到要更新的 DNS 记录。
- 将 DNS 记录 IP 地址与实际的外部或公共 IP 地址进行比较。
- 更新 Cloudflare 中的 DNS 记录 IP 地址。
- 显示动态DNS更新结果。
4. 返回 Cloudflare 仪表板并验证 DNS 记录是否反映了新的 IP 地址。下面的屏幕截图显示,运行更新脚本后,IP 地址已更改为外部 IP 地址值。
5. 最后,按照步骤 2 中的操作执行另一次 DNS 记录查找,以确认新 IP 地址是否已公开传播。
Resolve-DnsName -Name demo.lazyexchangeadmin.cyou
DNS 记录传播可能需要几分钟、几小时甚至几天的时间。在此示例中,Cloudflare 传播仅花费了不到一分钟的时间。
安排 Cloudflare 动态 DNS 更新任务
此时,您现在已经有了一个可以更新 Cloudflare 动态 DNS 记录的工作脚本。但每次手动运行脚本并不是目标。您必须确保动态 DNS 更新根据需要经常按计划自动运行。
根据您使用的操作系统,安排脚本运行的方式会有所不同,就像 Linux 中的 cron 作业一样。本教程将创建一个 Windows 计划任务,每五分钟运行一次 Cloudflare 动态 DNS 更新脚本。
定义计划任务操作
您的计划任务必须有一个操作,您可以通过运行 New-ScheduledTaskAction cmdlet 创建该操作。在此示例中,操作是使用 PowerShell 可执行文件 pwsh.exe
运行 Update-CloudflareDDNS.ps1 脚本。
为此,请以管理员身份打开一个新的 PowerShell 窗口。接下来,在 PowerShell 中复制并运行以下代码。确保更改 $scriptPath
、$Email、
$Token
、$Domain
和 $记录变量。
# Define the scheduled task action properties
## Enter the PowerShell script path
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## Cloudflare account's email address
$Email = '[email '
## Cloudflare API Token
$Token = 'kGW8n........eJl5a'
## DNS Domain Name
$Domain = 'lazyexchangeadmin.cyou'
## DNS Record to Update
$Record = 'demo.lazyexchangeadmin.cyou'
# Create the scheduled task action object
$taskAction = New-ScheduledTaskAction `
-Execute "pwsh.exe" `
-Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"
创建计划任务触发器
定义任务将执行的操作后,接下来必须通过运行 New-ScheduledTaskTrigger
cmdlet 为任务创建触发器或计划。复制下面的代码并在 PowerShell 中运行它,以创建一个新的任务触发器,该触发器在十年的持续时间内每五分钟运行一次。
# Create a bew scheduled task trigger schedule
## Trigger = every 5 minutes for 10 years.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)
在系统中注册新的定时任务
最后,您就可以在计算机上注册新的计划任务了。为此,您需要运行 Register-ScheduledTask
cmdlet,与下面的代码相同。复制以下代码并在 PowerShell 中运行以注册计划任务。
生成的计划任务将在本地 SYSTEM 帐户下运行。您可以根据需要随意分配不同的用户帐户来运行计划任务。
# Register the scheduled task in the system.
## Scheduled Task Name
$TaskName = 'Update Cloudflare Dynamic DNS'
## Scheduled Task Description
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Create the scheduled task
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'
如下所示,该命令创建了计划任务,并且状态为就绪。从此时起,脚本将以五分钟的间隔运行一次。
结论
通过动态 IP 地址更改保持 DNS 记录更新并不一定是一个挑战。您也无需为动态 DNS 服务付费!通过在 Cloudflare 中管理您的 DNS 区域,您可以利用他们的 API,允许您以编程方式更新您的 DNS 记录。
您在本教程中学习了如何结合使用 API 调用、PowerShell 7 和计划任务来更新 Cloudflare 动态 DNS 记录。所有这些都允许您配置一次 Cloudflare 动态 DNS 更新机制,并保持更新在无人值守的情况下运行。
您是否会考虑使用 Cloudflare 管理您的 DNS 区域以获得其 API 的优势?或者您知道有更方便、更容易使用的方式吗?
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag