记Openwrt+旁路由实现dns劫持分流加密

需求:

劫持并加密所有明文DNS请求,对于大陆的IP直接使用阿里公共DNS(https://223.5.5.5/dns-query)实现加密解析,非大陆IP走1.1.1.1,实现对不同域名分流查询。

另外由于校园网域名解析结果都是内网IP,需要走UDP53协议才能被学校劫持,因此这部分DNS请求需要转发到114.114.114.114。

架构:

Openwrt主路由 IP:192.168.1.1

OrangePi Zero 2旁路由 IP:192.168.1.2

在Openwrt内LAN口自定义DCHP Option,设置网关为旁路由IP,DNS服务器为主路由IP。

具体设置:

主路由

1.设置网关为192.168.1.2, DNS服务器为192.168.1.1

1

2.DHCP/DNS设置下设置DNS转发和重绑定保护白名单

2

转发到旁路由53端口也可,mosdns-cn可以取代systemd-resolved作为域名解析服务,并且能够加密请求。

3

补充:设置忽略解析文件,指定主路由接口DNS

如果没有设置忽略解析文件,发往192.168.1.1 的dns请求将不会被转发到旁路由!只有在主路由上发往127.0.0.1的dns请求会被转发到旁路由,太坑了!

设置忽略解析文件在我这边会莫名其妙自动取消,所以需要给每个接口指定DNS服务器为192.168.1.2

3.劫持所有明文DNS请求到主路由,防止DNS泄露

参考 [OpenWrt Wiki] DNS hijacking

uci -q delete firewall.dns_int
uci set firewall.dns_int="redirect"
uci set firewall.dns_int.name="Intercept-DNS"
uci set firewall.dns_int.src="lan"
uci set firewall.dns_int.src_dport="53"
uci set firewall.dns_int.proto="tcp udp"
uci set firewall.dns_int.target="DNAT"
uci set firewall.dns_int.dest="lan"
uci set firewall.dns_int.dest_ip="192.168.1.1"
uci commit firewall
/etc/init.d/firewall restart

至此已经完成了主路由方面的设置。

主路由转发DNS查询给旁路由并缓存查询结果,对特定域名使用自定义DNS服务器查询。

旁路由

旁路由需要安装v2raya和mosdns-cn,github地址:

https://github.com/v2rayA/v2rayA

https://github.com/IrineSistiana/mosdns-cn

v2raya设置:

透明代理开启,IP转发和端口分享开启。

mosdns-cn配置:

./mosdns-cn -s :53 --local-upstream 'https://223.5.5.5/dns-query' --local-ip 'geoip.dat:cn' --local-domain 'geosite.dat:cn' --remote-upstream 'https://1.1.1.1/dns-query' --remote-domain 'geosite.dat:geolocation-!cn' --log-file /tmp/mosdns.log -v

测试正常后可以以服务的形式安装

./mosdns-cn --service install -s :53 --local-upstream 'https://223.5.5.5/dns-query' --local-ip 'geoip.dat:cn' --local-domain 'geosite.dat:cn' --remote-upstream 'https://1.1.1.1/dns-query' --remote-domain 'geosite.dat:geolocation-!cn' --log-file /tmp/mosdns.log -v
./mosdns-cn --service start

最后:

设置IP为静态,地址192.168.1.2,网关192.168.1.1,DNS服务器127.0.0.1