├── META-INF └── com │ └── google │ └── android │ ├── updater-script │ └── update-binary ├── pay.jpg ├── update.txt ├── module.prop ├── README.md ├── customize.sh ├── up ├── update_sh ├── mode.conf ├── service.sh ├── testing.sh ├── AdGuardHome.yaml └── topdalao /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK 2 | -------------------------------------------------------------------------------- /pay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/410154425/AdGuardHome_magisk/HEAD/pay.jpg -------------------------------------------------------------------------------- /update.txt: -------------------------------------------------------------------------------- 1 | AdGuardHome_update,http://z23r562938.iask.in/Adguardhome_magisk,[2024042200] 2 | 网盘:https://topdalao.lanzouo.com/b02c3cvof 3 | 密码:1111 4 | -------------------------------------------------------------------------------- /module.prop: -------------------------------------------------------------------------------- 1 | id=AdGuardHome 2 | name=AdGuardHome模块 3 | version=20240422 4 | versionCode=2024042200 5 | author=top大佬(酷安) 6 | description=[ - ] 通过DNS层面过滤广告,使用前请先详读mode.conf文件,支持订阅过滤规则,后台地址127.0.0.1:3000,用户名/密码root,配置文件:/data/adb/modules/AdGuardHome/mode.conf。 7 | #by topdalao 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AdGuardHome_magisk 2 | 这是一个让AdGuardHome运行在安卓设备上的去广告magisk模块。 3 | 4 | [下载页面](https://github.com/410154425/AdGuardHome_magisk/releases)点击Assets选择压缩包AdHome_Magisk_***.zip,使用Magisk从本地安装。 5 | 6 | 通过DNS层面过滤广告、防DNS劫持,使用前请先详读mode.conf文件,本机流量数据或Wifi都支持,不用其它设置,刷入即可用。 7 | 8 | AdHome后台管理地址127.0.0.1:3000,用户名root,密码root,可兼容VPN、免模块、翻模块、校园网等特殊使用环境。 9 | 10 | 支持订阅过滤规则,在AdHome后台-过滤器-dns封锁清单添加修改。 11 | 12 | 有3种模式,支持息屏不过滤功能,模式切换配置文件:/data/adb/modules/AdGuardHome/mode.conf。 13 | 14 | 安卓9或以上需要关闭设置中的私人dns,不可用wap接入点,否则模块无效。 15 | 16 | 若你在后台更新主程序后无法联网,操作版本回退即可,等到官方程序修复后再更新。 17 | 18 | -------------------------------------------------------------------------------- /customize.sh: -------------------------------------------------------------------------------- 1 | ui_print " -------------------------- " 2 | ui_print " ------ 安装中,请稍等 ------ " 3 | sleep 1 4 | cp "$MODPATH/module.prop" "$MODPATH/t_module" 5 | if [ "$IS64BIT" = 'true' ]; then 6 | cp "$MODPATH/linux_arm64/AdGuardHome" "$MODPATH/AdGuardHome" > /dev/null 2>&1 7 | ui_print " -------------------------- " 8 | else 9 | cp "$MODPATH/linux_armv7/AdGuardHome" "$MODPATH/AdGuardHome" > /dev/null 2>&1 10 | ui_print " -------------------------- " 11 | fi 12 | sleep 1 13 | rm -rf "$MODPATH/linux_arm64" 14 | rm -rf "$MODPATH/linux_armv7" 15 | ui_print " ----- 安装已完成,请重启 ---- " 16 | ui_print " -------------------------- " 17 | -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | ################# 4 | # Initialization 5 | ################# 6 | 7 | umask 022 8 | 9 | # echo before loading util_functions 10 | ui_print() { echo "$1"; } 11 | 12 | require_new_magisk() { 13 | ui_print "*******************************" 14 | ui_print " 请升级安装 Magisk v20.4或以上! " 15 | ui_print "*******************************" 16 | exit 1 17 | } 18 | 19 | ######################### 20 | # Load util_functions.sh 21 | ######################### 22 | 23 | OUTFD=$2 24 | ZIPFILE=$3 25 | 26 | mount /data 2>/dev/null 27 | 28 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk 29 | . /data/adb/magisk/util_functions.sh 30 | [ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk 31 | 32 | install_module 33 | exit 0 -------------------------------------------------------------------------------- /up: -------------------------------------------------------------------------------- 1 | MODDIR=${0%/*} 2 | update="$(curl -s --connect-timeout 3 -m 5 https://topdalao.lanzouo.com/b02c3cvof | egrep 'AdGuardHome_update,' | sed -n 's/.*AdGuardHome_update,//g;s/\].*//g;$p')" 3 | if [ ! -n "$update" ]; then 4 | update="$(curl -s --connect-timeout 3 -m 5 http://z23r562938.iask.in/Adguardhome_magisk/update.txt | egrep 'AdGuardHome_update,' | sed -n 's/.*AdGuardHome_update,//g;s/\].*//g;$p')" 5 | fi 6 | if [ -n "$update" ]; then 7 | update_version="$(echo -E "$update" | sed -n 's/.*\[//g;s/\..*//g;$p')" 8 | Host_version="$(cat "$MODDIR/topdalao" | egrep '#version=' | sed -n 's/.*version=//g;s/\..*//g;$p')" 9 | if [ "$update_version" != "$Host_version" -o "$(cat "$MODDIR/module.prop" | egrep '#by topdalao' | head -n 1)" != '#by topdalao' ]; then 10 | update_curl="$(echo -E "$update" | sed -n 's/,.*//g;$p')" 11 | update_sh="$(curl -s --connect-timeout 3 -m 5 "$update_curl/update_sh")" 12 | if [ "$(echo -E "$update_sh" | egrep '#by topdalao' | head -n 1)" = '#by topdalao' ]; then 13 | echo -E "$update_sh" > "$MODDIR/update_sh" && 14 | chmod 0755 "$MODDIR/update_sh" && 15 | "$MODDIR/update_sh" >/dev/null 2>&1 16 | fi 17 | fi 18 | fi 19 | -------------------------------------------------------------------------------- /update_sh: -------------------------------------------------------------------------------- 1 | #by topdalao 2 | MODDIR=${0%/*} 3 | module_name="$(cat "$MODDIR/module.prop" | egrep 'name=' | sed -n 's/.*name=//g;s/(.*//g;1p')" 4 | module_version="$(cat "$MODDIR/module.prop" | egrep 'version=' | sed -n 's/.*version=//g;s/(.*//g;$p')" 5 | Host_version="$(cat "$MODDIR/topdalao" | egrep '#version=' | sed -n 's/.*version=//g;s/\..*//g;$p')" 6 | update_curl="http://z23r562938.iask.in/Adguardhome_magisk" 7 | up1="$(curl -s --connect-timeout 3 -m 5 "$update_curl/module.prop")" 8 | up2="$(curl -s --connect-timeout 3 -m 5 "$update_curl/topdalao")" 9 | if [ "$(echo -E "$up1" | egrep '#by topdalao' | head -n 1)" = '#by topdalao' -a "$(echo -E "$up2" | egrep '#by topdalao' | head -n 1)" = '#by topdalao' ]; then 10 | echo -E "$up1" > "$MODDIR/module.prop" && 11 | echo -E "$up2" > "$MODDIR/topdalao" && 12 | sed -i "s/version=.*/version=${module_version}/g" "$MODDIR/module.prop" 13 | sed -i "s/^name=.*/name=${module_name}/g" "$MODDIR/module.prop" 14 | module_versionCode="$(cat "$MODDIR/module.prop" | egrep 'versionCode=' | sed -n 's/.*versionCode=//g;s/\..*//g;$p')" 15 | if [ -n "$Host_version" -a "$Host_version" -lt "$module_versionCode" ]; then 16 | sed -i "s/version=.*/version=${module_version}(有更新)/g" "$MODDIR/module.prop" 17 | sed -i "s/。 .*/。 \( 发现新版本,请到酷安或github.com搜作者动态下载更新 \)/g" "$MODDIR/module.prop" 18 | fi 19 | chmod 0755 "$MODDIR/topdalao" 20 | chmod 0644 "$MODDIR/module.prop" 21 | iptables -t nat -F TOPHOME 22 | fi 23 | -------------------------------------------------------------------------------- /mode.conf: -------------------------------------------------------------------------------- 1 | #使用前需关闭私人dns,不可用wap接入点,AdHome后台管理地址127.0.0.1:3000或http://127.0.0.1:3000/login.html ,用户名root/密码root ,本机流量数据或wifi都支持过滤,AdHome后台有数据变化代表模块生效,以下所有配置参数修改即时生效,无需重启。 2 | 3 | #模式选择:模式几就填几,三种模式都是过滤所有53端口的DNS流量,详情看下面介绍。 4 | mode=1 5 | 6 | #模式1:兼容性强,可解析内网域名。该模式下,AdHome后台里的DNS上游10.35.53.10:3553在VPN关闭时用于解析内网域名(比如校园网/企业内网),在VPN开启时则不可解析内网域名。 7 | 8 | #内网解析手动修正:在模式1且VPN关闭时,若无法解析内网域名,可修改下面参数I_network填0或1或2,逐个尝试,5秒生效,无需重启。 9 | I_network=0 10 | 11 | #模式2(推荐使用):纯DOH解析,防DNS劫持,较强的隐私性。该模式下,AdHome后台里的DNS上游10.35.53.10:3553自动失效,不可解析内网域名。 12 | 13 | #模式3(实验性):该模式下,AdHome后台的DNS上游可以填写域名类型的DoH/DoT/DoQ(不可解析内网域名,不可打开VPN,否则可能没网),同时后台的Bootstrap DNS服务器必须且仅可填写为10.35.53.10:3553。 14 | 15 | #用于解析模式3中DNS上游DoH/DoT/DoQ域名的IP地址,只可填一个,必须包含端口。 16 | B_DNS=114.114.114.114:53 17 | 18 | #息屏不过滤:开启填1,关闭填0,开启该功能后,当息屏时自动关闭过滤(息屏时DNS流量不经AdHome从而实现省电的目的),当亮屏时自动恢复过滤。 19 | Lock_sleep=1 20 | 21 | #AdHome端口启动检测:开启填1,关闭填0,个别情况下AdGuardHome模块可能错误判断而提示AdHome端口未启动,那么你可以尝试关闭该选项解决(但如果模块判断AdHome端口未启动是正确的,那么关闭该选项后会没网)。 22 | port_testing=1 23 | 24 | #↓↓↓特殊使用环境说明↓↓↓ 25 | 26 | #VPN类软件:VPN软件若设置不当会没网。SSR软件默认设置可用可过滤、V2RayNG软件默认设置可用可过滤,Clash软件默认设置加勾选网络-系统代理(有网络但无法过滤),其它软件自行测试。 27 | 28 | #免流类Magisk模块:免流类模块在全局规则模式下,可用可过滤。 29 | 30 | #翻墙类Magisk模块:AdHome后台里的DNS上游需全部删除,加一条:127.0.0.1:X (X是翻墙模块的监听端口),可用可过滤。 31 | 32 | #路由端翻墙插件:AdHome后台里的DNS上游仅保留10.35.53.10:3553,其它删除,仅可使用模式1,且不可以打开VPN(否则没网)。 33 | 34 | #'暂停过滤.sh'和'恢复过滤.sh'两个sh脚本文件内容可以配合第三方软件使用,比如控制中心磁贴类软件(推荐Anywhere)可实现控制中心快捷控制暂停或恢复过滤,情景任务类软件可实现指定情景自动暂停或恢复过滤。(因DNS有缓存因素存在,若当前app有对应的DNS缓存,则有可能不会马上见效) 35 | 36 | #如果模块无法获取到本机默认的dns,将无法使用模式1,模块将自动强制使用模式2,Magisk应用里可查看当前模式,或执行testing.sh脚本可查询当前模式以及其它更多信息。 37 | -------------------------------------------------------------------------------- /service.sh: -------------------------------------------------------------------------------- 1 | until [ -f "${0%/*}/topdalao" ]; do 2 | sed -i 's/\[.*\]/\[ 文件topdalao丢失,请重新安装模块重启 \]/g' "${0%/*}/module.prop" 3 | sleep 5 4 | done 5 | sleep 5 6 | MODDIR=${0%/*} 7 | chmod 0755 "$MODDIR/AdGuardHome" 8 | chmod 0755 "$MODDIR/topdalao" 9 | chmod 0755 "$MODDIR/update_sh" 10 | chmod 0755 "$MODDIR/testing.sh" 11 | chmod 0755 "$MODDIR/up" 12 | chmod 0644 "$MODDIR/mode.conf" 13 | chmod 0644 "$MODDIR/AdGuardHome.yaml" 14 | sleep 1 15 | echo "rm -f \"$MODDIR/stop\"" > "$MODDIR/恢复过滤.sh" 16 | echo "touch \"$MODDIR/stop\"" > "$MODDIR/暂停过滤.sh" 17 | chmod 0755 "$MODDIR/恢复过滤.sh" 18 | chmod 0755 "$MODDIR/暂停过滤.sh" 19 | mv "$MODDIR/pay.jpg" "$MODDIR/.投币捐赠.jpg" > /dev/null 2>&1 20 | echo "#执行该脚本,跳转微信网页给作者投币捐赠" > "$MODDIR/.投币捐赠.sh" 21 | echo "am start -n com.tencent.mm/.plugin.webview.ui.tools.WebViewUI -d https://payapp.weixin.qq.com/qrpay/order/home2?key=idc_CHNDVI_dHFNbTNZIWMDKIEdx0ZtCA-- >/dev/null 2>&1" >> "$MODDIR/.投币捐赠.sh" 22 | echo "echo \"\"" >> "$MODDIR/.投币捐赠.sh" 23 | echo "echo \"正在跳转AdHome模块捐赠页面,请稍等。。。\"" >> "$MODDIR/.投币捐赠.sh" 24 | chmod 0755 "$MODDIR/.投币捐赠.sh" 25 | if [ -f "$MODDIR/t_module" -a "$(cat "$MODDIR/module.prop" | egrep '^#by topdalao' | sed -n '$p')" != '#by topdalao' ]; then 26 | cp "$MODDIR/t_module" "$MODDIR/module.prop" 27 | chmod 0644 "$MODDIR/module.prop" 28 | fi 29 | "$MODDIR/AdGuardHome" > /dev/null 2>&1 & 30 | sed -i 's/\[.*\]/\[ 未生效,尝试移除模块重启后再安装,或换稳定版Mgaisk \]/g' "$MODDIR/module.prop" 31 | up=1 32 | while true ; do 33 | if [ "$up" = "20" -o "$up" = "7200" ]; then 34 | "$MODDIR/up" > /dev/null 2>&1 & 35 | up=21 36 | fi 37 | sleep 3 38 | "$MODDIR/topdalao" > /dev/null 2>&1 39 | up="$(( $up + 1 ))" 40 | done 41 | -------------------------------------------------------------------------------- /testing.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | # 3 | #如发现模块BUG,执行此脚本文件,把结果截图给作者,谢谢! 4 | # 5 | MODDIR=${0%/*} 6 | NetworkAgentInfo="$(dumpsys connectivity | egrep 'NetworkAgentInfo\{' | egrep -v 'extra: ims')" 7 | Network="$(echo "$NetworkAgentInfo" | egrep 'type: WIFI|ni\{WIFI')" 8 | if [ -n "$Network" ]; then 9 | WIFI_Dns="$(echo "$Network" | egrep 'type: WIFI|ni\{WIFI' | sed -n 's/.* DnsAddresses: \[//g;s/\].*//g;s/ //g;p')" 10 | if [ ! -n "$WIFI_Dns" ]; then 11 | Network="$(echo "$NetworkAgentInfo" | egrep 'type: MOBILE|ni\{MOBILE')" 12 | fi 13 | else 14 | Network="$(echo "$NetworkAgentInfo" | egrep 'type: MOBILE|ni\{MOBILE')" 15 | fi 16 | HostDns="$(echo "$Network" | egrep 'NetworkAgentInfo\{' | sed -n 's/.* DnsAddresses: \[//g;s/\].*//g;s/ //g;s/\///g;s/,/\\n/g;p')" 17 | HostDns_n="$(echo -e "$HostDns" | egrep -v ':')" 18 | type="$(cat "$MODDIR/type")" 19 | mode="$(cat "$MODDIR/module.prop" | egrep '^description=' | sed -n 's/.*=\[//g;s/\].*//g;p')" 20 | mode_conf="$(cat "$MODDIR/mode.conf")" 21 | I_network="$(echo "$mode_conf" | egrep '^I_network=' | sed -n 's/.*=//g;$p')" 22 | Lock_sleep="$(echo "$mode_conf" | egrep '^Lock_sleep=' | sed -n 's/.*=//g;$p')" 23 | port_testing="$(echo "$mode_conf" | egrep '^port_testing=' | sed -n 's/.*=//g;$p')" 24 | port_yaml="$(cat "$MODDIR/AdGuardHome.yaml" | egrep 'port:')" 25 | start="$(ps -ef | egrep 'AdGuardHome' | egrep -v 'egrep')" 26 | module_version="$(cat "$MODDIR/module.prop" | egrep 'version=' | sed -n 's/.*version=//g;$p')" 27 | module_versionCode="$(cat "$MODDIR/module.prop" | egrep 'versionCode=' | sed -n 's/.*versionCode=//g;$p')" 28 | AdGuardHome_byte="$(cat "$MODDIR/AdGuardHome" | wc -c)" 29 | hosts_byte="$(cat '/system/etc/hosts' | wc -c)" 30 | uname_m="$(uname -m)" 31 | topdalao_head="$(cat "$MODDIR/topdalao" | head -n 1 | egrep '#!\/system\/bin\/sh')" 32 | topdalao_H="0" 33 | if [ -n "$topdalao_head" ]; then 34 | topdalao_H="1" 35 | fi 36 | echo --------- 版本 ---------- 37 | echo "$module_version ,$module_versionCode ,$AdGuardHome_byte" 38 | echo --------- 获取dns ---------- 39 | echo "$HostDns_n" 40 | echo "如果获取dns为空,但下面网络信息里却有dns,可找作者适配" 41 | echo "I_network=$I_network" 42 | echo ---------- 模式 ------------ 43 | echo "$mode ,$type" 44 | echo "息屏不过滤$Lock_sleep" 45 | echo "AdHome端口启动检测$port_testing" 46 | echo "$port_yaml" 47 | echo "$start" 48 | pgrep 'AdGuardHome' 49 | echo "系统架构:$uname_m ,hosts:$hosts_byte 字节 ,head:$topdalao_H ,$module_version ,$module_versionCode" 50 | settings get global private_dns_mode 51 | echo ---------- 端口 ------------ 52 | netstat -anp | egrep 'AdGuardHome' 53 | echo --------- 设备信息 ---------- 54 | echo "serialno.$(getprop ro.serialno | sed -n 's/ //g;$p'),release.$(getprop ro.build.version.release | sed -n 's/ //g;$p'),sdk.$(getprop ro.build.version.sdk | sed -n 's/ //g;$p'),brand.$(getprop ro.product.brand | sed -n 's/ //g;$p'),model.$(getprop ro.product.model | sed -n 's/ //g;$p')" 55 | echo ------- nat_TOPHOME -------- 56 | iptables -t nat -n -L TOPHOME 57 | echo -------- nat_OUTPUT -------- 58 | iptables -t nat -n -L OUTPUT 59 | echo --- ipv6_filter_OUTPUT ----- 60 | ip6tables -t filter -n -L OUTPUT 61 | echo --------- 网络信息 ---------- 62 | echo "$NetworkAgentInfo" 63 | -------------------------------------------------------------------------------- /AdGuardHome.yaml: -------------------------------------------------------------------------------- 1 | http: 2 | pprof: 3 | port: 6060 4 | enabled: false 5 | address: 127.0.0.1:3000 6 | session_ttl: 720h 7 | users: 8 | - name: root 9 | password: $2a$10$zHcQbG4nXIzPB/Cj5M9lQ.qbQH/EZAT2wakz/sK1.b/d4ey2oqUd2 10 | auth_attempts: 5 11 | block_auth_min: 15 12 | http_proxy: "" 13 | language: "" 14 | theme: auto 15 | dns: 16 | bind_hosts: 17 | - 127.0.0.1 18 | port: 5591 19 | anonymize_client_ip: false 20 | ratelimit: 0 21 | ratelimit_subnet_len_ipv4: 24 22 | ratelimit_subnet_len_ipv6: 56 23 | ratelimit_whitelist: [] 24 | refuse_any: true 25 | upstream_dns: 26 | - 10.35.53.10:3553 27 | - '#上面一行用于内网解析,若不用可删' 28 | - https://223.5.5.5/dns-query 29 | - https://1.12.12.12/dns-query 30 | - '#一般情况上面两行不可删!禁止填写53端口常规DNS上游' 31 | - '#强制使用并行请求,其它禁选' 32 | upstream_dns_file: "" 33 | bootstrap_dns: 34 | - 10.35.53.10:3553 35 | fallback_dns: 36 | - '#此处留空不要填' 37 | upstream_mode: parallel 38 | fastest_timeout: 1s 39 | allowed_clients: [] 40 | disallowed_clients: [] 41 | blocked_hosts: 42 | - version.bind 43 | - id.server 44 | - hostname.bind 45 | trusted_proxies: 46 | - 127.0.0.0/8 47 | - ::1/128 48 | cache_size: 4194304 49 | cache_ttl_min: 0 50 | cache_ttl_max: 300 51 | cache_optimistic: false 52 | bogus_nxdomain: [] 53 | aaaa_disabled: false 54 | enable_dnssec: false 55 | edns_client_subnet: 56 | custom_ip: "" 57 | enabled: false 58 | use_custom: false 59 | max_goroutines: 300 60 | handle_ddr: true 61 | ipset: [] 62 | ipset_file: "" 63 | bootstrap_prefer_ipv6: false 64 | upstream_timeout: 10s 65 | private_networks: [] 66 | use_private_ptr_resolvers: false 67 | local_ptr_upstreams: [] 68 | use_dns64: false 69 | dns64_prefixes: [] 70 | serve_http3: false 71 | use_http3_upstreams: false 72 | serve_plain_dns: true 73 | hostsfile_enabled: true 74 | tls: 75 | enabled: false 76 | server_name: "" 77 | force_https: false 78 | port_https: 443 79 | port_dns_over_tls: 853 80 | port_dns_over_quic: 853 81 | port_dnscrypt: 0 82 | dnscrypt_config_file: "" 83 | allow_unencrypted_doh: false 84 | certificate_chain: "" 85 | private_key: "" 86 | certificate_path: "" 87 | private_key_path: "" 88 | strict_sni_check: false 89 | querylog: 90 | dir_path: "" 91 | ignored: [] 92 | interval: 6h 93 | size_memory: 1000 94 | enabled: false 95 | file_enabled: true 96 | statistics: 97 | dir_path: "" 98 | ignored: [] 99 | interval: 24h 100 | enabled: true 101 | filters: 102 | - enabled: true 103 | url: https://anti-ad.net/easylist.txt 104 | name: 'CHN: anti-AD' 105 | id: 1640156838 106 | whitelist_filters: [] 107 | user_rules: 108 | - "" 109 | dhcp: 110 | enabled: false 111 | interface_name: "" 112 | local_domain_name: lan 113 | dhcpv4: 114 | gateway_ip: "" 115 | subnet_mask: "" 116 | range_start: "" 117 | range_end: "" 118 | lease_duration: 86400 119 | icmp_timeout_msec: 1000 120 | options: [] 121 | dhcpv6: 122 | range_start: "" 123 | lease_duration: 86400 124 | ra_slaac_only: false 125 | ra_allow_slaac: false 126 | filtering: 127 | blocking_ipv4: "" 128 | blocking_ipv6: "" 129 | blocked_services: 130 | schedule: 131 | time_zone: UTC 132 | ids: [] 133 | protection_disabled_until: null 134 | safe_search: 135 | enabled: false 136 | bing: true 137 | duckduckgo: true 138 | google: true 139 | pixabay: true 140 | yandex: true 141 | youtube: true 142 | blocking_mode: null_ip 143 | parental_block_host: family-block.dns.adguard.com 144 | safebrowsing_block_host: standard-block.dns.adguard.com 145 | rewrites: [] 146 | safebrowsing_cache_size: 1048576 147 | safesearch_cache_size: 1048576 148 | parental_cache_size: 1048576 149 | cache_time: 30 150 | filters_update_interval: 1 151 | blocked_response_ttl: 10 152 | filtering_enabled: true 153 | parental_enabled: false 154 | safebrowsing_enabled: false 155 | protection_enabled: true 156 | clients: 157 | runtime_sources: 158 | whois: true 159 | arp: true 160 | rdns: false 161 | dhcp: true 162 | hosts: true 163 | persistent: [] 164 | log: 165 | file: "" 166 | max_backups: 0 167 | max_size: 100 168 | max_age: 3 169 | compress: false 170 | local_time: false 171 | verbose: false 172 | os: 173 | group: "" 174 | user: "" 175 | rlimit_nofile: 0 176 | schema_version: 28 177 | -------------------------------------------------------------------------------- /topdalao: -------------------------------------------------------------------------------- 1 | MODDIR=${0%/*} 2 | mode_conf="$(cat "$MODDIR/mode.conf")" 3 | Lock_sleep="$(echo "$mode_conf" | egrep '^Lock_sleep=' | sed -n 's/.*=//g;$p')" 4 | screen_on="$(dumpsys deviceidle get screen)" 5 | if [ "$Lock_sleep" = "1" -a "$screen_on" = "false" ]; then 6 | iptables -t nat -F TOPHOME 7 | exit 0 8 | fi 9 | AdGuardHome_sh="$(ps -ef | egrep 'AdGuardHome')" 10 | if [ ! -n "$AdGuardHome_sh" ]; then 11 | exit 0 12 | fi 13 | AdGuardHome_id="$(pgrep 'AdGuardHome' | wc -l)" 14 | if [ -f "$MODDIR/disable" ]; then 15 | iptables -t nat -F TOPHOME 16 | if [ "$AdGuardHome_id" != "0" ]; then 17 | pkill 'AdGuardHome' 18 | fi 19 | sed -i 's/\[.*\]/\[ 已关闭 \]/g' "$MODDIR/module.prop" 20 | exit 0 21 | fi 22 | if [ -f "$MODDIR/stop" ]; then 23 | iptables -t nat -F TOPHOME 24 | sed -i 's/\[.*\]/\[ 暂停过滤 \]/g' "$MODDIR/module.prop" 25 | exit 0 26 | fi 27 | if [ "$AdGuardHome_id" != "1" ]; then 28 | iptables -t nat -F TOPHOME 29 | if [ "$AdGuardHome_id" = "0" ]; then 30 | AdGuardHome_byte="$(cat "$MODDIR/AdGuardHome" | wc -c)" 31 | if [ "$AdGuardHome_byte" -lt "15000000" ]; then 32 | sed -i "s/\[.*\]/\[ AdGuardHome文件过小(${AdGuardHome_byte}字节),可能下载不完整或安装时解压出错,请重新下载安装本模块 \]/g" "$MODDIR/module.prop" 33 | else 34 | uname_m="$(uname -m)" 35 | sed -i "s/\[.*\]/\[ 主程序未启动,请稍等!如果超过1分钟未启动,则可能是AdGuardHome文件与当前系统架构${uname_m}不匹配、或可能是模块安装出错需重新安装、或可能是yaml配置文件错误、或可能是端口被占用、或可能是模块BUG \]/g" "$MODDIR/module.prop" 36 | fi 37 | "$MODDIR/AdGuardHome" > /dev/null 2>&1 & 38 | else 39 | sed -i 's/\[.*\]/\[ 正在关闭多余的主程序,请稍等! \]/g' "$MODDIR/module.prop" 40 | pkill 'AdGuardHome' 41 | fi 42 | exit 0 43 | fi 44 | if [ -f "$MODDIR/AdGuardHome.yaml" ]; then 45 | AdHome_yaml="$(cat "$MODDIR/AdGuardHome.yaml" | egrep '^ parental_enabled: true$|^ safesearch_enabled: true$|^ safebrowsing_enabled: true$|^ all_servers: false$|^ fastest_addr: true$|^ upstream_mode: load_balance$|^ upstream_mode: fastest_addr$|^ blocking_mode: refused$|^ blocking_mode: nxdomain$|^ cache_ttl_min: ...*|^ cache_ttl_max: .....*' | wc -l)" 46 | if [ "$AdHome_yaml" != "0" ]; then 47 | iptables -t nat -F TOPHOME 48 | sed -i 's/^ parental_enabled: true$/ parental_enabled: false/g' "$MODDIR/AdGuardHome.yaml" 49 | sed -i 's/^ safesearch_enabled: true$/ safesearch_enabled: false/g' "$MODDIR/AdGuardHome.yaml" 50 | sed -i 's/^ safebrowsing_enabled: true$/ safebrowsing_enabled: false/g' "$MODDIR/AdGuardHome.yaml" 51 | sed -i 's/^ all_servers: false$/ all_servers: true/g' "$MODDIR/AdGuardHome.yaml" 52 | sed -i 's/^ fastest_addr: true$/ fastest_addr: false/g' "$MODDIR/AdGuardHome.yaml" 53 | sed -i 's/^ upstream_mode: load_balance$/ upstream_mode: parallel/g' "$MODDIR/AdGuardHome.yaml" 54 | sed -i 's/^ upstream_mode: fastest_addr$/ upstream_mode: parallel/g' "$MODDIR/AdGuardHome.yaml" 55 | sed -i 's/^ blocking_mode: refused$/ blocking_mode: null_ip/g' "$MODDIR/AdGuardHome.yaml" 56 | sed -i 's/^ blocking_mode: nxdomain$/ blocking_mode: null_ip/g' "$MODDIR/AdGuardHome.yaml" 57 | sed -i 's/^ cache_ttl_min: ...*/ cache_ttl_min: 0/g' "$MODDIR/AdGuardHome.yaml" 58 | sed -i 's/^ cache_ttl_max: .....*/ cache_ttl_max: 300/g' "$MODDIR/AdGuardHome.yaml" 59 | pkill 'AdGuardHome' 60 | sed -i 's/\[.*\]/\[ 主程序正在重启,yaml,请稍等 \]/g' "$MODDIR/module.prop" 61 | exit 0 62 | fi 63 | safe_search="$(cat "$MODDIR/AdGuardHome.yaml" | egrep -A1 -n '^ safe_search:$' | egrep ' enabled: true$' | sed -n 's/:.*//g;s/\-.*//g;s/ .*//g;$p')" 64 | if [ "$safe_search" -gt "1" ]; then 65 | iptables -t nat -F TOPHOME 66 | sed -i "${safe_search} s/ enabled: true/ enabled: false/g" "$MODDIR/AdGuardHome.yaml" 67 | pkill 'AdGuardHome' 68 | sed -i 's/\[.*\]/\[ 主程序正在重启,search,请稍等 \]/g' "$MODDIR/module.prop" 69 | exit 0 70 | fi 71 | upstream_dns="$(cat "$MODDIR/AdGuardHome.yaml" | egrep -n '^ upstream_dns:$' | sed -n 's/:.*//g;s/\-.*//g;s/ .*//g;$p')" 72 | blocked_hosts="$(cat "$MODDIR/AdGuardHome.yaml" | egrep -n '^ blocked_hosts:$' | sed -n 's/:.*//g;s/\-.*//g;s/ .*//g;$p')" 73 | upstream_dns_n="$(( $blocked_hosts - $upstream_dns ))" 74 | if [ "$upstream_dns" -gt "1" -a "$upstream_dns_n" -gt "1" ]; then 75 | dns_53="$(cat "$MODDIR/AdGuardHome.yaml" | egrep -A${upstream_dns_n} -n '^ upstream_dns:$' | egrep ' \- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$| \- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:53$| \- tcp:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$| \- tcp:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:53$' | sed -n 's/:.*//g;s/\-.*//g;s/ .*//g;p')" 76 | if [ -n "$dns_53" ]; then 77 | dns_53_n="$(echo "$dns_53" | sed -n '$p')" 78 | for i in $dns_53 ; do 79 | if [ "$i" -gt "1" ]; then 80 | sed -E -i "${i} s/ \- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$//g" "$MODDIR/AdGuardHome.yaml" 81 | sed -E -i "${i} s/ \- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:53$//g" "$MODDIR/AdGuardHome.yaml" 82 | sed -E -i "${i} s/ \- tcp:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$//g" "$MODDIR/AdGuardHome.yaml" 83 | sed -E -i "${i} s/ \- tcp:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:53$//g" "$MODDIR/AdGuardHome.yaml" 84 | if [ "$i" = "$dns_53_n" ]; then 85 | iptables -t nat -F TOPHOME 86 | pkill 'AdGuardHome' 87 | sed -i 's/\[.*\]/\[ 主程序正在重启,dns,请稍等 \]/g' "$MODDIR/module.prop" 88 | exit 0 89 | fi 90 | fi 91 | done 92 | fi 93 | fi 94 | else 95 | iptables -t nat -F TOPHOME 96 | sed -i 's/\[.*\]/\[ 配置文件AdGuardHome.yaml不存在 \]/g' "$MODDIR/module.prop" 97 | exit 0 98 | fi 99 | port_testing="$(echo "$mode_conf" | egrep '^port_testing=' | sed -n 's/.*=//g;$p')" 100 | if [ "$port_testing" != "0" ]; then 101 | netstat_N="$(netstat -anp | egrep 'tcp|udp')" 102 | if [ -n "$netstat_N" ]; then 103 | AdHome_netstat="$(echo "$netstat_N" | egrep 'AdGuardHome' | wc -l)" 104 | if [ "$AdHome_netstat" = "0" ]; then 105 | iptables -t nat -F TOPHOME 106 | sed -i 's/\[.*\]/\[ AdHome端口未启动,请稍等!如果超过1分钟未启动,请升级AdHome到最新版,或可能与其它模块冲突,请逐个关闭排查,或到mode.conf文件关闭AdHome端口启动检测 \]/g' "$MODDIR/module.prop" 107 | exit 0 108 | fi 109 | fi 110 | fi 111 | private_dns_mode="$(settings get global private_dns_mode)" 112 | if [ "$private_dns_mode" = "opportunistic" -o "$private_dns_mode" = "hostname" ]; then 113 | settings put global private_dns_mode off 114 | fi 115 | NetworkAgentInfo="$(dumpsys connectivity | egrep 'NetworkAgentInfo\{' | egrep -v 'extra: ims')" 116 | NetworkAgentInfo_MW="$(echo "$NetworkAgentInfo" | egrep 'NetworkAgentInfo\{' | sed -n 's/,.*//g;s/\;.*//g;s/extra:.*//g;s/DnsAddresses: \[.*//g;p' | egrep -v 'VPN' | wc -l)" 117 | if [ "$NetworkAgentInfo_MW" = "0" ]; then 118 | exit 0 119 | fi 120 | Network="$(echo "$NetworkAgentInfo" | egrep 'type: WIFI|ni\{WIFI')" 121 | if [ -n "$Network" ]; then 122 | WIFI_Dns="$(echo "$Network" | egrep 'type: WIFI|ni\{WIFI' | sed -n 's/.* DnsAddresses: \[//g;s/\].*//g;s/ //g;p')" 123 | if [ ! -n "$WIFI_Dns" ]; then 124 | Network="$(echo "$NetworkAgentInfo" | egrep 'type: MOBILE|ni\{MOBILE')" 125 | fi 126 | else 127 | Network="$(echo "$NetworkAgentInfo" | egrep 'type: MOBILE|ni\{MOBILE')" 128 | fi 129 | port_yaml="$(cat "$MODDIR/AdGuardHome.yaml" | egrep '^ port: ' | sed -n 's/ port: //g;s/ //g;$p')" 130 | HostDns="$(echo "$Network" | egrep 'NetworkAgentInfo\{' | sed -n 's/.* DnsAddresses: \[//g;s/\].*//g;s/ //g;s/\///g;s/,/\\n/g;p')" 131 | HostDns_3="$(echo -e "$HostDns" | egrep '\.' | egrep -v ':' | sed -n '3p')" 132 | I_network="$(echo "$mode_conf" | egrep '^I_network=' | sed -n 's/.*=//g;$p')" 133 | if [ "$I_network" = "1" ]; then 134 | HostDns_1="$(echo -e "$HostDns" | egrep '\.' | egrep -v ':' | sed -n '1p')" 135 | elif [ "$I_network" = "2" ]; then 136 | HostDns_1="$(echo -e "$HostDns" | egrep '\.' | egrep -v ':' | sed -n '2p')" 137 | else 138 | if [ -n "$HostDns_3" ]; then 139 | HostDns_1="$HostDns_3" 140 | else 141 | HostDns_1="$(echo -e "$HostDns" | egrep '\.' | egrep -v ':' | sed -n '1p')" 142 | fi 143 | fi 144 | type="$(cat "$MODDIR/type")" 145 | mode="$(echo "$mode_conf" | egrep '^mode=' | sed -n 's/.*=//g;$p')" 146 | if [ "$mode" = "3" ]; then 147 | HostVPN="$(echo "$NetworkAgentInfo" | sed -n 's/,.*//g;s/\;.*//g;s/extra:.*//g;s/DnsAddresses: \[.*//g;p' | egrep 'VPN' | wc -l)" 148 | if [ "$HostVPN" != "0" ]; then 149 | natTOPHOME="$(iptables -t nat -n -L TOPHOME)" 150 | TOPHOME_HostDns="$(echo "$natTOPHOME" | egrep '10.35.53.10' | wc -l)" 151 | TOPHOME_HostVPN="$(echo "$natTOPHOME" | egrep '127.0.0.1:9' | wc -l)" 152 | if [ -n "$natTOPHOME" ]; then 153 | if [ "$TOPHOME_HostDns" != "3" -o "$TOPHOME_HostVPN" != "1" -o "$type" != "32" ]; then 154 | iptables -t nat -F TOPHOME 155 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p udp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 156 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p tcp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 157 | iptables -t nat -A TOPHOME -d 10.35.53.10 -p udp --dport 3553 -j DNAT --to-destination 127.0.0.1:9 158 | echo "32" > "$MODDIR/type" 159 | sed -i 's/\[.*\]/\[ 模式3+VPN 运行中 \]/g' "$MODDIR/module.prop" 160 | fi 161 | else 162 | iptables -t nat -N TOPHOME 163 | fi 164 | else 165 | B_DNS="$(echo "$mode_conf" | egrep '^B_DNS=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+$' | sed -n 's/.*=//g;$p')" 166 | if [ ! -n "$B_DNS" ]; then 167 | B_DNS='114.114.114.114:53' 168 | fi 169 | natTOPHOME="$(iptables -t nat -n -L TOPHOME)" 170 | TOPHOME_HostDns="$(echo "$natTOPHOME" | egrep '10.35.53.10' | wc -l)" 171 | TOPHOME_HostVPN="$(echo "$natTOPHOME" | egrep "$B_DNS" | wc -l)" 172 | if [ -n "$natTOPHOME" ]; then 173 | if [ "$TOPHOME_HostDns" != "3" -o "$TOPHOME_HostVPN" != "1" -o "$type" != "31" ]; then 174 | iptables -t nat -F TOPHOME 175 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p udp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 176 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p tcp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 177 | iptables -t nat -A TOPHOME -d 10.35.53.10 -p udp --dport 3553 -j DNAT --to-destination "$B_DNS" 178 | echo "31" > "$MODDIR/type" 179 | sed -i 's/\[.*\]/\[ 模式3 运行中 \]/g' "$MODDIR/module.prop" 180 | fi 181 | else 182 | iptables -t nat -N TOPHOME 183 | fi 184 | fi 185 | elif [ "$mode" = "2" -o ! -n "$HostDns_1" ]; then 186 | natTOPHOME="$(iptables -t nat -n -L TOPHOME)" 187 | TOPHOME_HostDns="$(echo "$natTOPHOME" | egrep '10.35.53.10' | wc -l)" 188 | TOPHOME_HostVPN="$(echo "$natTOPHOME" | egrep '127.0.0.1:9' | wc -l)" 189 | if [ -n "$natTOPHOME" ]; then 190 | if [ "$TOPHOME_HostDns" != "3" -o "$TOPHOME_HostVPN" != "1" -o "$type" != "21" ]; then 191 | iptables -t nat -F TOPHOME 192 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p udp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 193 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p tcp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 194 | iptables -t nat -A TOPHOME -d 10.35.53.10 -p udp --dport 3553 -j DNAT --to-destination 127.0.0.1:9 195 | echo "21" > "$MODDIR/type" 196 | sed -i 's/\[.*\]/\[ 模式2 运行中 \]/g' "$MODDIR/module.prop" 197 | fi 198 | else 199 | iptables -t nat -N TOPHOME 200 | fi 201 | else 202 | HostVPN="$(echo "$NetworkAgentInfo" | sed -n 's/,.*//g;s/\;.*//g;s/extra:.*//g;s/DnsAddresses: \[.*//g;p' | egrep 'VPN' | wc -l)" 203 | if [ "$HostVPN" != "0" ]; then 204 | natTOPHOME="$(iptables -t nat -n -L TOPHOME)" 205 | TOPHOME_HostDns="$(echo "$natTOPHOME" | egrep '10.35.53.10' | wc -l)" 206 | TOPHOME_HostVPN="$(echo "$natTOPHOME" | egrep '127.0.0.1:9' | wc -l)" 207 | if [ -n "$natTOPHOME" ]; then 208 | if [ "$TOPHOME_HostDns" != "3" -o "$TOPHOME_HostVPN" != "1" -o "$type" != "12" ]; then 209 | iptables -t nat -F TOPHOME 210 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p udp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 211 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p tcp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 212 | iptables -t nat -A TOPHOME -d 10.35.53.10 -p udp --dport 3553 -j DNAT --to-destination 127.0.0.1:9 213 | echo "12" > "$MODDIR/type" 214 | sed -i 's/\[.*\]/\[ 模式1+VPN 运行中 \]/g' "$MODDIR/module.prop" 215 | fi 216 | else 217 | iptables -t nat -N TOPHOME 218 | fi 219 | else 220 | natTOPHOME="$(iptables -t nat -n -L TOPHOME)" 221 | TOPHOME_HostDns="$(echo "$natTOPHOME" | egrep '10.35.53.10' | wc -l)" 222 | TOPHOME_HostVPN="$(echo "$natTOPHOME" | egrep "$HostDns_1:53" | wc -l)" 223 | if [ -n "$natTOPHOME" ]; then 224 | if [ "$TOPHOME_HostDns" != "3" -o "$TOPHOME_HostVPN" != "1" -o "$type" != "11" ]; then 225 | iptables -t nat -F TOPHOME 226 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p udp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 227 | iptables -t nat -A TOPHOME ! -d 10.35.53.10 -p tcp --dport 53 -j DNAT --to-destination "127.0.0.1:$port_yaml" 228 | iptables -t nat -A TOPHOME -d 10.35.53.10 -p udp --dport 3553 -j DNAT --to-destination "$HostDns_1:53" 229 | echo "11" > "$MODDIR/type" 230 | sed -i 's/\[.*\]/\[ 模式1 运行中 \]/g' "$MODDIR/module.prop" 231 | fi 232 | else 233 | iptables -t nat -N TOPHOME 234 | fi 235 | fi 236 | fi 237 | natOUTPUT="$(iptables -t nat -n -L OUTPUT)" 238 | nat_OUTPUT="$(echo "$natOUTPUT" | egrep 'TOPHOME' | wc -l)" 239 | nat_OUTPUT_1="$(echo "$natOUTPUT" | sed -n '3p' | egrep 'TOPHOME' | wc -l)" 240 | if [ -n "$natOUTPUT" ]; then 241 | if [ "$nat_OUTPUT" != "1" -o "$nat_OUTPUT_1" != "1" ]; then 242 | until [ "$nat_OUTPUT" = "0" ] ; do 243 | iptables -t nat -D OUTPUT -j TOPHOME 244 | nat_OUTPUT="$(( $nat_OUTPUT - 1 ))" 245 | done 246 | iptables -t nat -I OUTPUT -j TOPHOME 247 | fi 248 | fi 249 | ipv6OUTPUT="$(ip6tables -t filter -n -L OUTPUT)" 250 | ipv6_OUTPUT_tcp="$(echo "$ipv6OUTPUT" | egrep 'tcp' | egrep '53' | egrep 'REJECT' | wc -l)" 251 | ipv6_OUTPUT_udp="$(echo "$ipv6OUTPUT" | egrep 'udp' | egrep '53' | egrep 'REJECT' | wc -l)" 252 | ipv6_OUTPUT_n="$(echo "$ipv6OUTPUT" | sed -n '$p' | egrep 'udp' | egrep '53' | egrep 'REJECT' | wc -l)" 253 | if [ -n "$ipv6OUTPUT" ]; then 254 | if [ "$ipv6_OUTPUT_tcp" != "1" -o "$ipv6_OUTPUT_udp" != "1" -o "$ipv6_OUTPUT_n" != "1" ]; then 255 | ip6tables -t filter -D OUTPUT -p tcp --dport 53 -j DROP 256 | ip6tables -t filter -D OUTPUT -p udp --dport 53 -j DROP 257 | until [ "$ipv6_OUTPUT_tcp" = "0" ] ; do 258 | ip6tables -t filter -D OUTPUT -p tcp --dport 53 -j REJECT 259 | ipv6_OUTPUT_tcp="$(( $ipv6_OUTPUT_tcp - 1 ))" 260 | done 261 | until [ "$ipv6_OUTPUT_udp" = "0" ] ; do 262 | ip6tables -t filter -D OUTPUT -p udp --dport 53 -j REJECT 263 | ipv6_OUTPUT_udp="$(( $ipv6_OUTPUT_udp - 1 ))" 264 | done 265 | ip6tables -t filter -A OUTPUT -p tcp --dport 53 -j REJECT 266 | ip6tables -t filter -A OUTPUT -p udp --dport 53 -j REJECT 267 | fi 268 | fi 269 | #by topdalao 270 | #version=2024042200 271 | --------------------------------------------------------------------------------