使用Dnspod为Openwrt提供DDNS服务

Dnspod提供了一系列的API来让我们操作域名记录,刚好我的域名解析全部都放在Dnspod,所以就抽空把Dnspod的动态解析用到了家里的Openwrt路由器上。其实,直接使用shell脚本在Openwrt内请求Dnspod的API接口也可以,但是为了更贴近Openwrt原始的DDNS设置方式,对用户更友好,还是决定直接使用http请求,在Openwrt的DDNS提供商里增加一个选项的方式来做。

API接口的请求,我这里用了PhalApi一个开源的接口框架,非常的好用,顺便安利一下。

主要使用到Dnspod的两个接口,一个Record.List查询记录,一个Record.Ddns刷新记录。

首先是服务端的处理代码,主要就是调用Dnspod的接口,先拿到需要更新的域名记录,判断老的IP和当前提交的ip是否一致,一致则不更新,注意Record.Ddns接口有频率限制,所以需要做一致就不更新的判断。

<?php
/**
 * 基于PHP实现的Dnspod动态DNS
 * @author: Simon.H
 */
 
class Api_Dnspod extends PhalApi_Api {
    public function getRules() {
        return array(
            'index' => array(
                'username' => array('name' => 'username', 'default' => '', 'require' => true, 'desc' => '当Token使用,可以在Dnspod后台创建'),
                'password' => array('name' => 'password', 'default' => '', 'require' => false, 'desc' => '密码已弃用,直接使用用户名当做Token字段'),
                'maindomain' => array('name' => 'maindomain', 'default' => 'xxx.me', 'require' => false, 'desc' => '主域名'),
                'domain' => array('name' => 'domain', 'default' => '', 'require' => true, 'desc' => '需要更新的子域名'),
                'myip' => array('name' => 'myip', 'default' => '', 'require' => true, 'desc' => '需要更新到的IP')
            ),
        );
    }
    
    /**
     * 基于dnspod的动态DNS
     * @desc 根据客户端传来的参数更新dnspod域名解析
     * @return 
     */
    public function index() {
        $this->domain = str_replace('.' . $this->maindomain, '', $this->domain);
        $curl = new PhalApi_CUrl(2);
        $data = array(
                'login_token' => $this->username,
                'format' => 'json',
                'domain' => $this->maindomain,
                'sub_domain' => $this->domain
            );
        //https://dnsapi.cn/Record.Info -d 'login_token=LOGIN_TOKEN&format=json&domain_id=2317346&record_id=16894439'
        $rs = $curl->post('https://dnsapi.cn/Record.List', $data);
        
        if($rs){
            $record = json_decode($rs, true);
            $recordid = $record['records'][0]['id'];
            $line = $record['records'][0]['line'];
            $line_id = $record['records'][0]['line_id'];
            $value = $record['records'][0]['value'];
            if($value == $this->myip){
                return array(
                    'data' => 'IP一致无需更新.'
                );
            }else{
                //https://dnsapi.cn/Record.Ddns -d 'login_token=LOGIN_TOKEN&format=json&domain_id=2317346&record_id=16894439&record_line_id=10%3D3&sub_domain=www'
                $data = array(
                    'login_token' => $this->username,
                    'format' => 'json',
                    'domain' => $this->maindomain,
                    'record_id' => $recordid,
                    'record_line_id' => $line_id,
                    'record_line' => $line,
                    'sub_domain' => $this->domain,
                    'value' => $this->myip
                );
                $rs = $curl->post('https://dnsapi.cn/Record.Ddns', $data);
                if($rs){
                    return $rs;
                }
            }
        }
        return array(
            'data' => ''
        );
    }
}

服务器端完成后,在Openwrt里增加一个DDNS的提供商,DDNS提供商列表在/usr/lib/ddns/services中配置

"dnspod.com" "http://xxx.me/api/Public/simon/?service=Dnspod.index&username=[USERNAME]&password=[PASSWORD]&domain=[DOMAIN]&myip=[IP]"

然后,我们在Openwrt的后台里就可以选择我们增加的dnspod.com了,用户名填你在Dnspod申请到的Token,密码随便填已经没有什么意义了,域名填你需要更新的域名。

添加新评论