安卓手機如果root了,便可以通過AFWall+(Github項目地址)來使用iptables管控網絡。
在安卓上使用DNSCrypt
由於TCP旁路阻斷技術的應用,DNSCrypt已經不能為日常使用網絡帶來太多方便,所以僅僅是記錄一下使用方法而已。先安裝好AFWall+並根據自己的喜好定製軟件的聯網規則,然後啟用iptables。我們使用Termux來至執行iptabls命令。根據自己的手機系統下載dnscrypt-proxy,比如我的就是dnscrypt-proxy-android_arm64-2.0.17.zip。如果不知道自己的手機系統,可以運行uname -a,如果出現aarch64就跟我一樣下載android_arm64版本就行。下載後解壓到/data/data/com.termux/files/home/opt/dns目錄里。複製一份文件夾里的配置文件即cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml就可以了,配置也可以參考Fedora使用DNSCrypt。下面的文件我是放在家目錄下的,文件名是dns.sh,記得加上執行權限。
remove127(){ /system/bin/iptables -t nat -D OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -D OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -D OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -D OUTPUT -d 114.114.114.114 -p udp --dport 53 -j DNAT --to-destination 114.114.114.114:53 } add127(){ /system/bin/iptables -t nat -I OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -I OUTPUT -d 114.114.114.114 -p udp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53 } startDns(){ /data/data/com.termux/files/home/opt/dns/dnscrypt-proxy -config /data/data/com.termux/files/home/opt/dns/dnscrypt-proxy.toml > /dev/null 2>1 & echo "starting dns" sleep 15 } stopDns(){ pkill dnscrypt-proxy echo "killed dns" } test(){ var1=$(su -c "/system/bin/iptables -C OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53") } status(){ vt1="$(ps -ef | grep dnscrypt-proxy | wc -l)" if [[ $vt1 = "2" ]]; then dnsproxyStatus="1" else dnsproxyStatus="0" fi vt2="$(/system/bin/iptables -t nat -L | grep 127.0.0.1:53 | wc -l)" if [[ $vt2 = "2" ]]; then iptablesStatus="1" else iptablesStatus="0" fi } if [[ $1 = "1" ]]; then echo "start" remove127 sleep 5 startDns add127 elif [[ $1 = "2" ]]; then echo "restart" remove127 stopDns sleep 3 startDns add127 elif [[ $1 = "0" ]]; then echo "stop" remove127 stopDns elif [[ $1 = "s" ]]; then status echo "dns: $dnsproxyStatus | iptables: $iptablesStatus" else status if [[ $dnsproxyStatus = "1" ]]; then echo "$(date) dns ok" >> /data/data/com.termux/files/home/log.log else remove127 stopDns remove127 sleep 5 startDns add127 echo "$(date) dns started" >> /data/data/com.termux/files/home/log.log fi fi
#使用說明 #首先切換的超級用戶 su #查看當前狀態,1代表開啟,0代表關閉 ./dns.sh s #關閉dnscrypt-proxy ./dns.sh 0 #開啟dnscrypt-proxy ./dns.sh 1 #重新啟動dnscrypt-proxy ./dns.sh 2
啟動完成後可以通過dnsleaktest.com來查看當前的本機的dns。本來腳本還做了自啟動的適配,但是無論是Termux的自動啟動還是Magisk的自動啟動,都不太好用就算了。
本文更新於 2019/08/08。