Skip to content

无插件广告拦截功能设置方案

Aethersailor edited this page Feb 19, 2025 · 91 revisions

介绍

按照本项目的设置方案,只使用 OpenClash 一个插件。由于中国大陆域名绕过了 OpenClash 内核,因此无法依靠 OpenClash 的规则来完成广告拦截。

利用 OpenClash 的“插件设置”>“开发者选项”功能,让 OpenClash 每次启动时,运行脚本为 Dnsmasq 拉取相应的规则文件,并清理 DNS 缓存使规则生效,从而实现了无需第三方插件的广告拦截和隐私防护功能。

该功能可在 OpenClash 的日志中输出相应的信息,以便使用者观察脚本运行状态。

注意:不要对 DNS 广告拦截的网页广告拦截效果抱有太大的期望,针对网页广告效果最好的拦截方式永远是浏览器插件

也没有必要去用广告拦截测试网站对本方案的效果进行测试,毕竟本方案只是针对域名的 DNS 拦截,不可能在测试网站取得高分。

DNS 拦截除了可以拦截广告,也可以在一定程度上实现隐私保护。其服务对象更多的是面向 App 以及其他一些设备,如智能家居设备等。

注意:2025年2月6日更新,使用子进程功能改写脚本,已重新适配当前 OpenClash 最新 Dev 版本 v0.46.071,同时兼容 master 版本。兼容 OpenWrt/ImmortalWrt 和 LEDE。

以下内容均以 OpenClash Dev 版本为示例,旧版本可能有所不同,不保证可用,建议升级到最新版 OpenClash,Master 或 Dev 均可。


相关规则

维护者在技术上始终保持中立态度,以下规则的引用的唯一依据是维护者的个人喜好,对于上游规则涉及的一些争议,不存在任何立场

如果你认为不应当使用某些规则,请自行修改代码部分替换成你喜欢的规则。

本项目引用了以下广告过滤规则:

广告过滤规则:

1. anti-AD
一款流行的广告过滤规则,致力于成为中文区命中率最高的广告过滤列表,实现精确的广告屏蔽和隐私保护。

2. 原版 adblockfilters
一款覆盖全面的广告过滤规则合集,其上游包含了大量常见的规则,每隔8小时更新一次,带有去重和去无效域名机制。

3. adblockfilters-modified
本项目维护者在原版 adblockfilters 的分支上维护的增强版,在原版规则的基础上,增加了 anti-ad、OISD、PeterLowe 等流行的规则作为上游,保留了原项目的去重和去无效域名机制,30万+条规则有效治疗规则焦虑症。

4. 秋风广告规则
开源社区中最优秀的广告过滤器列表之一,实现了最优秀的广告拦截、隐私保护和流量节省。

anti-ad 规则上游已包含了秋风广告规则

adblockfilters 规则上游已包含了秋风广告规则

adblockfilters-modified 规则上游已包含了 adblockfilters、anti-ad 和秋风广告规则

所以,不用琢磨如何重复添加,照抄即可。

规则行数:adblockfilters-modified > adblockfilters > anti-ad > 秋风广告规则

Hosts 加速规则:

1. Github520
在 hosts 添加 Github 相关的条目,解决未开启科学上网时的 Github 访问问题

推荐使用 adblockfilters 规则 + Github520

本设置方案只是对上游规则进行一个调用,能过滤哪些广告,误拦截哪些内容,取决于上游规则,与本项目无关。任何规则相关的问题,不管是遗漏还是误杀,请去上游规则仓库反馈。


其他说明

关于性能

理论上来说,规则行数和覆盖率以及误杀率成正比,和性能成反比。

维护者在 x86 以及 arm 设备上使用了 adblockfilters-modified 规则,体感上并未发现域名解析速度有明显的变慢。

注意:如果使用广告拦截功能后,访问网页有明显变慢,说明设备性能不够,请弃用该功能。

无法使用?

注意:项目维护者没有使用 LEDE 固件的设备,若发现脚本有问题请及时反馈。

广告拦截设置失败的原因有很多,包括但不限于固件差异、网络波动等情况,维护者没有精力从脚本层面解决这些问题,也不可能去解决,因为这些问题会无穷无尽的多。

脚本已经内置了输出日志功能,如果广告拦截规则拉取失败,请自己根据日志内容进行排查和调试,必要时自行修改脚本内容,例如自行修改反代地址。

正常情况下无需修改,小白用户如需修改,建议借助 ChatGPT 或者 DeepSeek 进行。

只接受可以明确指出脚本错误的反馈,不接受“我怎么用不了”之类的无效反馈。


图片仅供示意 图中代码为早期简陋版本,和当前最新代码不同,请勿照抄


设置前提

必须关闭 Dnsmasq 自带的 DNS 重定向功能

该功能位于 网络 > DHCP/DNS 页面中,务必关闭

若不关闭,会引起 DNS 解析问题,并会导致本方案的广告拦截设置无法拦截国外域名。

LEDE 源码固件无此选项,忽略即可。

如果你搭配了其他 DNS 插件使用,必须保证 dnsmasq 处于整个解析流程中,任何未经过 dnsmasq 的解析请求均无法被广告过滤规则过滤。


添加广告拦截规则拉取指令

以下添加方式分为 1.一键添加 和 2.手动添加,任选其一

看不懂上面这句话的先去医院看病。


  • 一键添加广告拦截规则

SSH 连接 OpenWrt,复制以下命令执行,跟随脚本提示选择要添加的规则即可。

curl -sSL https://github.boki.moe/https://raw.githubusercontent.com/Aethersailor/Custom_OpenClash_Rules/refs/heads/main/shell/edit_custom_firewall_rules.sh -o edit_custom_firewall_rules.sh && chmod +x edit_custom_firewall_rules.sh && ./edit_custom_firewall_rules.sh

能用就用不能用就拉倒。

SSH 怎么用命令怎么用脚本为什么下载不下来之类的弱智问题请勿提问。


  • 手动添加广告拦截规则

原则上本项目所有内容都会考虑到不会使用 SSH 的小白玩家,因此同样提供在 web 页面中手工添加去广告功能的方法,全程仅需复制粘贴和点击鼠标。

根据个人需求手工修改开发者选项的说明如下:

注意:“开发者选项”中自带的内容,不要删除!以下内容需要添加在原有内容的 exit 0 之前

注意:“开发者选项”插件设置 > 开发者选项,不是 覆写设置>开发者选项,不要搞错位置了!

此处提供多个版本的规则拉取脚本模板,任选其一复制粘贴即可:

  1. anti-ad + Github520
  2. 原版 adblockfilters + Github520
  3. adblockfilters-modified + Github520
  4. 秋风广告规则 + Github520
  5. 不添加广告过滤规则,仅添加 Github520

注意:anti-ad、原版 adblockfilters、adblockfilters-modified 规则的上游均已包含秋风广告规则,无需重复添加。

1. anti-AD 广告过滤规则 + Github 520 加速规则

anti-AD 是一款比较有名的广告过滤规则,规则体积适中。

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检查 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 anti-AD 广告过滤规则,规则体积较大,请耐心等候…"
    mkdir -p /tmp/dnsmasq.cfg01411c.d
    curl -sSL -4 --retry 5 --retry-delay 1 "https://github.boki.moe/https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/adblock-for-dnsmasq.conf" -o /tmp/dnsmasq.cfg01411c.d/anti-ad-for-dnsmasq.conf 2> /tmp/anti-ad-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] anti-AD 规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] anti-AD 规则拉取失败,查看 /tmp/anti-ad-curl.log 获取详细信息。"
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 GitHub520 加速规则…"
    sed -i '/# GitHub520 Host Start/,/# GitHub520 Host End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload
    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

你也可以将 anti-AD 规则替换成任何支持 Dnsmasq 格式的广告规则,比如 217heidai/adblockfilters 规则。

修改代码,替换下载链接和 .conf 文件的命名即可。

2. 原版 adblockfilters 去广告规则 + Github 520 加速规则

adblockfilters 同样是一款优秀的去广告规则,其上游包含了大量的优秀的规则,且带有去重和去无效域名机制,每8小时更新一次。

但是该规则体积较为庞大,条目数大概是二十多万条,建议自行取舍是否使用该规则。

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检测 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 adblockfilters 广告过滤规则,规则体积较大,请耐心等候…"
    mkdir -p /tmp/dnsmasq.cfg01411c.d
    curl -sSL -4 --retry 5 --retry-delay 1 "https://github.boki.moe/https://raw.githubusercontent.com/217heidai/adblockfilters/main/rules/adblockdns.txt" -o /tmp/dnsmasq.cfg01411c.d/adblockfilters-for-dnsmasq.conf 2> /tmp/adblockfilters-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] adblockfilters 规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] adblockfilters 规则拉取失败,查看 /tmp/adblockfilters-curl.log 获取详细信息。"
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 GitHub520 加速规则…"
    sed -i '/# GitHub520 Host Start/,/# GitHub520 Host End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload
    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

3. adblockfilters-modified 去广告规则 + Github 520 加速规则

adblockfilters-modified 是本项目维护者在原版 adblockfilters 广告过滤规则的基础上增加了 anti-ad 等更多上游规则的内容合并而来,经过原版的去重和去无效域名机制处理。

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检测 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 adblockfilters-modified 广告过滤规则,规则体积较大,请耐心等候…"
    mkdir -p /tmp/dnsmasq.cfg01411c.d
    curl -sSL -4 --retry 5 --retry-delay 1 "https://github.boki.moe/https://raw.githubusercontent.com/Aethersailor/adblockfilters-modified/refs/heads/main/rules/adblockdnsmasq.txt" -o /tmp/dnsmasq.cfg01411c.d/adblockfilters-modified-for-dnsmasq.conf 2> /tmp/adblockfilters-modified-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] adblockfilters-modified 规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] adblockfilters-modified 规则拉取失败,查看 /tmp/adblockfilters-modified-curl.log 获取详细信息。"
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 GitHub520 加速规则…"
    sed -i '/# GitHub520 Host Start/,/# GitHub520 Host End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload
    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

4. 秋风广告规则 + Github520 加速规则

有些人可能对 anti-AD 规则比较反感, 但又觉得 adblockfilters 太过于庞大,可以使用 秋风广告规则,一款优秀的轻量广告拦截规则

注意:没添加反馈,不会提示成功还是失败。

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检测 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 秋风广告规则…"
    curl -sSL -4 --retry 5 --retry-delay 1 https://github.boki.moe/https://raw.githubusercontent.com/TG-Twilight/AWAvenue-Ads-Rule/main/Filters/AWAvenue-Ads-Rule-hosts.txt | \
    sed '/127.0.0.1 localhost/d; /::1 localhost/d; 1s/^/# AWAvenue-Ads-Rule Start\n/; $s/$/\n# AWAvenue-Ads-Rule End/' >> /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 GitHub520 加速规则…"
    sed -i '/# GitHub520 Host Start/,/# GitHub520 Host End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload
    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

需要注意的是,hosts 规则必须清楚旧内容再添加新内容,脚本已包含此功能。

如果你换用了其他的 hsots 规则,请自行修改 sed 有关的命令以使其可以正确的修改 hosts 文件的内容,千万不能直接复制!

以上广告拦截规则请任选其一,因为 anti-AD 和 adblockfilters 的上游规则均已经包含了秋风广告规则

5. 仅添加 Github 加速规则

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检测 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 GitHub520 加速规则…"
    sed -i '/# GitHub520 Host Start/,/# GitHub520 Host End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    mkdir -p /tmp/dnsmasq.cfg01411c.d
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload
    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

自行修改规则下载顺序

如果你的网络环境过于奇葩,无法访问任何 Github 相关的 CDN,但是可以通过 Github520 访问 Github,那么请将 Github520 规则的拉取指令放在前,广告拦截规则的拉取指令放在后,并且在中间加上重启 Dnsmasq 的命令,使 Github520 规则生效后再执行广告拦截规则的拉取。(感谢 AKA-Cigma 提供)

此处以 anti-AD + Github520 组合为例:

具体命令见下方示例:

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检测 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    mkdir -p /tmp/dnsmasq.cfg01411c.d
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 anti-AD 广告过滤规则…"
    rm -f /tmp/dnsmasq.d/anti-ad-for-dnsmasq.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/anti-ad-for-dnsmasq.conf

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 anti-AD 广告过滤规则,规则体积较大,请耐心等候…"
    curl -sSL -4 --retry 5 --retry-delay 1  "https://gcore.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblockdns.txt" -o /tmp/dnsmasq.cfg01411c.d/anti-ad-for-dnsmasq.conf 2> /tmp/anti-ad-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] anti-AD 规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] anti-AD 规则拉取失败,查看 /tmp/anti-ad-curl.log 获取详细信息。"
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

注意以上所有的命令都是示例,请根据自身网络环境修改。如果你是纯小白,无法确定自己的网络环境能否访问以上内容,也不了解各种广告拦截规则的差异,那么请直接按照下方“最终效果”中的内容修改你的“开发者选项”即可。

最终效果

以 adblockfilters-modified 和 Github520 规则为例

添加完 修改版 adblockfilters-modified 和 Github520 规则后,开发者选项中的内容应当如下:

#!/bin/sh
. /usr/share/openclash/log.sh
. /lib/functions.sh

# This script is called by /etc/init.d/openclash
# Add your custom firewall rules here, they will be added after the end of the OpenClash iptables rules

LOG_OUT "Tip: Start Add Custom Firewall Rules..."

# ==============以下是广告过滤规则拉取脚本=================
(
    MAX_WAIT_TIME=30
    WAIT_INTERVAL=2
    elapsed_time=0

    if /etc/init.d/openclash status | grep -q "Syntax:"; then
        LOG_OUT "[广告过滤规则拉取脚本] 等待 10 秒以确保 OpenClash 已启动..."
        sleep 10
    else
        while ! /etc/init.d/openclash status | grep -q "running"; do
            if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then
                LOG_OUT "[广告过滤规则拉取脚本] 未能在 30 秒内检测到 OpenClash 运行状态,脚本已停止运行..."
                exit 1
            fi
            LOG_OUT "[广告过滤规则拉取脚本] 正在检测 OpenClash 运行状态,请稍后..."
            sleep $WAIT_INTERVAL
            elapsed_time=$((elapsed_time + WAIT_INTERVAL))
        done
        LOG_OUT "[广告过滤规则拉取脚本] 检测到 OpenClash 正在运行,10 秒后开始拉取规则..."
        sleep 10
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除广告过滤规则…"
    rm -f /tmp/dnsmasq.d/*ad*.conf
    rm -f /tmp/dnsmasq.cfg01411c.d/*ad*.conf
    sed -i '/# AWAvenue-Ads-Rule Start/,/# AWAvenue-Ads-Rule End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 adblockfilters-modified 广告过滤规则,规则体积较大,请耐心等候…"
    mkdir -p /tmp/dnsmasq.cfg01411c.d
    curl -sSL -4 --retry 5 --retry-delay 1 "https://github.boki.moe/https://raw.githubusercontent.com/Aethersailor/adblockfilters-modified/refs/heads/main/rules/adblockdnsmasq.txt" -o /tmp/dnsmasq.cfg01411c.d/adblockfilters-for-dnsmasq.conf 2> /tmp/adblockfilters-modified-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] adblockfilters-modified 规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] adblockfilters-modified 规则拉取失败,查看 /tmp/adblockfilters-modified-curl.log 获取详细信息。"
    fi

    LOG_OUT "[广告过滤规则拉取脚本] 清除已有的 GitHub520 加速规则…"
    sed -i '/# GitHub520 Host Start/,/# GitHub520 Host End/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 拉取最新的 GitHub520 加速规则…"
    curl -sSL -4 --retry 5 --retry-delay 1 "https://raw.hellogithub.com/hosts" >> /etc/hosts 2> /tmp/github520-curl.log

    if [ $? -eq 0 ]; then
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取成功!"
    else
        LOG_OUT "[广告过滤规则拉取脚本] GitHub520 加速规则拉取失败,查看 /tmp/github520-curl.log 获取详细信息。"
    fi

    sed -i '/^$/d' /etc/hosts
    sed -i '/!/d' /etc/hosts

    LOG_OUT "[广告过滤规则拉取脚本] 清理 DNS 缓存…"
    /etc/init.d/dnsmasq reload
    LOG_OUT "[广告过滤规则拉取脚本] 脚本运行完毕!"

) &
# ==============广告过滤规则拉取脚本结束==============

exit 0

抛砖引玉

以上方法的本质上就是利用 dnsmasq 加载对应格式的规则文件实现去广告,你也可以不使用 OpenClash 的开发者选项,而使用其他方法(例如计划任务)通过指令拉取去广告规则并调用 dnsmasq 实现去广告。

hosts 去广告同理。