借助阿里云DNS的API,通过定时检测IP变动,自动更新DNS域名解析数据来实现动态域名解析(DDNS)功能。
功能:
- 支持指定配置文件
- 支持IPv4和IPv6同时更新
- 支持多域名
- 支持宽带有多个公网IP,或者有多个宽带的情景(比如宽带多拨)
- 支持缓存
- 支持自定义TTL
- 支持自定义IP检测周期
- 支持Docker
最近发现宽带运营商分配了IPv6地址,此前自己用Erlang写的DDNS程序并没有支持这种情况,遂计划用Go重新写一份。
本项目SDK的调用借鉴了 airring/aliyun-dns,特此感谢 @airring 。
参考 config.yaml:
-
accessKeyId
: 阿里云的授权ID -
accessKeySecret
: 与accessKeyId
对应的授权密钥 -
log
:日志相关配置path
:日志文件保存的路径,例如:/var/log/
。level
:日志记录的最低级别,有 debug,info,warn,error 这四种。例如配置为 info 时就不会记录debug日志。develop
:开发者模式,开启后会输出代码文件和堆栈信息。
-
ipv4_check_url
: 通过该URL获取网络的IPv4地址, 当前仅支持返回IP的URL,返回json或其它复杂数据结构无法处理 -
ipv6_check_url
: 通过该URL获取网络的IPv6地址, 当前仅支持返回IP的URL,返回json或其它复杂数据结构无法处理 -
ttl
: 域名的TTL,从阿里云后台查询,普通域名是 600 -
interval
: 公网IP检测周期,单位秒(s) -
broadband_retry
: 重复次数不能小于宽带多拨情景下的宽带数量(可能会出现的公网IP数量),如果配置了负载均衡,还要保证数量能覆盖到所有宽带(负载均衡的最小公倍数)。
-
customer
:domain
: 主域名(如果要更新的域名是dns.aliyuncs.com
,那么aliyuncs.com
是主域名,dns
是子域名前缀)ipv4_rr
: IPv4地址对应的 子域名前缀ipv6_rr
: IPv6地址对应的 子域名前缀
- 1、
ipv4_check_url
和ipv6_check_url
用来获取本机的公网IP,不写则不使用对应项,至少配置一个。 - 2、
ipv4_rr
和ipv6_rr
不写则不使用对应项,至少配置一个。 - 3、 允许配置多个域名,在
customer
下配置多个域名时,会自动更新这些域名的解析记录。
accessKeyId 和 accessKeySecret 需要从阿里云 用户AccessKey下拉菜单中申请。
详细可以进入: 如何申请AccessKey
git clone https://github.com/qingchuwudi/aliyun-dns
cd aliyun-dns
go build .
./aliyun-dns -c config.yaml
docker run --name=aliyun-dns --restart=unless-stopped --net=host -v /etc/alidns-config.yaml:/etc/config.yaml -d qingchuwudi/aliyun-dns:v2.1.2
注意:
-
1、要使用
--net=host
网络模式启动,和宿主机使用同一个网络,这样可以保证获取的IP与宿主机一致。参考资料 Docker 网络:host模式
-
2、修改配置文件以后,重启docker生效:
docker restart aliyun-dns
。 -
3、支持多种不同架构环境下运行:amd64(即x86_64)、386(即x86)、arm64、arm/v7。
Docker使用桥接或者其它网络模式运行时,Docker内的IPv6和主机真实的IPv6不一定相同。
因为国内IPv4是路由下面的DHCP,但是观察发现IPv6是为局域网环境中每个主机分配一个公网IPv6地址,并不是一个宽带使用一个IPv6地址。