简单快速的 DNS 代理,具备并不简单的功能。专注于路由 DNS 转发、过滤和家长控制。
一个让你真正掌控家庭网络的 DNS 代理。
我曾在“大厂”网络与安全“竞技场”做过多年顾问。DNS 安全过去是、现在也是我的日常工作,同时也是我最喜欢折腾的爱好之一。因为我现在有了孩子,需要做一个负责任的家长,我便主动承担起为他们过滤这个险恶互联网的责任。于是我构建了 sdproxy(Simple DNS Proxy,简单 DNS 代理)。它(某种程度上)把企业级/大厂级的防护、方法和精度带到了家庭网络层面。
该代理使用 Go 编写,可编译为精简的二进制文件,适用于廉价路由器。没有云订阅,也没有月费。它支持各种 DNS 形式,并内置自适应准入控制以保持稳定。它就是为客厅打造的、精简(某种程度上)、强悍、荷兰式工程精度。只有你、一个可执行文件和一个 yaml 文件。
并且请记住……问题永远出在 DNS 上!
注意: full_reference_config.yaml 始终比本 README 更新。如有疑问,请查阅该文件。
DNS 是互联网的电话簿——你网络上的每台设备在连接任何地方之前,都会先查询一个名称。
sdproxy 就位于这中间,运行在你的路由器上,让你决定接下来发生什么:缓存它、拦截它、将其路由到其他解析器、应用高级 ML 安全模型,或对每个孩子强制执行时间限制。没有云订阅,没有月费,也没有会宕机的外部服务。
它使用 Go 编写,可编译为单个二进制文件,并且足够精简,可以运行在廉价家用路由器上(TP-Link、GL.iNet 或 NetGear 上的 OpenWrt,pfSense、OPNsense,或者一台普通 Linux 主机)。
与替代方案相比的关键优势见此处。
传统的 UDP/TCP(53 端口)、加密的 DNS-over-TLS(DoT)、DNS-over-HTTPS(DoH)以及 DNS-over-QUIC(DoQ)。
sdproxy 原生解析 Alt-Svc 头,并即时将标准 DoH 流无缝升级为高性能 HTTP/3(QUIC)连接。通过加密 TLS 服务器名称指示(SNI),保护你的浏览免受 ISP 深度包检测。
HTTPS/SVCB 记录,提取其 ECH 密钥,并完全自主地保护 TLS 握手。一个原生、零分配的 Logistic Regression ML 推理引擎运行在热路径上。它提取 Shannon 熵、元音/辅音偏斜以及 n-gram 链,以即时检测并拦截僵尸网络、恶意软件和 C2 基础设施使用的算法生成域名(DGA)。
体积基线分析会跟踪每个客户端或每个子网传输数据的 Alpha 平滑指数移动平均(EMA)。它会检测通过 53 端口离开网络的突发异常数据流,并将该客户端在高性能惩罚箱中黑洞化。
sdproxy 不会盲目转发查询;它会动态评估上游。
最近回答过某个查询?直接从缓存提供。sdproxy 使用 32 个加密种子、无锁的内存分片。如果某条记录在仍然热门时过期,sdproxy 会触发后台预取,让你的设备永远不会察觉到缓存未命中。它完全支持 RFC 8767 陈旧数据服务。
将它指向你的 DHCP 租约文件和 /etc/hosts,它就能在不打扰上游解析器的情况下回答本地名称查询(你的 NAS、打印机、树莓派)。支持 dnsmasq、ISC DHCP、Kea 和 odhcpd。
将设备身份映射到不同的上游解析器组或家长配置文件。
RCODE: REFUSED、NXDOMAIN)直接绑定到路由规则,以即时隔离客户端。为每个孩子设置一个配置文件,分配他们的设备,并配置:
可选的、受密码保护的基于浏览器的 UI,用于实时操作。
丢弃任何包含私有或 bogon IP(RFC1918、环回、ULA)的上游响应,并返回 NXDOMAIN,以防止服务器端请求伪造(SSRF)和浏览器枢转攻击。
git clone https://github.com/cbuijs/sdproxy
cd sdproxy
go build -o sdproxy .
./sdproxy --config config.yaml
需要 Go 1.25+。无 CGo,无外部库。
server:
listen_udp: ["0.0.0.0:53"]
cache:
enabled: true
size: 1024
upstreams:
default:
- "udp://1.1.1.1:53"
- "udp://9.9.9.9:53"
# OpenWrt MIPS (TP-Link, Netgear, etc.)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -ldflags="-s -w" -o sdproxy .
# OpenWrt ARM (Linksys, Asus, etc.)
GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="-s -w" -o sdproxy .
# OpenWrt x86_64
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o sdproxy .
-s -w 标志会剥离调试符号——可节省 30-40% 的二进制大小,这在小型闪存存储上很重要。
一切都放在一个 YAML 文件中。本仓库中的 full_reference_config.yaml 以内联方式记录了每一个选项——该文件就是手册。复制它,去掉你不需要的内容,调整其余部分。
2026/05/01 14:23:01 [DNS] [DoH3+ECH] 192.168.1.42 (alice-iphone) -> google.com A | ROUTE: kids | UPSTREAM: doh3://cloudflare-dns.com | OK
2026/05/01 14:23:02 [DNS] [UDP] 192.168.1.42 (alice-iphone) -> google.com A | ROUTE: kids | CACHE HIT
2026/05/01 14:23:05 [DNS] [DoQ] 192.168.1.10 -> nas.lan A | LOCAL IDENTITY
2026/05/01 14:23:10 [DNS] [UDP] 192.168.1.42 (alice-iphone) -> dga-domain-xzq1.com A | DGA INTERCEPT (Score: 98.2) | NXDOMAIN