功能介绍
支持阿里云dns解析,DNSPod(腾讯云)dns解析,实现客户端动态域名解析,支持ipv6,https协议
前情提要
为了自建cdn节点的地址解析,每个节点都配置一遍dnspod和alidns的api感觉不太合适(api泄密)
考虑了一下,准备在中心服务器用httpsPOST方式接收节点发来的IP信息,鉴权之后统一向服务商更新
鉴权实现
这里考虑使用类似ipv4地址的形式,只不过地址压缩到24位(For example:215.225.37)
而且方便在数据库里做索引。再添加一个device id,一个key:64位随机字符串,如果都相当,那么就鉴权成功
开源地址
这么好的软件肯定是开源软件啦
[gt href='https://github.com/OldTaoge/ddnsService']OldTaoge/ddnsService[/gt]
服务商的API
Dndpod:https://www.dnspod.cn/docs/index.html
Alidns:https://help.aliyun.com/document_detail/29739.html
Python的SDK:https://help.aliyun.com/document_detail/53090.html
ApiKey创建:
- https://ram.console.aliyun.com/users (阿里叫它AccessKey ID 和 AccessKey Secret)
- https://console.dnspod.cn/account/token
ApiKey填在index.py12行13行(只要识字就不会填错吧)
使用到的列表放在这里,方便参考
- Alidns
- UpdateDomainRecordRequest
- DescribeDomainRecordsRequest
- Dnspod
- UserDetail (检测登录信息是否正确)
- RecordList
- RecordModify
数据库的实现
实现基于pymysql,配置在db.py,请自行修改。另数据库可直接导入ddns.sql
数据库要实现以下功能
- 储存客户端的信息,以便鉴权
- 储存每个客户端的地址对应需要更新的域名解析记录
- 储存记录更新情况
故设计三个表,分别实现对应的三个功能
- ipRec(id,bit1,bit2,bit3,LoginToken,remark)
- ddnsTodo(id,v4todo,v6todo)
- History(id,cliId,ip,ipVersion,ServicerReturn,Time,status)
Tips:望文生义是个好方法
其中ddnsTodo表的v4todo和v6todo储存着Json格式的数据,格式如下:
[ { "line": "",//线路,参考Class AliAPI和DnsPodAPI的dict LineToLine "domain": "",//你的要更新的域名的上一级域名 "service": "ali",//ali/pod "sub_domain": ""//你要更新的主机记录 }, ··································以此类推 ]
提示:域名分割方法
a.example.com -> sub_domain:a, domain:example.com
a.b.example.com -> sub_domain:a, domain:b.example.com
通讯协议
基于https,post方式
参数列表
- LoginID 对应数据库id
- LoginToken 对应数据库LoginToken
- From 对应数据库bit1,bit2,bit3
- ipVersion 望文生义
- ip4
- ip6
客户端Example
现在只写了Linux的shell(这算客户端吗)
ipv4:
interface= LoginID= LoginToken= From=0.0.0 ipVersion=4 ipv4Addr=`ip add show interface | grep "scope global" |grep "peer" | awk '{ print2}'|cut -d "/" -f1` #ip add show interface | grep "scope global"| awk '{ print2}'|cut -d "/" -f1 echo ipv4Addr #Way1 ip=`curl http://checkip.dyndns.com/` ip={ip#*: } ipv4Addr={ip%%<*} echoipv4Addr #way2 echo `curl -X POST https://ServerAddress/ddns/Set -d 'LoginID='LoginID'&LoginToken='LoginToken'&From='From'&ipVersion='ipVersion'&ip'ipVersion'='ipv4Addr`
ipv6:
interface= LoginID=6 LoginToken= From=0.0.0 Servicer=240e #2409->China Mobile #2408->China Unicom #240e->China Telecom ipv6Addr=`ip add show | grep "scope global"| awk '{ print 2}'|cut -d "/" -f1 |grepServicer |tail -n 1` echo ipv6Addr echo `curl -X POST https://ServerAddress/ddns/Set -d 'LoginID='LoginID'&LoginToken='LoginToken'&From='From'&ipVersion=6&ip6='$ipv6Addr' '`
运行环境
Python3
Packages:Flask,requests,aliyunsdkcore,aliyunsdkalidns,pymysql
运行方法:直接运行index.py或者使用uwsgi(推荐)