基于CoreDNS和etcd实现动态域名解析

在我开发的项目notr内网穿透当中引入DNS来解决一个问题:git

  • 动态配置*.notr.tech的A记录

每次客户端链接都会修改其A记录,解析到链接的服务器节点上。目前DNS版本还很是简单,已经开源成notrns项目。可是这个项目还有几个问题:github

  • 数据存储在boltdb当中,只能本地用
  • 若是流量比较大,须要部署多个dns节点,数据同步问题比较麻烦
  • 性能有待测试,能工做,可是工做的极限还不知道

经过github了解到CoreDNSetcd两个项目,就想着用CoreDNS代替notrns来作动态域名解析,使用etcd来作存储,使用etcd是基于如下考量:mongodb

  • 迁移方便
  • CoreDNS有etcd插件,不用额外开发
  • 后续考虑引入etcd来作配置管理。

测试

  1. 启动etcd
  2. 启动coredns

CoreFile:数据库

notr.tech {
    etcd  {
        path /skydns
        endpoint http://localhost:2379
        upstream
    }
    log
}

复制代码
  1. 使用etctrl设置域名解析
➜  bin git:(master) ./etcdctl put /skydns/tech/notr/yingjiu/ '{"host":"192.168.1.2"}'

OK
➜  bin git:(master) nslookup yingjiu.notr.tech 127.0.0.1
Server:		127.0.0.1
Address:	127.0.0.1#53

Name:	yingjiu.notr.tech
Address: 192.168.1.2

➜  bin git:(master) ./etcdctl put /skydns/tech/notr/yingjiu/ '{"host":"192.168.1.3"}'

OK
➜  bin git:(master) nslookup yingjiu.notr.tech 127.0.0.1
Server:		127.0.0.1
Address:	127.0.0.1#53

Name:	yingjiu.notr.tech
Address: 192.168.1.3

➜  bin git:(master)
复制代码

接下来只须要在registry将etcd client集成进去便可,改造完以后整个软件变成了下图所示的流程。bash

notr架构

  1. 每次启动一个服务端节点以后,会往registry发送当前节点的信息,目的是让registry作负载均衡以及根据地理位置进行调度,同时服务端节点也能够随时插拔,随时均可以添加和删除节点。
  2. 把节点信息写入数据库,当前使用mongodb
  3. 步骤一和步骤二初始化完成以后,用户使用客户端,先和registry节点链接,获取接入的服务节点的信息
  4. registry从数据库中取出在步骤二中存储的节点信息,并根据节点当前链接的客户端数量和地理位置进行一轮选择,首选地理位置最近的,目前只划两个区,中国区和海外区,而后再根据客户端链接数量排序选择链接数最少的。
  5. 客户端拿到节点信息以后和server创建tcp长链接
  6. server节点须要从registry请求用户,限速等信息
  7. 从数据库取出数据
  8. 生成域名解析记录,将当前用户等域名映射到它当前链接到server的公网IP
  9. 每次须要域名解析时,因为配置了ns记录,用户的域名解析请求最终会到coredns,coredns再从etcd中取出
相关文章
相关标签/搜索