Loading... # 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. 协议支持 ```mermaid 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 --> Secure ```  ## 3. 输出格式 - 默认彩色输出:易于阅读,自动高亮重要信息 - JSON 输出:便于脚本处理和与其他工具集成 - 短格式:仅显示第一个结果 # 三、安装方式 ## 1. 包管理器安装 根据不同平台,可通过以下方式安装: - Arch Linux:dog 包 - macOS Homebrew:dog formula - NixOS:dogdns 包 ## 2. 预编译二进制 从 GitHub Releases 页面下载适用于 Windows、macOS 和 Linux 的预编译二进制文件。 ## 3. 从源码编译 ```mermaid 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 编译命令: ```bash cargo build cargo test ``` 发布版本编译: ```bash 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 ```bash cargo build --no-default-features --features=with_idna ``` 可通过 --version 参数查看已禁用的功能列表。 # 五、命令行参数 ## 1. 查询选项 - <arguments>:人类可读的主机名、名称服务器、类型或类 - -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. 基本查询 ```bash dog example.net ``` 使用默认设置查询域名。 ## 2. 查询特定记录类型 ```bash dog example.net MX ``` 查询 MX(邮件交换)记录。 ## 3. 指定 DNS 服务器 ```bash dog example.net MX @1.1.1.1 ``` 使用指定的 DNS 服务器(如 Cloudflare 的 1.1.1.1)进行查询。 ## 4. 使用 TCP 协议 ```bash dog example.net MX @1.1.1.1 -T ``` 使用 TCP 而非 UDP 进行查询。 ## 5. 使用显式参数 ```bash dog -q example.net -t MX -n 1.1.1.1 -T ``` 使用显式参数进行与上述相同的查询。 ## 6. DNS-over-TLS 查询 ```bash dog example.com -S @1.1.1.1 ``` 通过 TLS 加密通道查询 DNS。 ## 7. DNS-over-HTTPS 查询 ```bash dog example.com -H @1.1.1.1 ``` 通过 HTTPS 加密通道查询 DNS。 ## 8. JSON 输出 ```bash dog example.net -J ``` 以 JSON 格式输出结果,便于脚本处理。 # 七、容器化部署 ## 1. 构建镜像 ```bash docker build -t dog . ``` ## 2. 运行容器 ```bash docker run -it --rm dog ``` ## 3. 创建别名 ```bash 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. 架构设计 ```mermaid 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 --> Network ```  ## 2. 模块组成 - 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 协议的好工具。 *** ## 参考资料 1. [dog 官方网站](https://dns.lookup.dog/) 2. [dog GitHub 仓库](https://github.com/ogham/dog) 最后修改:2026 年 01 月 17 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏