方永、南天紫云

道亦有道

OpenWrt使用dnspod的动态域名解析(ddns)功能
2012年06月10日

折腾了一下,在OpenWrt里用上了dnspod的ddns。

缘起:前俩天看到dnspod开源了他们的dns服务器软件,虽然以前也注册了,但没怎么用,这次看了dnspod的轶事,以及官网上对免费用户的大度,全开放的特性,完善的用户API及文档,较之于花生辣椒之类果然有大家风范,另一个原因就是之前一直用3322,3322只支持电信线路,偶尔会用移动的网,这个真伤不起。

先在dnspod.cn注册个帐户,然后添加域名,这个域名当然得自己买,一些后缀的域名也不贵,我就用上了之前基本上闲置的一个域名,记得在域名注册商那里把DNS服务器改为dnspod的,再在这个域名下添加一个子域的A记录,然后用api查询这个记录的id,和下面cron中的命令基本一致,只是将api换成Record.List。具体去看dnspod官网的pdf说明吧。再将之前添加的A记录的id替换到下面cron中命令的record_id项。

首先安装curl或者wget,然后在luci中加入计划任务ddns,若没有luci则crontab -e加入如下内容:

\*/15 * * * *  curl –cacert /etc/ssl/cacert.pem -A “sddns/0.0.1([email protected])” -d “login_email=xxxx@xxxx&login_password=xxxxxxx&format=json&error_on_empty=no” -d “domain_id=9999999&record_id=99999sub_domain=openwrt&record_line=默认” https://dnsapi.cn/Record.Ddns

上面curl的–cacert选项指定CA证书文件,内容如下:

Equifax Secure CA
=================
—–BEGIN CERTIFICATE—–
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
70+sB3c4
—–END CERTIFICATE—–

其它的根证书可wget http://curl.haxx.se/ca/cacert.pem 下载。 -A选项指定客户端类型,一定如上面的格式。

-d选项指定post数据,一个-d选项指定了基本的参数,登录帐号密码之类,第二个-d选项指定了Record.Ddns这个api所需的参数。

最终应该是在重启OpenWrt之后cat /etc/crontabs/root能看到上面的内容。

呃,整理了一下,做了个ipk包出来: 下载最新版 以下是简介及更新说明,更详细的使用说明请看这里

sddns,dnspod ddns client for OpenWrt.

sddns是OpenWrt下面dnspod的动态域名更新的客户端。有如下特点:

  1. 使用posix兼容shell语法,能够运行在包括OpenWrt、DDwRT等嵌入式及其它linux/UNIX甚至Windows操作系统上。
  2. 代码短小精悍,符合dnspod API开发规范。0.0.6版本100行左右,在IP未发生变化时,只执行一次curl来检测IP,并不向dnspod提交任何数据。低碳环保 ^_^ 。
  3. 采用MIT开源协议,可轻易地获得源代码。

配置文件(/etc/config/sddns):

config base_arg
option 'login_email' '[email protected]'   #登录邮箱
option 'login_password' 'ccdd'  #登录密码
option 'main_domain' 'baidu.com'  #域名,形如"baidu.com"
option 'sub_domain' 'xx' #主机记录,形如"xx.baidu.com"
 
# 下面这个区域不需做任何配置,sddns会存放一些临时数据,如果更改了上面的域名与主机记录,删除下面区域中的"xxx_id"项
 
config tmp_arg
# ssl cacert file or directory
option 'cacert' '/etc/ssl/cacert.pem'   # 证书文件位置,默认不用修改

sddns 2012年8月25日更新:

配置文件中增加一项”net_ip”,这个地址用来获取外部IP地址的,即”curl xxx.com”返回的是当前设备的公网IP,默认是 netip.sinaapp.com,是新浪的SAE,ping值小。

添加”net_ip”的目的是减少dnspod的资源消耗,至少会减小日志文件的大小,虽然从netip取公网IP消耗了一定的资源,但取公网IP的PHP代码本身很少,而且这个netip可以更换,若n*个ddns同时运行,这个分流效果还是明显的。

2012年9月5日更新:

“/etc/config/sddns”配置文件中 option 'net_ip' 'ifconfig.me' 更改为 option 'wlan_ip' 'ifconfig.me'

2012年9月22日更新:

分析外网IP的sed语句重写,更健壮。

2012年10月16日更新:

0.0.6版本发布。

OpenWrt部分继续优化,现在已支持linux/FreeBSD,配置文件为$HOME/.sddnsrc/etc/sddns.conf ,前者的优先级高于后者。格式如下:

[email protected]
login_password=xxxxxxxxx
main_domain=baidu.com
sub_domain=me
wanip=c.lexun.com/ip

2013年05月09日更新:

0.0.7版本發布。

修正OpenWrt版本在12.09以上時,functions.sh目錄調整問題。

2013年06月08日更新:

0.0.8版本發佈。

此版本與之前的版本有些不同,沒有使用OpenWrt的配置文件解析庫,故是一個高度兼容的版本,可以運行在OpenWrt、dd-Wrt、general linux、FreeBSD上,而只依賴wget、POSIX shell、sed。(注意,busybox的wget不支持https,故無法使用)詳情請穿越到此。

2013年08月02日更新:

0.0.9版本发布。

更多请移步至此。

本文不再更新,更多請看這裏。