目的:未 root 的安卓 8 手機在 WiFi 和 4G 下使用 dnscrypt-proxy 2 避免 DNS 污染。
跑起來
使用 Termux 來運行 dnscrypt-proxy 2,配置方法參考Fedora使用DNSCrypt。由於手機未 root ,所以無法監聽 53 端口,可以用 5353 替代。配置成功後 dig ft.wupo.info -p 5353 @127.0.0.1 應該可以能正確返回 DNS 查詢。
使用 personalDNSfilter (去 F-droid 下載)實現的本地 VPN 來修改系統的DNS查詢,它同時還能攔截廣告。配置非常簡單,只需要在DNS配置欄選中禁用 DNS 服務器查找,並在輸入框中輸入下面一行即可。
127.0.0.1::5050::UDP
日常使用
新建文件 /data/data/com.termux/files/home/scripts/dns.sh 並給予執行權限。
startDns(){ nohup /data/data/com.termux/files/home/opt/dnscrypt/dnscrypt-proxy -config /data/data/com.termux/files/home/opt/dnscrypt/dnscrypt-proxy.toml& echo "starting dns" sleep 10 am start --user 0 -n dnsfilter.android/.DNSProxyActivity sleep 2 } stopDns(){ am start --user 0 -n dnsfilter.android/.DNSProxyActivity sleep 8 pkill dnscrypt-proxy echo "killed dns" } status(){ vt1="$(ps -ef | grep dnscrypt-proxy | wc -l)" vt2=" " if [[ $vt1 = "2" ]]; then dnsproxyStatus="1" vt2="$(dig -p 5353 +short www.v2ex.com @127.0.0.1)" else dnsproxyStatus="0" fi } if [[ $1 = "1" ]]; then echo "start" startDns elif [[ $1 = "2" ]]; then echo "restart" stopDns sleep 3 startDns elif [[ $1 = "0" ]]; then echo "stop" stopDns elif [[ $1 = "s" ]]; then status echo "dns: $dnsproxyStatus | $vt2" fi
在 ~/.bash_profile 中增加快捷命令
alias d1='/data/data/com.termux/files/home/scripts/dns.sh 1' alias d0='/data/data/com.termux/files/home/scripts/dns.sh 0' alias dt='/data/data/com.termux/files/home/scripts/dns.sh s'
使用的時候,運行 d1 即可啟動 dnscrypt-proxy 服務,並且拉起 personalDNSfilter。運行 d0 則會先拉起 personalDNSfilter,此時需要手動點下 Close 退出 APP,然後會關閉 dnscrypt-proxy 服務。
本文更新於 2021/11/22。