自建动态域名更新系统 多终端 多平台 运营商分流 IPv6 Dnspod AliDNS Python Flask
本文最后更新于 490 天前,其中的信息可能已经有所发展或是发生改变。 原创文章保留所有权利,允许提前告知征得同意并在明显位置保留原文链接的转载,任何无视版权的行为将受到搜索引擎的 DMCA 投诉。

功能介绍

支持阿里云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
数据库要实现以下功能

  1. 储存客户端的信息,以便鉴权
  2. 储存每个客户端的地址对应需要更新的域名解析记录
  3. 储存记录更新情况

故设计三个表,分别实现对应的三个功能

  1. ipRec(id,bit1,bit2,bit3,LoginToken,remark)
  2. ddnsTodo(id,v4todo,v6todo)
  3. 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 '{ print $2}'|cut -d "/" -f1`
#ip add show $interface | grep "scope global"| awk '{ print $2}'|cut -d "/" -f1
echo $ipv4Addr
#Way1
ip=`curl http://checkip.dyndns.com/`
ip=${ip#*: }
ipv4Addr=${ip%%<*}
echo $ipv4Addr
#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 |grep $Servicer |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(推荐)

半亩方塘 , 版权所有丨如未注明 , 均为原创丨本网站采用CC BY-NC-SA 3.0 CN反996许可证协议进行授权
转载请注明原文链接:自建动态域名更新系统 多终端 多平台 运营商分流 IPv6 Dnspod AliDNS Python Flask
上一篇
下一篇