用Stubby+Dnsmasq加密DNS:彻底杜绝VPS DNS劫持,提升解析安全性

技术教程 11评选

用过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靠谱多了。