OpenWrt DNS-over-Https纯净上网
最近发现DNS很不稳定,我们公司的正常域名在福建解析不出了,以前在家里路由设置的科学上网DNS也不行了(ss-tunel转发),还一度怀疑是ss的问题,折腾了两天,郁闷。。。
按网上方法使用chinadns、dns-forwarder试了一下也不行。
既然知道问题是DNS,那这问题必须要解决!
DNS-over-Https(DoH)
众所周知,DNS是非常古老的协议,基于udp明文,没有校验,GFW通过污染公共DNS净化网络是常规操作。
所以这里我们的应对措施是使用DNS-over-Https,进行加密dns查询。这种协议已经被firefox浏览器采用。
我用的OpenWrt版本是18.06.1,可以通过下面的命令安装
1 | opkg update |
安装完成后进行一些配置,主要是端口改成5353,默认使用google的服务器,国内有个叫红鱼的,我在试用
1 | config https_dns_proxy |
端口用5353是配合dnsmasq,把需要番茄的域名与国内域名区分解析,如果你路由本来跑了chinadns和dns-forwarder的可以停掉了,防止5353端口被占用,这两个我这边已经阵亡。
Dnsmasq
这个在18版Openwrt已经是dnsmasq-full,是默认的内置dns,这个东西还是可以的,我们用它配置特点域名解析转向使用DoH。
新建并进入目录 /etc/dnsmasq.d ,从 https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist_ipset.conf 下载 dnsmasq_gfwlist_ipset.conf 后放入该目录。
这里感谢前辈的工作,为我们积累了这个list。里面的域名指定了使用127.0.0.1#5353也就是我们配的DoH服务进行解析。
然后修改一下dnsmasq的启动文件,这个东西原版估计有bug,生成的配置conf-dir永远是/tmp/dnsmasq.d,无论我怎么改/etc/dnsmasq.conf都不行。。。
启动文件是 /etc/init.d/dnsmasq,vi查找/tmp/dnsmasq.d替换成/etc/dnsmasq.d吧
ipset+iptables
按上面配置了之后,特定域名走DoH解析,解析结果会保存到ipset,这里我们要把ipset里面ip的流量通过iptables转发到ss。
1 | # 新建ipset叫gfwlist |
上面的命令写进/etc/rc.local,路由每次重启都执行
ss + 结尾
ss这个肯定是需要的,不过网上教程很多,就不重复了,呵呵,反正本篇主要解决dns污染问题,主要技术是DoH。
简单总结一下,客户端dns请求通过路由dnsmasq把特殊域名通过DoH解析,结果存入ipset,iptables匹配ipset走ss。
ps:还有一个dns加密的方式叫DNSCrypt,协议比DoH早一点,貌似不是很活跃,我试了一下也可以,有兴趣参考这里
其他参考:
Openwrt上使用dnsmasq和ipset实现域名分流
OPENWRT + DoH (DNS over HTTPS)
【Network】翻墙 - Shadowsocks + OpenWRT + dnsmasq-full + ipset + gfwList 实现路由器(小米路由器 mini)自动翻墙