将dd-wrt动态DNS客户端与CloudFlare一起使用


8

我正在尝试使用dd-wrt(v24-sp2)固件在路由器上配置动态DNS客户端,以便它可以动态更改DNS记录之一中的IP地址。不幸的是,我遇到了一个问题……这是来自ddclient配置的示例请求:

https://www.cloudflare.com/api.html?a=DIUP&u=<my_login>&tkn=<my_token>&ip=<my_ip>&hosts=<my_record> 

如果在浏览器中使用它,它将起作用,但是在dd-wrt中,我得到以下输出:

Tue Jan 24 00:36:47 2012: INADYN: Started 'INADYN Advanced version 1.96-ADV' - dynamic DNS updater. 
Tue Jan 24 00:36:47 2012: I:INADYN: IP address for alias '<my_record>' needs update to '<my_ip>' 
Tue Jan 24 00:36:48 2012: W:INADYN: Error validating DYNDNS svr answer. Check usr,pass,hostname! (HTTP/1.1 303 See Other 
Server: cloudflare-nginx 
Date: Mon, 23 Jan 2012 14:36:48 GMT 
Content-Type: text/plain 
Connection: close 
Expires: Sun, 25 Jan 1981 05:00:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Location: https://www.cloudflare.com/api.html?a=DIUP&u=<my_login>&tkn=<my_token>&ip=<my_ip>&hosts=<my_record> 
Vary: Accept-Encoding 
Set-Cookie: __cfduid=<id>; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.cloudflare.com 
Set-Cookie: __cfduid=<id>; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.www.cloudflare.com 

You must include an `a' paramiter, with a value of DIUP|wl|chl|nul|ban|comm_news|devmode|sec_lvl|ipv46|ob|cache_lvl|fpurge_ts|async|pre_purge|minify|stats|direct|zone_check|zone_ips|zone_errors|zone_agg|zone_search|zone_time|zone_grab|app|rec_se

来自“位置”的URL可以正常工作,并且包含参数“ a”。有什么问题?


我不清楚您要在这里实现什么,请您更清楚一点。
斩波器

我正在尝试使用路由器中的服务在CloudFlare中更改A记录,该记录管理更改的IP地址并动态更新域信息。
罗马

我有同样的问题,但是我发现了一些可以帮助我们指出正确方向的东西。在wget中输入相同的URL字符串会出现相同的问题,但firefox不会。

你有没有解决这个问题?
bjtitus 2012年

不幸的是,还没有。我编写了一个简单的python脚本,并使用它来手动更新IP。
2012年

Answers:


9

我认为您无法在DD-WRT直接调用CloudFlare的地方进行设置。我配置它的方式是让DD-WRT在远程Web服务器上调用PHP脚本,然后该脚本将检测客户端IP并将更新请求通过其API发送到CloudFlare。

DD-WRT DDNS设置

DDNS Service: Custom
DYNDNS Server: <yourserver.com>
Username: <anything>
Password: <anything>
Host Name: <your domain name to update on cloudflare>
URL: /cloudflare_update.php?key=<your secret key>&hostname=

cloudflare_update.php

if(empty($_GET['key']) || ($_GET['key'] != "<your secret key>")) die;
$hostname = $_GET['hostname'];
$ip = $_SERVER['REMOTE_ADDR'];
$username = "<yourcloudflareusername@email.com>";
$api = "<your cloudflare api key>";
$curl = "https://www.cloudflare.com/api_json.html?a=DIUP&hosts=$hostname&u=$username&tkn=$api&ip=$ip";
$ch = curl_init($curl);
curl_exec($ch);
curl_close($ch);

我没有使用HTTP基本身份验证,而是使用了随机密钥。

确保为要在CloudFlare上更新的域名创建DNS条目;DIUP操作参数将仅更新已存在条目的IP。


2
感谢您的建议。我不得不修复您的代码,因为它无法正确检测到我的IP地址。我从这个答案到另一个问题使用了代码。结果是-https: //gist.github.com/3149751
罗马

3

如果您想从路由器执行更新,则无法避免这样的事实,您需要在中间添加一些“东西”以将呼叫转换为CloudFlare格式(如果只有DNS-O-Matic会将其添加到他们支持的服务...)。无需自己托管中间脚本,您只需使用Google AppEngine(免费)即可为您进行此重新发布。我用这个:

https://cloudflare-updater.appspot.com/

好的,您仍然必须调用CloudFlare以外的其他方式来发布更新,但是至少您不需要运行额外的主机或VPS等来自己进行更新。它是完全透明的-唯一的问题是您没有收到返回的错误,因此您需要检查它是否正常工作。一旦运行,就应该运行。


我收到错误消息:验证DYNDNS svr答案时出错。检查usr,pass,主机名!(HTTP / 1.0 302找到
ayr-ton 2014年


0

设法通过以下方法使之正常工作:https//github.com/dcerisano/Cloudflare-dynamic-dns

设置Cloudflare帐户后,即可轻松找到所需信息:

您需要:区域ID

授权密钥(又称全局api密钥)

您网域的A记录ID(可通过运行cloudflare-dns-id.sh脚本获得),我不得不对该脚本进行一些调整以使其正常工作。

curl -X GET“ https://api.cloudflare.com/client/v4/zones/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/dns_records?type=A&name=dynamic ” \ -H“ X-Auth-Email:you@youremail.com” \ -H “ X-Auth-Key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx” \ -H“内容类型:application / json”

我将两个脚本都存储在/ jffs中,以使其可执行。

在Cloudflare方面,我按照本指南设置了Cloudflare域记录:

https://support.opendns.com/hc/zh-CN/community/posts/115000937008-How-to-set-up-DNS-O-MATIC-for-Cloudflare-and-the-other-way-around-和一个FritzBox

在Cloudflare,您必须设置以下记录:

  • 类型:A | 名称:动态| 值:“您的WAN IP” ***

  • 类型:CNAME | 名称:“ yourdomain.xyz” | 值:动态。“ yourdomain.xyz”

  • 类型:CNAME | 名称:www | 值:“ yourdomain.xyz”

我设置了一个cron作业,每隔5分钟运行cloudflare-ddns.sh来检查IP更改。

现在,只要更改WAN IP,我的DD-WRT路由器就会自动更新Cloudflare。

上面的过程大约需要10分钟。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.