blob: 79eeb7c0b734ac35fdbdc6d83eba9b1316e9f5a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# 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`是核心功能插件集合,这些插件无需注册,可视为项目功能的工具集合
### 使用
1. 需要部署特制xmap作为探测工具
https://git.mesalab.cn/handingkang/ohxmap
2. 部署一个neo4j数据库作为存储,并将neo4j的部署信息同步到conf/corefile中,系统会自动读取并将解析结果存储到该neo4j数据库
3. 新建/plugin/v64dns/analyze/pb/data文件夹,并埃文离线数据库(awdb)格式放置其中
- 所需的数据库文件名如下
- ```python
IP_scene_all_cn.awdb
IP_city_single_BD09_WGS84_ipv6_en.awdb
IP_basic_single_WGS84_en.awdb
```
4. 部署本代码作为自建权威,推荐使用docker镜像的方式
```shell
docker build -t ohmydns -f Dockerfile .
```
生成镜像之后运行容器即可
```shell
docker run -dit --restart=always --network=host ohmydns
```
### 核心插件
存放在/plugin/pkg中,负责所有底层DNS请求、响应的实现(类似于sapp解析层插件)
### 业务插件
存放在plugin,负责各种业务层处理实现(类似于sapp业务层插件)
### 插件注册方式
所有插件均需要实现`init()`函数以在插件链中注册,例如
```go
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 |
|