用Stubby+Dnsmasq加密DNS:彻底杜绝VPS DNS劫持,提升解析安全性
用过VPS的朋友大概率遇到过DNS劫持的问题,比如访问某些网站被跳转到陌生页面,或者解析结果被篡改。其实解决这个问题很简单,只要用Stubby搭建加密DNS查询通道,再配合Dnsmasq做转发,就能从根本上防止DNS劫持,11评选亲测有效,今天就把完整的操作步骤拆解开,新手也能跟着做。
先简单说下核心原理:DoH(DNS over HTTPS)和DoT(DNS over TLS)是DNS的加密传输方式,能避免查询过程中被篡改。其中DoH走443端口(和HTTPS一样),DoT走853端口,而Stubby就是专门的DoT客户端,搭配Dnsmasq转发请求,既能加密又能灵活自定义解析规则。
一、先装Stubby:搭建DoT加密DNS客户端
Stubby的作用是把普通DNS查询转换成加密的DoT请求,直接对接靠谱的加密dns服务器(比如Cloudflare),避免查询数据被中途劫持。
1. 安装Stubby
不同系统安装命令不一样,选对应的执行就行:
# Ubuntu/Debian系统 apt update & apt install -y stubby # CentOS系统(注释掉的是CentOS命令,按需解开) # yum install -y stubby
2. 配置Stubby(核心步骤)
编辑Stubby的配置文件/etc/stubby/stubby.yml,把下面的内容完整替换进去,这套配置是优化后的,兼顾安全性和解析速度:
resolution_type: GETDNS_RESOLUTION_STUB dns_transport_list: - GETDNS_TRANSPORT_TLS tls_authentication: GETDNS_AUTHENTICATION_REQUIRED tls_query_padding_blocksize: 128 edns_client_subnet_private: 1 idle_timeout: 10000 listen_addresses: - 127.0.0.1@53000 - 0::1@53000 round_robin_upstreams: 0 upstream_recursive_servers: - address_data: 1.1.1.1 tls_auth_name: "cloudflare-dns.com" - address_data: 1.0.0.1 tls_auth_name: "cloudflare-dns.com"
配置说明:这里用的是Cloudflare的加密DNS服务器(1.1.1.1和1.0.0.1),也可以换成其他DoT服务器,比如Google的8.8.8.8(记得改tls_auth_name)。
3. 重启并测试Stubby
重启服务让配置生效,然后测试是否能正常解析:
# 重启Stubby systemctl restart stubby # 测试解析(成功会返回Google的A记录IP) dig @127.0.0.1 -p 53000 www.google.com
如果终端返回了正常的IP地址,说明Stubby配置成功了,接下来搭配Dnsmasq做转发。
二、安装Dnsmasq:灵活转发DNS请求
Dnsmasq是轻量级的DNS转发工具,能把系统的DNS请求转发到Stubby的加密端口,还能自定义特定域名的解析规则,比如只让Google域名走加密解析,其他域名按默认来。
1. 安装Dnsmasq
# Ubuntu/Debian系统 apt update && apt install -y dnsmasq # CentOS系统 # yum install -y dnsmasq
2. 配置Dnsmasq
编辑/etc/dnsmasq.conf,在文件末尾添加下面的规则(按需选择):
# 可选1:所有DNS查询都走Stubby加密(注释掉下面这行启用) # server=127.0.0.1#53000 # 必加:监听本地地址 listen-address=127.0.0.1 # 可选2:只让特定域名走加密解析(比如google.com) server=/google.com/127.0.0.1#53000
3. 重启Dnsmasq
systemctl restart dnsmasq
三、配置系统DNS:让所有请求走加密通道
最后一步是修改系统的DNS配置,让系统默认使用Dnsmasq的本地端口,彻底脱离可能被劫持的公共DNS。
1. 编辑resolv.conf
打开/etc/resolv.conf,在最顶部添加下面两行,注释掉其他nameserver:
nameserver 127.0.0.1 options edns0
2. 验证解析结果
执行下面的命令,验证是否能拿到未被劫持的IP:
dig www.google.com
如果返回的是Google的真实IP,没有被篡改,说明整个流程配置成功了。
四、常见问题解决(FAQs)
1. 想让所有域名都用Stubby加密解析
步骤1:在Dnsmasq配置文件中启用server=127.0.0.1#53000;
步骤2:把/etc/resolv.conf里除了nameserver 127.0.0.1之外的行都注释掉;
步骤3:防止resolv.conf被系统还原,设置只读:chattr +i /etc/resolv.conf(想改回来就执行chattr -i /etc/resolv.conf)。
2. 53端口被占用,Dnsmasq启动失败
先查看53端口被哪个程序占用:
# 两种命令选一个就行 netstat -tuln | grep :53 lsof -i :53
找到占用程序后,要么停止该程序,要么修改Dnsmasq的监听端口(不推荐,系统默认走53端口)。
3. 重启系统后DNS配置失效
大概率是resolv.conf被网络服务自动覆盖了,除了设置只读(chattr +i),还可以禁用系统的DNS自动配置服务(比如systemd-resolved),11评选建议优先用chattr +i的方式,简单高效。
总结:加密DNS的核心优势
用Stubby+Dnsmasq的组合,既能防止VPS的DNS被劫持(比如某些商家的DNS解锁导致解析异常),又能保护DNS查询的隐私,避免被监控。如果是做跨境业务、访问海外网站,这套配置能让解析更稳定,不会出现“解析到错的IP导致网站打不开”的情况。
操作要点:先配Stubby确保加密通道可用,再用Dnsmasq灵活转发,最后锁定系统DNS配置,三步下来就能彻底解决DNS劫持问题,比直接改公共DNS靠谱多了。