安卓手機如果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。