在Windows上利用CloudFlare实现DDNS(动态域名解析)
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记录
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
Ronghui electronic factory
2012-09-10 at 15:17
修改了于域名的dns服务器对域名的使用有影响么
Ronghui electronic factory
2012-09-10 at 15:18
必须要修改城cloud的dns么
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
lesca
2017-07-10 at 11:32
API接口发生了变化,博主已经不用CloudFlare,本文方法仅供参考