dog 命令行 DNS 客户端技术分析
一、概述
1. 简介
A. 是什么
dog 是一个用 Rust 编写的命令行 DNS 客户端工具,类似于传统的 dig 工具,但提供了更现代的用户体验和更强大的功能。
B. 为什么值得关注
- 彩色输出让 DNS 查询结果更易读
- 支持标准的命令行参数语法,学习曲线更平缓
- 支持 DNS-over-TLS 和 DNS-over-HTTPS 加密查询协议
- 可以输出 JSON 格式,便于与其他工具集成
- 使用 Rust 编写,性能优异且内存安全
C. 能做什么
- 查询各类 DNS 记录(A、MX、NS、TXT 等)
- 指定自定义 DNS 服务器进行查询
- 通过 UDP、TCP、TLS 或 HTTPS 协议进行查询
- 以彩色或 JSON 格式输出结果
- 测量 DNS 响应时间
二、核心特性
1. 基本功能
dog 提供了完整的 DNS 查询功能,支持所有常见的记录类型和网络类。
2. 协议支持
graph LR
subgraph 传统协议
UDP[UDP]
TCP[TCP]
end
subgraph 加密协议
DoT[DNS-over-TLS]
DoH[DNS-over-HTTPS]
end
Client[dog客户端] --> UDP
Client --> TCP
Client --> DoT
Client --> DoH
UDP --> Server[DNS服务器]
TCP --> Server
DoT --> Secure[安全DNS解析]
DoH --> Secure3. 输出格式
- 默认彩色输出:易于阅读,自动高亮重要信息
- JSON 输出:便于脚本处理和与其他工具集成
- 短格式:仅显示第一个结果
三、安装方式
1. 包管理器安装
根据不同平台,可通过以下方式安装:
- Arch Linux:dog 包
- macOS Homebrew:dog formula
- NixOS:dogdns 包
2. 预编译二进制
从 GitHub Releases 页面下载适用于 Windows、macOS 和 Linux 的预编译二进制文件。
3. 从源码编译
graph TD
A[获取源码] --> B{选择编译选项}
B -->|完整功能| C[cargo build]
B -->|最小体积| D[cargo build --no-default-features]
C --> E[编译完成]
D --> E
E --> F[复制到 PATH]前置要求:
- Rust 编译器 1.45.0 或更高版本
- 推荐使用 rustup 安装 Rust
编译命令:
cargo build
cargo test发布版本编译:
cargo build --release
# 或使用 just
just build-release编译后的二进制文件位于 target/release 目录,建议复制到 /usr/local/bin 等 PATH 目录。
四、功能特性开关
dog 提供三个 Cargo 功能开关,默认全部启用:
1. with_idna
启用国际化域名支持,允许查询非 ASCII 字符的域名。
2. with_tls
启用 DNS-over-TLS 支持,通过 TLS 加密 DNS 查询。
3. with_https
启用 DNS-over-HTTPS 支持,通过 HTTPS 加密 DNS 查询(依赖 with_tls)。
示例:仅保留 IDNA 支持,禁用 TLS 和 HTTPS
cargo build --no-default-features --features=with_idna可通过 --version 参数查看已禁用的功能列表。
五、命令行参数
1. 查询选项
:人类可读的主机名、名称服务器、类型或类 - -q, --query=HOST:要查询的主机名或域名
- -t, --type=TYPE:DNS 记录类型(A、MX、NS 等)
- -n, --nameserver=ADDR:发送数据包的名称服务器地址
- --class=CLASS:DNS 记录的网络类(IN、CH、HS)
2. 发送选项
- --edns=SETTING:是否选择使用 EDNS(disable、hide、show)
- --txid=NUMBER:将事务 ID 设置为特定值
- -Z=TWEAKS:设置不常见的协议级调整
3. 协议选项
- -U, --udp:使用 UDP 上的 DNS 协议
- -T, --tcp:使用 TCP 上的 DNS 协议
- -S, --tls:使用 DNS-over-TLS 协议
- -H, --https:使用 DNS-over-HTTPS 协议
4. 输出选项
- -1, --short:短模式,仅显示第一个结果
- -J, --json:以 JSON 格式显示输出
- --color, --colour=WHEN:何时为输出着色(always、automatic、never)
- --seconds:不格式化持续时间,以秒显示
- --time:打印响应到达所需时间
六、使用示例
1. 基本查询
dog example.net使用默认设置查询域名。
2. 查询特定记录类型
dog example.net MX查询 MX(邮件交换)记录。
3. 指定 DNS 服务器
dog example.net MX @1.1.1.1使用指定的 DNS 服务器(如 Cloudflare 的 1.1.1.1)进行查询。
4. 使用 TCP 协议
dog example.net MX @1.1.1.1 -T使用 TCP 而非 UDP 进行查询。
5. 使用显式参数
dog -q example.net -t MX -n 1.1.1.1 -T使用显式参数进行与上述相同的查询。
6. DNS-over-TLS 查询
dog example.com -S @1.1.1.1通过 TLS 加密通道查询 DNS。
7. DNS-over-HTTPS 查询
dog example.com -H @1.1.1.1通过 HTTPS 加密通道查询 DNS。
8. JSON 输出
dog example.net -J以 JSON 格式输出结果,便于脚本处理。
七、容器化部署
1. 构建镜像
docker build -t dog .2. 运行容器
docker run -it --rm dog3. 创建别名
alias dog="docker run -it --rm dog"创建别名后可直接使用 dog 命令。
八、项目信息
1. 开发语言
- Rust 96.7%
- Shell 1.9%
- PowerShell 1.3%
- Dockerfile 0.1%
2. 项目统计
- GitHub Stars:6.6k
- Forks:205
- Contributors:17
- License:European Union Public Licence (EUPL-1.2)
3. 相关工具
- just:命令运行器,用于开发任务管理
- Specsheet:用于端到端集成测试
九、技术分析
1. 架构设计
graph TB
subgraph CLI层
Args[参数解析]
end
subgraph DNS核心
DNS库[dns库]
Transport[dns-transport]
end
subgraph 协议层
UDP[UDP实现]
TCP[TCP实现]
TLS[TLS实现]
HTTPS[HTTPS实现]
end
Args --> DNS库
DNS库 --> Transport
Transport --> UDP
Transport --> TCP
Transport --> TLS
Transport --> HTTPS
UDP --> Network[网络层]
TCP --> Network
TLS --> Network
HTTPS --> Network2. 模块组成
- dns:核心 DNS 协议实现
- dns-transport:可插拔的 DNS 传输层,支持不同 TLS 实现
- completions:Shell 自动补全脚本
- xtests:端到端集成测试
3. 设计优势
- 模块化架构:传输层与核心逻辑分离
- 功能可配置:通过 Cargo features 按需编译
- 跨平台支持:Windows、macOS、Linux 全覆盖
- 完善的测试:集成测试覆盖真实 DNS 查询
十、应用场景
1. DNS 故障排查
彩色输出让问题一目了然,响应时间测量帮助定位性能瓶颈。
2. 安全 DNS 查询
支持 DoT 和 DoH,防止 DNS 查询被窃听或篡改。
3. 自动化脚本
JSON 输出便于与其他工具集成,适合自动化运维场景。
4. 学习和教学
清晰的输出和标准的命令行参数,是学习 DNS 协议的好工具。