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 --> Secure

dog 协议支持

3. 输出格式

  • 默认彩色输出:易于阅读,自动高亮重要信息
  • 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 dog

3. 创建别名

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 --> 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 官方网站
  2. dog GitHub 仓库
最后修改:2026 年 01 月 17 日
如果觉得我的文章对你有用,请随意赞赏