记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
2.DHCP/DNS设置下设置DNS转发和重绑定保护白名单
转发到旁路由53端口也可,mosdns-cn可以取代systemd-resolved作为域名解析服务,并且能够加密请求。
补充:设置忽略解析文件,指定主路由接口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