内容提要
本文介绍了DNS over HTTPS(DoH)服务的工作原理和使用Go语言开发的简易DoH服务,解决了传统DNS协议存在的安全和隐私问题。同时提到了公共DNS解析服务、DNS污染问题以及解决方法,包括使用海外服务器和EDNS Client Subnet(ECS)技术。最后,介绍了实现DoH代理和ECS功能的方法,并推荐了相关工具和项目。
延伸解读
DoH 代理的两种查询方式
文章指出 DoH 支持 GET 和 POST 两种查询方式,多数实现如 Firefox、Chrome 使用 POST,而 macOS 系统使用 GET。GET 方式将查询数据用 base64 编码后放在 dns 参数中,POST 则直接将原始查询数据放在请求体。实现代理时必须同时支持这两种方式,否则可能无法兼容所有客户端。
ECS 的隐私与精度平衡
ECS 技术通过将客户端 IP 脱敏为 /24(IPv4)或 /48(IPv6)网段来保护隐私,同时让解析服务器返回就近节点。文章解释,网段掩码越长,地理位置越精准,但信息泄漏也越多;反之则隐私更好但解析精度下降。这两个值分别是 IPv4 和 IPv6 能做 BGP 广播的最小单位,在隐私和精度间取得平衡。
Firefox 的 Content-Type 要求
文章提到,将自建 DoH 配置到 Firefox 时可能无法激活,通过抓包发现响应头缺少 Content-Type。必须将其设置为 application/dns-message 才能正常工作。这是一个容易被忽略的细节,但却是 Firefox 兼容性的关键。
EDNS Padding 与 ECS 的冲突
Firefox 的 DoH 请求中带有 EDNS(0) Padding Option,用于隐藏查询长度。文章发现,如果直接将 ECS 配置追加到 Extra 列表,会因 padding 长度限制导致问题。根据 RFC7830,填充后的 DNS 消息不能超过请求者载荷大小字段指定的字节数。最简单的解决方法是覆盖 Extra 字段,只保留 ECS 配置,但这可能丢失其他 EDNS 选项,需权衡。
Q&A
什么是DNS over HTTPS(DoH)?
DNS over HTTPS(DoH)是一种通过HTTPS加密链路传输DNS查询的协议,旨在提高DNS查询的安全性和隐私保护。
传统DNS协议存在哪些安全和隐私问题?
传统DNS协议使用明文传输,可能被中间节点监听或篡改查询结果,导致用户隐私泄露和安全风险。
如何解决DNS污染问题?
解决DNS污染问题的方法包括使用海外服务器和EDNS Client Subnet(ECS)技术,以确保返回无污染的解析结果。
如何使用Go语言实现DoH代理?
使用Go语言实现DoH代理需要提取客户端的查询请求,并将其转发给上游的DNS服务,如DNSPod或阿里云。
EDNS Client Subnet(ECS)技术的作用是什么?
ECS技术通过脱敏用户的IP地址,帮助DNS解析服务器返回最近的访问节点,从而保护用户隐私并提高访问速度。
如何验证ECS是否生效?
可以使用q工具,通过指定ECS参数来验证ECS的效果,例如使用命令`q --subnet 1.0.0.0/0 A taoshu.in @https://localhost:4430/dns/`。