在Windows上利用CloudFlare实现DDNS(动态域名解析)

作者: lesca 分类: Tutorials,Web,Windows 发布时间: 2012-07-13 15:34

1.准备工作:

  • 一个可用于测试的顶级域名(本文以sisca.info为例说明)
  • CloudFlare账号及API Key(在Account里可以找到)
  • 在CloudFlare上增加一个用于测试的子域名记录,如virt
  • 可运行在Windows上的wget命令工具
  • 可返回当前主机IP地址的WEB服务器,如本站提供的http://ip.sisca.info
  • 或者可以使用he.net提供的http://checkip.dns.he.net/

注意:CloudFlare在本文中有时简称CF

2.利用CloudFlare API更新A记录

最新的API接口请访问http://www.cloudflare.com/docs/client-api.html

lesca将以POST方式将参数传递给CF,CF将以json格式返回调用结果。以下是CF官网更新记录的实例:

curl https://www.cloudflare.com/api_json.html \
  -d 'a=DIUP' \
  -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' \
  -d 'email=sample@example.com' \
  -d 'ip=0.0.0.0' \
  -d 'hosts=example.com,www.example.com,test.example.com'

成功时的返回结果:

{
"result": "success",
"msg": null
}

由于lesca没有找到Windows上的curl命令,因此改用wget代替,以下是命令实现:

wget --no-check-certificate \
     --post-data %POSTDATA% \
     -O ddns.txt \
     https://www.cloudflare.com/api_json.html

其中变量%POSTDATA%的值为:

a=DIUP&tkn=cfd844f2464bef3b67544393e84767b35xxxx&email=your@mail.com&hosts=virt.sisca.info&ip=0.0.0.0

变量之间用“与”符号(&)连接。
/!\注意:在cmd环境中,“与”符号(&)是保留字,需要用符号(^)进行转义!

3.动态域名解析(DDNS)

知道如何更新A记录之后,我们就能让系统自动更新记录。但是如果要实现DDNS,那么就必须知道当前主机的外网IP,我们可以通过查询IP地址的网站获得,但是如果要让整个过程自动完成,那么就需要一台仅返回IP地址(甚至连HTML头都没有)的WEB服务器,这样通过wget就能获取当前的外网IP了。
lesca有个域名(http://ip.sisca.info)专门完成这个事情,he.net也提供类似的功能(http://checkip.dns.he.net/

),但是它包含HTML头,这给脚本处理带来一定麻烦。本文将以http://ip.sisca.info为例进行介绍。下面这段脚本将会自动获取外网IP地址,并将其提交到CF更新A记录:

@echo off
set ROOT=C:\Scripts
set POST="a=DIUP&tkn=cfd844f2464bef3b67544393e84767b35xxxx&email=your@mail.com&hosts=virt.sisca.info&ip=

REM Get IP Address
"C:\Program Files (x86)\GnuWin32\bin\wget.exe" "http://ip.sisca.info" -O %ROOT%\ip.txt
for /F %%i in (%ROOT%\ip.txt) do set IP=%%i
set IP=%IP%"
REM Set A Record
"C:\Program Files (x86)\GnuWin32\bin\wget.exe" --no-check-certificate --post-data %POST%%IP% -O %ROOT%\ddns.txt https://www.cloudflare.com/api_json.html

exit 0

4.转为服务在后台运行

lesca之前和大家探讨过如何在Windows启动时(而非登录后)自动进行PPPoE拨号,现在可以在PPPoE拨号成功后插入以上代码。以下是比较稳定的版本:

@echo off
set ROOT=C:\Scripts
set POST="a=DIUP&tkn=cfd844f2464bef3b67544393e84767b35xxxx&email=your@mail.com&hosts=virt.sisca.info&ip=

echo Connecting... >> %ROOT%\output.txt
:loop
ping localhost
echo %date% %time% >> %ROOT%\output.txt
"c:\windows\system32\rasdial.exe" ct pppoe_user pppoe_pass >> %ROOT%\output.txt
echo. >> %ROOT%\output.txt
if not %errorlevel% == 0 (goto loop)

REM Get IP Address
"C:\Program Files (x86)\GnuWin32\bin\wget.exe" "http://ip.sisca.info" -O %ROOT%\ip.txt
for /F %%i in (%ROOT%\ip.txt) do set IP=%%i
set IP=%IP%"
REM Set A Record
"C:\Program Files (x86)\GnuWin32\bin\wget.exe" --no-check-certificate --post-data %POST%%IP% -O %ROOT%\ddns.txt https://www.cloudflare.com/api_json.html

exit 0

我们还可以在任务计划中指定,令系统每隔一定时间运行一次该脚本,确保IP地址为最新。这不会影响PPPoE的状态,因为rasdial.exe会自动判断当前连接状态。

版权声明

本文出自 Lesca 技术宅,转载时请注明出处及相应链接。

本文永久链接: https://www.lesca.cn/archives/ddns-with-cloudflare-on-windows.html

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

5 Comments
  • Ronghui electronic factory

    2012-09-10 at 15:17

    修改了于域名的dns服务器对域名的使用有影响么

    1. Ronghui electronic factory

      2012-09-10 at 15:18

      必须要修改城cloud的dns么

    2. lesca

      2012-09-11 at 15:14

      修改之后你的域名的所有记录都通过CloudFlare管理。本文讲的是利用CF免费实现DDNS,因此必须修改成CF的NS

  • FindideaTW

    2017-07-08 at 00:44

    返回信息寫{“result”:”error”,”msg”:”Invalid Input – missing ‘act’ param”,”err_code”:”E_INVLDINPUT”}

    語法 Win10 Cmd
    @echo off
    set ROOT=C:\Scripts
    set POST=”a=DIUP^tkn=050exxxxx83fc54xxxa560xx89^email=gendenskin@gmail.com^hosts=web.ed-studio.net^ip=

    REM Get IP Address
    “C:\Program Files (x86)\GnuWin32\bin\wget.exe” “http://esismail.com/getip.asp” -O %ROOT%\ip.txt
    for /F %%i in (%ROOT%\ip.txt) do set IP=%IP%”
    set IP=%IP%”
    REM Set A Record
    “C:\Program Files (x86)\GnuWin32\bin\wget.exe” –no-check-certificate –post-data %POST%%IP% -O %ROOT%\ddns.txt https://www.cloudflare.com/api_json.html

    exit 0

    1. lesca

      2017-07-10 at 11:32

      API接口发生了变化,博主已经不用CloudFlare,本文方法仅供参考