# analysis **Repository Path**: hexug/analysis ## Basic Information - **Project Name**: analysis - **Description**: 域名解析工具 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-13 - **Last Updated**: 2025-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ANA DNS 分析工具 一个基于 Go 的跨平台命令行 DNS 解析工具,支持多记录类型查询、批量域名解析、自定义 DNS 服务器、EDNS0 Client Subnet 与本地源地址绑定,可用于快速诊断域名解析链路、比对不同 DNS 提供商的响应及自动化脚本集成。 ## 功能亮点 - **多记录类型**:原生支持 `A / AAAA / NS / CNAME / MX / TXT`,默认使用 `A` 记录。 - **一键批量**:既可通过 CLI 位置参数解析单域名,也可借助 `-d/--domains` 同时解析多域名。 - **多次采样**:`-c/--Count` 控制解析重复次数,方便观察抖动与缓存效果。 - **自定义递归服务器**:`-s/--Server` 指定一组 DNS,若未指定则自动读取本机 DNS 配置 (`/etc/resolv.conf` 或 Windows 网络适配器)。 - **EDNS0 Client Subnet**:通过 `-e/--ecs` 模拟不同客户端来源,排查 CDN 命中策略。 - **源地址绑定**:`-b/--bind` 固定本地出口 IP 与端口,验证多网卡、多出口环境。 - **短输出模式**:`-r/--short` 仅展示核心记录,适合脚本消费;默认模式保留 RTT、权威信息等诊断细节。 - **版本信息**:`-v/--version` 输出短版本,`-V/--Version` 输出包含 Git/Go/构建时间的长版本信息。 ## 快速开始 ### 环境要求 - Go 1.22.5 及以上(见 [go.mod](./go.mod)) - Git(若需通过 `Makefile` 注入版本信息) ### 获取源码 ```bash git clone ana cd ana ``` ### 直接运行 ```bash # 解析 www.baidu.com 的 A 记录 go run . www.baidu.com ``` ### 构建可执行文件 ```bash # 生成 dist/ana(当前平台) make build # 交叉编译(示例) make linux # dist/ana-v0.5.4-Linux-amd64 make windows # dist/ana-v0.5.4-Windows-amd64.exe ``` > 所有构建命令都会通过 `version/version.go` 注入 `GIT_TAG/GIT_COMMIT/BUILD_TIME/GO_VERSION` 等信息,确保 `ana -V` 可输出完整版本快照。 ## 使用方法 ### 基本语法 ```bash ana [记录类型] domain ana [flags] domain ana [flags] --domains domain1 --domains domain2 [...] ``` - 当命令行位置参数中含有合法记录类型字符串(不区分大小写)时,会被视为查询类型。 - 如果省略记录类型,默认执行 A 记录解析。 ### 常用参数 | Flag | 默认值 | 说明 | | --- | --- | --- | | `-c, --Count` | `1` | 同一域名重复查询次数 | | `-s, --Server` | 自动读取本地 DNS | 设定一个或多个 DNS 服务器,可写 IP 或 `host:port` | | `-p, --port` | `53` | DNS 服务端口(针对纯 IP 服务器) | | `-e, --ecs` | 空 | EDNS0 Client Subnet,填写 IP 或 CIDR(示例:`1.2.3.0`) | | `-r, --short` | `false` | 短输出模式,仅打印解析结果 | | `-b, --bind` | 空 | 绑定本地源地址,格式 `address[#port]`,如 `192.168.1.2#5300` | | `-d, --domains` | 空列表 | 多域名解析,可多次传递 | | `-v/--version` | `false` | 输出短版本并退出 | | `-V/--Version` | `false` | 输出详细版本并退出 | ### 示例 ```bash # 解析单个域名 AAAA 记录 ana AAAA www.example.com # 使用指定 DNS 并重复 3 次 ana -s 223.5.5.5 -c 3 www.qq.com # 多域名批量解析(共用一次记录类型判断) ana -d example.com -d example.org TXT # 模拟来自 1.2.3.0/24 的请求 ana -e 1.2.3.0 www.cdn-test.com # 绑定本地出口 IP 与端口 ana -b 192.168.10.2#1053 www.internal.com # 仅输出结果,适合脚本 ana -r -s 8.8.8.8 www.google.com ``` ### 输出说明 - **完整模式**:打印每条 Answer 的原始文本、使用的 DNS 服务器、是否权威响应、一次解析耗时等信息;多次解析时按轮次分隔。 - **短模式**:仅打印 `Result` 列表(如 IP、CNAME 目标、TXT 文本)及耗时,适合管道处理。 - 当所有服务器均失败时,会给出 `no result` 或网络诊断提示(超时、网络不可达、DNS 不合法等)。 ## 目录导览 ``` . ├── cmd/root.go # CLI 参数与主流程入口 ├── worker/resolve.go # DNS 查询、EDNS0、输出逻辑 ├── worker/model.go # `DomainDNSRecord` 数据结构 ├── common/ # 系统 DNS、记录类型、网卡 IP 等工具 ├── version/version.go # 版本信息注入 ├── Makefile # 构建、测试、打包任务 └── main.go # 调用 cmd.Execute() ``` ## 开发与测试 ```bash make dep # go mod tidy make test # go test ./... make lint # golint(需预装 golang.org/x/lint) make vet # go vet ./... ``` - `common/linux_test.go`/`common/win_test.go` 提供了操作系统相关工具的单元测试样例,可按需扩展。 - 建议在提交前执行 `make test-coverage` 以生成 `coverage.txt`。 ## 典型扩展方向 虽然当前版本已覆盖常见诊断场景,但仍可按需扩展: - 新增其他记录类型(`SOA`、`SRV`、`CAA` 等)。 - 引入解析结果缓存、并发批量解析以提升性能。 - 提供 JSON/CSV 输出或 REST/gRPC API 以便集成第三方系统。 - 支持 DNS over HTTPS / DNS over TLS、DNSSEC 校验等安全特性。 ## 许可证 本项目遵循 [LICENSE](./LICENSE)。欢迎提交 Issue 与 PR 共同完善。