rdig

Crates.iordig
lib.rsrdig
version0.1.0
created_at2025-12-31 07:42:37.428142+00
updated_at2025-12-31 07:42:37.428142+00
descriptionget dns over https via dns.google
homepage
repository
max_upload_size
id2014196
size67,924
dilfish (dilfish)

documentation

README

rdig - DNS Query Tool using dns.google

一个类似 dig 的 DNS 查询工具,支持 dns.google 的两种请求方式:JSON 格式和 RFC 标准格式。

功能特性

  • JSON 格式请求 - 通过 https://dns.google/resolve 端点
  • RFC 标准格式请求 - 通过 https://dns.google/dns-query 端点(DNS wireformat)
  • 类似 dig 的输出格式 - 熟悉的 DNS 查询结果显示
  • 支持多种 DNS 记录类型 - A, AAAA, MX, NS, TXT, CNAME, SOA 等
  • DNSSEC 支持 - 可选的 DNSSEC 验证

安装和编译

cd /Users/dilfish/rs/rdig
cargo build --release

编译完成后,可执行文件位于 ./target/release/rdig

使用方法

基本用法

# 查询 A 记录(默认)
./target/release/rdig google.com

# 查询特定记录类型
./target/release/rdig google.com -r MX
./target/release/rdig google.com -r NS
./target/release/rdig github.com -r AAAA

命令行选项

Usage: rdig [OPTIONS] <DOMAIN>

Arguments:
  <DOMAIN>  要查询的域名

Options:
  -r, --record-type <RECORD_TYPE>   DNS 记录类型 (A, AAAA, MX, NS, TXT, CNAME, SOA 等)
                                     [default: A]
  
  -f, --format <FORMAT>              查询格式
                                     - json: JSON 格式响应(默认)
                                     - rfc:  RFC 标准格式(DNS wireformat)
                                     [default: json]
  
  -d, --dnssec                       启用 DNSSEC 验证
  
  -r, --recursive                    启用递归搜索 [default: true]
  
  -h, --help                         显示帮助信息

使用示例

查询 A 记录(JSON 格式)

$ ./target/release/rdig google.com
; <<>> rdig google.com
; (json format)

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 0
;; flags: qr ra rd; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com.		IN	A

;; ANSWER SECTION:
google.com.	37	IN	A	172.253.118.138
google.com.	37	IN	A	172.253.118.100
google.com.	37	IN	A	172.253.118.102
google.com.	37	IN	A	172.253.118.139
google.com.	37	IN	A	172.253.118.101
google.com.	37	IN	A	172.253.118.113

;; Query time: 0 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Dec 31 14:33:04 +08:00 2025
;; MSG SIZE  rcvd: 0

查询 MX 记录

$ ./target/release/rdig google.com -r MX
; <<>> rdig google.com
; (json format)

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 0
;; flags: qr ra rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com.		IN	MX

;; ANSWER SECTION:
google.com.	300	IN	MX	10 smtp.google.com.

;; Query time: 0 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Dec 31 14:33:22 +08:00 2025
;; MSG SIZE  rcvd: 0

使用 RFC 格式查询

$ ./target/release/rdig google.com -f rfc
; <<>> rdig google.com
; (rfc wireformat)

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 0
;; flags: qr ra rd; QUERY: 0, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; Query time: 0 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Dec 31 14:33:13 +08:00 2025
;; MSG SIZE  rcvd: 0

依赖项

  • reqwest - 异步 HTTP 客户端
  • tokio - 异步运行时
  • serde & serde_json - JSON 序列化/反序列化
  • clap - 命令行参数解析
  • anyhow - 错误处理
  • chrono - 时间处理

项目结构

rdig/
├── Cargo.toml      # 项目配置和依赖
├── Cargo.lock      # 依赖锁定文件
├── src/
│   └── main.rs     # 主程序源码
└── target/         # 编译输出目录

技术细节

JSON 格式请求

  • 使用 https://dns.google/resolve 端点
  • 发送 GET 请求,在 URL 参数中指定域名和记录类型
  • 响应是 JSON 格式,包含完整的 DNS 响应信息

RFC 标准格式请求

  • 使用 https://dns.google/dns-query 端点
  • 构建 RFC 1035 标准格式的 DNS 查询包
  • 发送 POST 请求,Content-Type 为 application/dns-message
  • 响应是二进制 DNS wireformat

未来改进

  • 完整的 RFC wireformat 响应解析
  • 显示更详细的 Authority 和 Additional 信息
  • 支持查询统计信息
  • 支持更多的 DNS 扩展功能
  • 输出格式自定义选项

许可证

MIT

Commit count: 0

cargo fmt