Contents
  1. 1. DNS-over-Https(DoH)
  2. 2. Dnsmasq
  3. 3. ipset+iptables
  4. 4. ss + 结尾

最近发现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
2
opkg update
opkg install https_dns_proxy

安装完成后进行一些配置,主要是端口改成5353,默认使用google的服务器,国内有个叫红鱼的,我在试用

1
2
3
4
5
6
7
8
9
config https_dns_proxy
option listen_addr '127.0.0.1'
option listen_port '5353'
option user 'nobody'
option group 'nogroup'
option subnet_addr ''
option proxy_server ''
option url_prefix 'https://dns.rubyfish.cn/dns-query?'
#option url_prefix 'https://dns.google.com/resolve?'

端口用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
2
3
4
5
# 新建ipset叫gfwlist
ipset -N gfwlist iphash
#匹配gfwlist的流量转到1234端口(你ss的端口)
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1234
iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1234

上面的命令写进/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)自动翻墙

Contents
  1. 1. DNS-over-Https(DoH)
  2. 2. Dnsmasq
  3. 3. ipset+iptables
  4. 4. ss + 结尾