运营商在偷看你的 DNS?VPS 自建 DoH/DoT 加密解析
2026-08-15 · DevCraft Studio
用 CoreDNS/Unbound 在 VPS 上开 DoT(853) 与 DoH(443),路由器/手机指向它防劫持防偷看,讲清和 Cloudflare/Warp 的区别与性能开销。
延伸阅读
更多相关攻略推荐:刚买的 VPS 怎么连上去?SSH 新手教程(Windows / M、VPS 的带宽、流量、端口到底是啥?1Gbps 和 10TB 流量怎、【VPS vs 云 01】VPS 和云服务器是一回事吗?和阿里云/腾、独立服务器、VPS、虚拟主机,三者到底有什么区别?一张表讲清、2026 开发者最值得买的便宜 VPS 清单(附选购思路)。
为什么你的 DNS 正在"裸奔"
我们每天上网要解析成百上千个域名,但绝大多数人的 DNS 查询走的还是最原始的明文 UDP 53 端口。这意味着从你手机、电脑发出去的每一次"我要访问 example.com"这种请求,在网络链路上都是明码传输的:你小区的路由器、运营商的骨干设备、甚至是咖啡馆的免费 WiFi,都能清清楚楚看到你在上什么网站、用什么 App。
更恶心的是,明文 DNS 不仅会被"看",还会被"改"。不少运营商会把你输错的域名、或者某些被封锁的域名,悄悄劫持到一个带满广告的导航页;有些地区的 DNS 还会被投毒,返回错误的 IP 让你掉进钓鱼网站。这种事在 2026 年依然每天都在发生。
所以"加密 DNS"要解决的就是两件事:防偷看和防篡改。把 DNS 查询装进 TLS 加密隧道里,链路上的任何中间人既看不到域名,也没法伪造回答。把加密 DNS 服务器架在自己的 VPS 上,又比直接用公共解析器多了"自主可控"这一层好处,后面会细说。
DoT 与 DoH 到底差在哪
加密 DNS 主流有两套标准。一套叫 DNS over TLS(DoT),定义在 RFC 7858,跑在专用的 853 端口,整个连接就是一条 TLS 加密的 DNS 专用通道。另一套叫 DNS over HTTPS(DoH),定义在 RFC 8484,跑在常见的 443 端口,把 DNS 查询伪装成一个普通的 HTTPS 请求。
- 端口不同:DoT 用 853,DoH 用 443(也就是网站 HTTPS 的端口)。
- 可识别度不同:DoT 的 853 端口一抓一个准,校园网、公司防火墙想封它很容易;DoH 混在正常的网页流量里,单看网管很难分辨哪些是看网页、哪些是查域名,因此更难被一刀切地封掉。
- 适用场景不同:想在自家路由器和 VPS 之间建一条"专用加密专线",DoT 简单直接;想在最严的网络环境(比如某些只能出 443 的办公网)里也能用,DoH 更稳。
值得一提的是,2026 年 DNS 隐私还在继续演进:TLS 的 加密客户端 Hello(ECH,RFC 9849)正式成为标准,让 HTTPS 连的域名也藏得更深;Quad9 等公共解析器也开始支持 DNS over HTTP/3 和 DNS over QUIC。但对个人自建来说,DoT 加 DoH 双开依然是最实用、兼容性最好的组合。
整体架构:你的 VPS 当加密 DNS 网关
很多人以为"自建 DNS"就是自己从头递归解析全世界的域名,那确实太重了。我们推荐的是转发型加密网关:你的 VPS 上跑一个 CoreDNS 或 Unbound,它负责两件事——对外的客户端(你家路由器、手机)提供加密的 DoT/DoH 入口;对内它把查询再加密地转发给上游公共解析器(比如 Quad9 的 9.9.9.9、Cloudflare 的 1.1.1.1),上游那一段也走 TLS,做到"端到端加密"。
这样你获得三层保障:第一,你和 VPS 之间的查询是密文,运营商看不到了;第二,VPS 到上游也是密文,连 VPS 所在机房也看不到明文;第三,由于 DNS 是你在管,你可以加广告屏蔽规则、自定义分流、还能顺手开 DNSSEC 校验,防止解析结果被伪造。
性能上完全不用担心:一个 DNS 网关在闲时只占十几 MB 内存,一台最便宜的年付 VPS 都跑得动,下文会给你具体的开销数据。
准备工作:一台便宜 VPS + 一张证书
硬件门槛极低。DoT/DoH 网关是轻量级服务,512MB 内存的机器都能跑。考虑到你要长期挂着,建议选年付、线路稳、到国内延迟低的机房。2026 年几款性价比之选:
- RackNerd:洛杉矶等多机房,年付低至 21.99 美元(1 核 1G/20G SSD/3T 流量),支持支付宝,是老牌便宜货。
- CloudCone:洛杉矶机房,入门套餐年付 10 美元出头(2 核 1G/20G/3T),按量计费、关机只收硬盘钱。
- Bandwagon(搬瓦工):CN2 GIA 优化线,到国内延迟低,适合对延迟敏感的同学。
- DMIT:三网优化,带宽足,预算稍高但体验好。
证书方面,DoT/DoH 都需要 TLS 证书,直接用免费的 Let's Encrypt 就行。建议用一个域名(比如 dns.yourdomain.com)解析到 VPS 的 IP,然后用 acme.sh 或 certbot 申请证书。下文配置里的证书路径就指到这里。
系统建议选 Ubuntu 22.04/24.04 或 Debian 12,下面两套方案都基于它。
方案 A:CoreDNS 同时开 DoT(853) 和 DoH(443)
CoreDNS 是用 Go 写的、CNCF 毕业级项目,插件化、配置简单,一个 Corefile 就能同时监听明文 53、加密 853 和 HTTPS 443。到 2026 年稳定版是 1.14.x。下面用 Docker 跑最省心。
先准备目录和证书(假设证书已在 /etc/coredns/ssl/ 下,含 fullchain.pem 和 privkey.pem),再写 Corefile:
.:53 {
forward . tls://9.9.9.9 tls://149.112.112.112 {
tls_servername dns.quad9.net
health_check 5s
}
cache 30
log
errors
}
tls://.:853 {
tls /etc/coredns/ssl/fullchain.pem /etc/coredns/ssl/privkey.pem
forward . tls://9.9.9.9 tls://149.112.112.112 {
tls_servername dns.quad9.net
health_check 5s
}
cache 30
log
errors
}
https://.:443 {
tls /etc/coredns/ssl/fullchain.pem /etc/coredns/ssl/privkey.pem
forward . tls://9.9.9.9 tls://149.112.112.112 {
tls_servername dns.quad9.net
health_check 5s
}
cache 30
log
errors
}
三块分别开了明文(给本机调试)、DoT(853)和 DoH(443,端点 /dns-query)。forward 插件把查询以 DoT 转给 Quad9,tls_servername 用来校验证书域名,cache 做缓存。如果只想对外提供加密服务,把第一块 .:53 删掉即可,避免明文端口暴露。
用 docker-compose 起服务:
services:
coredns:
image: coredns/coredns:1.14.6
container_name: coredns
restart: unless-stopped
ports:
- "53:53/udp"
- "53:53/tcp"
- "853:853/tcp"
- "443:443/tcp"
volumes:
- ./Corefile:/etc/coredns/Corefile:ro
- ./ssl:/etc/coredns/ssl:ro
cap_add:
- NET_BIND_SERVICE
启动后,用 dig 测一下 DoT:
docker run --rm pbraun/static-dig dig +tls example.com @dns.yourdomain.com
能返回 IP 就说明 853 通了;DoH 可以用 curl 验证:
curl -H 'accept: application/dns-json' 'https://dns.yourdomain.com/dns-query?name=example.com&type=A'
方案 B:Unbound 做递归 + DoT,再叠加 DoH
如果你更想要一台真正递归解析的服务器(不依赖转发、自己从根服务器查起),Unbound 是 NLnet Labs 出品的老牌选择,默认开启 DNSSEC 校验,原生支持 DoT。它内存占用极低,闲时约 15MB,是家庭网关的常青树。
先装好:
apt update
apt install -y unbound
写 /etc/unbound/unbound.conf,开 DoT 监听 853,并让上游也走 TLS:
server:
interface: 0.0.0.0@853
interface: 127.0.0.1@53
tls-service-pem: "/etc/letsencrypt/live/dns.yourdomain.com/fullchain.pem"
tls-service-key: "/etc/letsencrypt/live/dns.yourdomain.com/privkey.pem"
tls-port: 853
do-ip4: yes
do-udp: yes
do-tcp: yes
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.1/8 allow
private-address: 192.168.0.0/16
forward-zone:
name: "."
forward-tls-upstream: yes
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 1.1.1.1@853#cloudflare-dns.com
这里 forward-tls-upstream: yes 加 @853#域名 的组合,就是让 Unbound 用 DoT 把查询发给上游;access-control 限制了只有本机明文可用,外部只接受加密的 853,避免被当成开放解析器被别人拿来放大攻击。
Unbound 原生 DoH 相对麻烦些,生产上常用 nginx 反代把 443 的 /dns-query 转到本机,或直接用 CoreDNS 补一个 DoH 端点。如果你要一台机器双协议,最省事的就是"Unbound 管递归 + CoreDNS 只开 DoH 指回 Unbound",两者各司其职。
把全家设备指过去:路由器 / 手机 / 电脑
网关搭好,关键一步是让设备真的走它。逐层说:
- 家庭路由器(OpenWrt):在 网络 → DHCP/DNS → 高级设置 里,把 DNS 转发填成你 VPS 的 DoT 地址(如 dns.yourdomain.com#853),并勾选"通过 TLS 转发"。这样全屋设备自动加密解析。
- 安卓手机:Android 9 以上原生支持"私人 DNS",设置 → 网络和互联网 → 私人 DNS,填 dns.yourdomain.com(主机名模式即走 DoT)。也可装 Intra 这类 App 用 DoH。
- iPhone/iPad:iOS 14+ 同样支持私人 DNS(DoT),在 设置 → Wi-Fi → 某网络 → 配置 DNS → 手动,添加你的主机名;或用描述文件开启。
- Windows / macOS:系统层面没有一键 DoT,最稳的是装一个本地 stub(比如用上面 CoreDNS 跑在笔记本上指向 VPS),或直接在网络适配器里把 DNS 服务器填 VPS 的 IP(此时走明文到 VPS,VPS 再加密上行,链路仍安全)。想全程 DoH 可用 YogaDNS、dnscrypt-proxy 等工具。
一个小经验:路由器层统一切到 DoT 是最省事的,手机电脑什么都不用改;只有在外用蜂窝网络时,才需要各自开私人 DNS。
和 Cloudflare 1.1.1.1 / WARP 比,差在哪
很多人会问:我直接用 Cloudflare 的 1.1.1.1 不行吗,折腾 VPS 图啥?这两件事定位不同。
Cloudflare 1.1.1.1 是公共解析器。它本来就把 DoH(443)和 DoT(853)都开放给所有人用,查询被加密,运营商看不到。但代价是:你的查询记录落在 Cloudflare 手里(虽然它承诺不卖数据),你没法加自定义规则,也没法做家庭级的分流和广告屏蔽。
Cloudflare WARP 是全局隧道。WARP 把你的整个设备的流量都通过 WireGuard 隧道送到 Cloudflare 边缘,DNS 只是其中一小部分。它解决的是"整条链路都被窥探"的问题,但仍依赖 Cloudflare 这个第三方,而且全局翻隧道会带来明显的延迟和某些服务的区域限制。
自建 VPS 网关的核心是"控制权"。解析日志只在你自己的机器上;你可以轻松挂 AdGuard 风格的屏蔽列表拦广告和跟踪器;可以按域名把某些站点走特定上游;机器就在你名下,没人能偷偷改你的解析结果。代价是你要自己维护证书续期、关注安全和延迟。简单说:想要"省心+强加密"用 Cloudflare;想要"可控+隐私最大化"来自建。
性能开销到底有多大(2026 实测数据)
加密最大的顾虑是"会不会变慢"。结论先放前面:日常体感几乎无感,缓存命中后和明文没区别。
- 握手开销:TLS 握手首次大约多花 10–30ms,之后靠连接复用(HTTP/2 多路复用、TLS session 恢复)几乎摊到零。DNS 查询本身通常 5–15ms,加密增加的占比很小。
- 缓存收益:热门域名基本都命中本地缓存,缓存查询小于 1ms;CoreDNS/Unbound 的缓存查询每秒能到几万次,瓶颈从来不是软件而是你的网络延迟。
- 资源占用:2026 年的实测里,Unbound 闲时内存约 15MB、满载约 30MB;CoreDNS 闲时约 20MB、满载约 50MB;CPU 基本占用可忽略。一台 512MB 的 VPS 完全够。
- 递归 vs 转发:Unbound 真递归首次查询可能 80–200ms(要从根查起),但 CoreDNS 这种转发型首查只多一个到上游的往返,通常更稳更快。家用建议转发型即可。
一句话:把网关架在离你近的机房(比如美西),多出来的延迟往往比"运营商 DNS 抽风"还小,体验只升不降。
几个容易踩的坑和安全注意
- 别把明文 53 暴露公网:只对外开 853/443,明文 53 绑在 127.0.0.1 或内网,避免被当成开放解析器参与 DDoS 放大。
- 防火墙只放需要的端口:云厂商安全组只放行 853、443(以及你 SSH 的 22),其余默认拒绝。
- 证书记得自动续期:用 certbot 的定时器或 acme.sh 的 cron,别让证书过期导致全家断网。
- 开 DNSSEC:CoreDNS 加 dnssec 插件、Unbound 默认校验,能挡住伪造回答。
- 限速防滥用:CoreDNS 可用 rate-limit 思路、Unbound 用 access-control,必要时加 fail2ban。
- 双栈别漏 IPv6:如果 VPS 有 IPv6,监听也要带上,否则部分 App 走 v6 时解析失败。