大家好,我是羊刀仙。
本期为大家带来的是一款DNS小工具:doggo,可通过Docker进行部署。
doggo是一款用 Golang 编写的现代命令行 DNS 客户端(类似dig)。它以简洁明了的方式输出信息,并支持 DoH、DoT、DoQ 和 DNSCrypt 等协议。
doggo 在日常中主要用于以下几个方面:
快速 DNS 查询:查看域名的 IP 地址
DNS 服务器验证:检查不同 DNS 服务器的解析结果
性能测试:比较不同 DNS 服务器的响应速度
解析问题排查:调试 DNS 解析路径,解决访问问题
隐私保护:通过 DoH 进行加密查询。
项目特点
具有颜色编码和表格格式的人性化输出
JSON 输出支持,方便编写脚本和解析
多种传输协议:DoH、DoT、DoQ、TCP、UDP、DNSCrypt
支持ndots和search配置
支持多种解析器并可定制查询策略
IPv4 和 IPv6 支持
提供 Web 界面
壳完成zsh和fish
反向 DNS 查找
灵活的查询选项,包括各种 DNS 标志
故障排除调试模式
响应时间测量
跨平台支持
部署
分为NAS和服务器两部分,都需要通过SSH进入控制台部署。
NAS
Doggo 以 Docker 镜像的形式提供,托管在 GitHub Container Registry (ghcr.io) 上。它支持 x86 和 ARM 架构。
官方Web界面:https://doggo.mrkaran.dev/
官方使用文档:https://doggo.mrkaran.dev/docs/
首先是服务器
输入以下命令即可快速安装:
curl -sS https://raw.githubusercontent.com/mr-karan/doggo/main/install.sh | sh
安装完毕后,输入doggo并
回车,可以看到很多操作指令说明。
这里先大概解释下,具体例子放在后面演示部分。
传输选项:
使用 URL 类型的协议指定查询方式:
udp:默认使用的协议
tcp:使用 TCP 进行查询
https:使用 HTTPS 进行查询(DNS over HTTPS, DoH)
tls:使用 TLS 进行查询(DNS over TLS, DoT)查询选项:
-q, --query=HOSTNAME:指定要查询的主机名(如 mrkaran.dev)
-t, --type=TYPE:指定 DNS 记录类型(如 A, AAAA, MX 等)
-@, --nameserver=ADDR:指定 DNS 服务器地址
-c, --class=CLASS:指定 DNS 记录的类(如 IN, CH, HS 等)解析选项:
--strategy=STRATEGY:指定解析器列表中的策略(如 random, first)
--timeout=DURATION:指定等待解析器响应的超时时间(如 5s, 400ms, 1m)
--ipv4:强制使用 IPv4
--ipv6:强制使用 IPv6查询标志:
--ad:设置权威回答标志
--cd:禁用验证标志输出选项:
-J, --json:将输出格式化为 JSON
-S, --short:简化输出,仅显示响应部分
之后便可以输入类似于以下命令开始使用:
# 简单的 DNS 查询
doggo example.com
# 使用指定的名称服务器查询 MX 记录
doggo MX github.com @9.9.9.9
# 使用 DNS over HTTPS
doggo example.com @https://cloudflare-dns.com/dns-query
# 以 JSON 格式输出用于脚本处理
doggo example.com --json | jq '.responses[0].answers[].address'
# 反向 DNS 查询
doggo --reverse 8.8.8.8 --short
部署于NAS中
NAS中因系统原因,部署使用与服务器有些许差异,并不能持久化运行,直接输入doggo
命令进行操作,但也有解决办法。
登入NAS后输入以下命令:
docker pull ghcr.io/mr-karan/doggo:latest
按照官方文档,可通过输入以下命令返回结果:
docker run --rm ghcr.io/mr-karan/doggo:latest example.com
解释:
docker run --rm: 运行一个临时 Docker 容器。--rm 参数意味着在容器停止后,Docker 会自动删除容器,避免占用系统资源。
ghcr.io/mr-karan/doggo:latest: 这是从 GitHub Container Registry 拉取的 Doggo 镜像,latest 表示使用最新版本的 Doggo。
example.com: 这是你要查询的域名,Doggo 会对这个域名执行 DNS 查询,并返回结果。
执行这个命令后:
拉取镜像:如果你之前没有拉取过这个镜像,Docker 会从 GitHub Container Registry 下载最新的 Doggo 镜像。
DNS 查询:Doggo 将会对 example.com 进行默认的 DNS 查询(查询 A 记录),并将结果显示在终端中。
容器自动删除:查询完成后,容器会自动停止并删除。
我觉得这样十分麻烦,如果能像python一般,输入/bin/bash
就好了,但doggo并非活动容器。
我们可以通过输入以下命令解决:
docker run -it --entrypoint /bin/sh ghcr.io/mr-karan/doggo:latest
--entrypoint /bin/sh
--entrypoint:这个选项覆盖镜像的默认入口点(ENTRYPOINT),即容器启动时默认执行的命令。通常,Docker 镜像的创建者会在镜像的 Dockerfile 中指定一个默认的 ENTRYPOINT 或 CMD(命令),这个命令会在容器启动时自动运行。
/bin/sh:这是你希望容器运行时启动的命令,在这个情况下是一个 shell 程序(通常是一个轻量级的 shell)。这意味着,当你启动这个容器时,它会直接启动一个 shell,允许你在容器中输入命令,而不是执行镜像的默认命令。
使用
以我的博客站点为例。
基本 DNS 记录查询
doggo example.com
检查特定 DNS 服务器的解析
doggo example.com @8.8.8.8
doggo example.com @223.5.5.5
doggo example.com @114.114.114.114
查询 CNAME 记录
doggo example.com -t CNAME
测量DNS查询时间
doggo -q example.com --time @114.114.114.114
doggo -q example.com --time @223.5.5.5
doggo -q example.com --time @119.29.29.29
doggo -q example.com --time @1.1.1.1
doggo -q example.com --time @8.8.8.8
域名的授权 DNS 服务器是否配置正确
doggo example.com -t NS
网络中的特定类型
doggo -q example.com --ipv4
以JSON格式输出
doggo -q example.com --json
doggo -q example.com --short # 只输出结果
不信任环境下通过 HTTPS 进行加密查询
doggo -q example.com @https://cloudflare-dns.com/dns-query
# 使用 DoH 可以增强 DNS 查询的安全性,尤其是在不信任的网络环境中,通过 HTTPS 加密 DNS 查询可以防止中间人攻击和 DNS 劫持。
最后
Doggo 适合那些需要现代化、灵活性高、且易于集成的 DNS 查询工具的用户。如果你希望使用命令行工具在隐私性和安全性上更进一步,特别是在 DoH 方面,Doggo 是一个很好的选择。然而,对于需要深入调试和复杂查询的场景,dig 仍然是不可或缺的工具。结合使用这两者,可以满足绝大多数 DNS 查询和调试的需求。
本文完。
评论区