方永、南天紫云

道亦有道

OpenWrt使用dnspod的动态域名解析(ddns)功能
作者 vinoca 發布於 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(xxxx@xxx.com) -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' 'aa@bb.com'   #登录邮箱
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 ,前者的优先级高于后者。格式如下:

login_email=xxx@163.com
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版本发布。

更多请移步至此。

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