DNS Relay 是一个使用 C 实现的轻量级本地 DNS 中继。它优先按 hosts 规则在本地回答或拦截查询;未命中时转发给指定的上游 DNS,并缓存可复用的响应。项目支持 Windows 和 macOS。
![]() Liophis |
![]() TeaSings |
![]() Gjt20051218 |
- 监听本机 UDP 53 端口,解析并校验 DNS 查询。
- 从 hosts 文件提供 IPv4
A和 IPv6AAAA本地应答,本地记录 TTL 为 300 秒。 - 将
0.0.0.0和 IPv6 全零地址配置为拦截规则,命中后返回NXDOMAIN。 - 域名匹配不区分大小写;同一域名可同时保存 A、AAAA 记录,后出现的同类型记录覆盖旧记录。
- 将本地未命中的查询转发至上游 DNS,并通过独立 ID 映射把响应准确返回原客户端。
- 自动清理超时的在途请求,转发失败时立即释放对应 ID。
- 缓存带 Answer 的上游响应;按最小 TTL 过期,命中时更新剩余 TTL,并使用 LRU 控制缓存容量。
- 提供错误、信息、调试三级彩色日志和启动信息。
- 支持
Ctrl+C、SIGINT和SIGTERM下的正常退出与资源清理。 - 提供 hosts/DNS 报文自动测试,以及 ID 映射、缓存和 hosts 哈希性能评测。
每行格式为 <IP> <域名>:
192.0.2.10 example.test
2001:db8::10 ipv6.example.test
0.0.0.0 ads.example.test
:: tracker.example.test
普通地址生成本地 A/AAAA 应答,全零地址返回 NXDOMAIN。空行、注释行和无效记录会被忽略。
绑定 UDP 53 端口通常需要管理员或 root 权限。
使用 MinGW:
mingw32-make
.\dnsrelay.exe -dd 8.8.8.8 dnsrelay.txt使用 Visual Studio Developer Command Prompt 和 GNU Make:
make CC=cl
dnsrelay.exe -dd 8.8.8.8 dnsrelay.txtmake
sudo ./dnsrelay -dd 8.8.8.8 dnsrelay.txt命令格式:
dnsrelay [-d|-dd] [上游 DNS IPv4 地址] [hosts 文件]
默认上游 DNS 为 202.106.0.20,默认 hosts 文件为 dnsrelay.txt。无调试参数时只输出错误;-d 输出运行信息;-dd 输出完整调试信息。
# macOS
make test
make bench
# Windows MinGW
mingw32-make test
mingw32-make benchtest 覆盖 hosts 加载查询和 DNS 报文解析/构造;bench 运行 ID 映射、缓存和 hosts 哈希性能评测。需要监听 53 端口的完整联调步骤见 tests/manual_commands.md。


