No description
This repository has been archived on 2026-06-16. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • Go 98.2%
  • Python 1.7%
Find a file
2024-06-16 08:48:56 +00:00
conf 1. 修复已知问题 2024-01-03 02:58:13 +00:00
core 修复分析器代码问题 2023-12-20 00:22:44 +08:00
coremain 修复分析器代码问题 2023-12-20 00:22:44 +08:00
pb 初始化提交 2023-12-18 15:40:11 +08:00
plugin 1. 修复已知问题 2024-01-03 02:58:13 +00:00
test 模块命名重构 2023-12-18 19:55:06 +08:00
.dockerignore 问题修复 2023-12-18 23:00:14 +08:00
.gitignore 修复分析器代码问题 2023-12-20 00:22:44 +08:00
coredns.go 增加使用arl/statsviz监控的功能 2023-12-26 14:23:58 +08:00
directives_generate.go 插件列表生成逻辑修改 2023-12-19 16:17:16 +08:00
Dockerfile Update Dockerfile 2024-06-16 08:43:49 +00:00
go.mod 1. 解决内存泄露问题 2023-12-26 10:53:49 +00:00
go.sum 1. 解决内存泄露问题 2023-12-26 10:53:49 +00:00
plugin.cfg 初始化提交 2023-12-18 15:40:11 +08:00
README.md Update README.md 2024-06-16 08:48:56 +00:00
start.sh 配置文件路径修改 2023-12-25 02:25:22 +00:00

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.goXXX.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格式放置其中

    • 所需的数据库文件名如下

    • IP_scene_all_cn.awdb
      IP_city_single_BD09_WGS84_ipv6_en.awdb
      IP_basic_single_WGS84_en.awdb
      
  4. 部署本代码作为自建权威推荐使用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域的解析,则zonen64.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