- Go 98.2%
- Python 1.7%
| conf | ||
| core | ||
| coremain | ||
| pb | ||
| plugin | ||
| test | ||
| .dockerignore | ||
| .gitignore | ||
| coredns.go | ||
| directives_generate.go | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| plugin.cfg | ||
| README.md | ||
| start.sh | ||
IPv6 DNS服务测绘工具——Ohmydns
功能需求
基于coredns改进而来的DNS服务组件,以caddy作为底层调度实现。主要用于DNS解析器的测量,通过多种插件,可同时作为解析器与自建权威服务。 ohmydns的主要特点是实现了v64dns插件,该插件作用是借助CNAME重定向的原理,可以通过IPv4 DNS入口发现IPv6递归解析器以及两者之间的关联关系。
部署环境
系统
Linux/Mac
网络环境
IPv4/IPv6双栈
其他环境
Docker、 Neo4J
目录以及关键文件解释
/core是探测端和DNS服务端核心基础代码的实现
/core/dnsserver主要包括服务端在caddy中的注册、启动,以及核心处理逻辑代码。目前支持DoH/Do53/DoT的解析服务
/coremain是项目的启动入口,主要通过调用caddy的一系列接口完成服务注册、端口监听和请求处理工作
/plugin是业务插件的集合。为规范代码风格,所有业务插件包需要包含两部分:setup.go和XXX.go,
其中setup.go用于将业务插件注册到插件链中,详情可参考whoami插件的实现(/plugin/whoami)
/plugin/pkg是核心功能插件集合,这些插件无需注册,可视为项目功能的工具集合
使用
-
需要部署特制xmap作为探测工具 https://git.mesalab.cn/handingkang/ohxmap
-
部署一个neo4j数据库作为存储,并将neo4j的部署信息同步到conf/corefile中,系统会自动读取并将解析结果存储到该neo4j数据库
-
新建/plugin/v64dns/analyze/pb/data文件夹,并埃文离线数据库(awdb)格式放置其中
-
所需的数据库文件名如下
-
IP_scene_all_cn.awdb IP_city_single_BD09_WGS84_ipv6_en.awdb IP_basic_single_WGS84_en.awdb
-
-
部署本代码作为自建权威,推荐使用docker镜像的方式
docker build -t ohmydns -f Dockerfile .生成镜像之后运行容器即可
docker run -dit --restart=always --network=host ohmydns
核心插件
存放在/plugin/pkg中,负责所有底层DNS请求、响应的实现(类似于sapp解析层插件)
业务插件
存放在plugin,负责各种业务层处理实现(类似于sapp业务层插件)
插件注册方式
所有插件均需要实现init()函数以在插件链中注册,例如
func init() { plugin.Register("插件名", setup) }
setup是一个函数,这个函数一般用于解析配置文件中的参数,并返回一个可调用对象给caddy
该对象可在另一个**.go中进行定义,并且需要实现ServeDNS()(用于服务端)或者ProbeDNS() (用于探测端)方法
部署方式
项目打包为Docker镜像进行容器化部署,
配置项
Corefile
存放在conf文件夹中,具体配置规则参照coredns的corefile
v64DNS
v64dns zone {
...
}
zone代表权威负责解析子域的上一级父域,例如假设自建权威负责v4.n64.top域的解析,则zone为n64.top
| 配置项 | 语法格式 | 说明 | 示例 |
|---|---|---|---|
| v4ns | v4ns <域名> <IP地址> | 负责v4子域的NS信息,需要与域名注册商的信息保持一致 | v4ns ns4 1.1.1.1 |
| v6ns | v6ns <域名> <IP地址> | 负责v6子域的NS信息,需要与域名注册商的信息保持一致 | v6ns ns6 2001::1 |
| chain | chain <v4域名> <v6域名> | 是否进行v4/v6-only子域名切换,以及对应的v4/v6-only子域名 | |
| ip-embed | ip-embed | 布尔型配置项,控制是否进行ip嵌入 | |
| chain-mlen | chain-mlen <整数> | 最大CNAME解析链长度 | |
| analyze | analyze <数据库类型> <数据库地址> <用户名> <密码> | 分析结果的存储位置,目前仅支持neo4j图数据库 |
库表设计——V64DNS
MySQL数据库
本项目暂未使用Mysql存储,因而待定
图数据库--Neo4J
节点——ResolverFromDo53
节点ID由Neo4J自动分配管理
| 属性名 | 说明 | 示例 |
|---|---|---|
| AS | 自治域号 | AS15169 |
| COU | 国家 | China |
| CODE | 国家代码 | CN |
| LAT | 纬度 | 39.916527 |
| LNG | 经度 | 116.397128 |
| ISP | 服务商 | Google Inc. |
| IPtype | IP类型(v4/v6) | v6 |
| PROVINCE | 省份 | Beijing |
| TIME | 首次发现时间 | 1234892919.655932 |
| LTIME | 最近一次发现时间 | 1234892919.655932 |
| IP | IP地址 | 2001::1 |
| W | 权重,实际等于总共被发现的次数,用以表现在实际解析中节点的关键程度 | 1 |
边(关联)
neo4j通过分别匹配相同的源节点和目的节点来找到对应的边
| 属性名 | 说明 | 示例 |
|---|---|---|
| W | 权重,实际等于总共被发现的次数,用以表现实际解析中该解析路径的关键程度 | 1 |