#config-file #domain #unbound #local-file #dns #file-path #url

nightly bin+lib rpz

基于 HTTP(S) URL 和配置文件中输入的本地文件路径的 RPZ 文件生成器

9 个版本 (1 个稳定版)

1.0.0 2024 年 8 月 22 日
0.6.1 2024 年 3 月 27 日
0.6.0 2024 年 2 月 14 日
0.2.0 2023 年 11 月 8 日

#623 in 命令行工具

MIT/Apache

300KB
6K SLoC

rpz

rpz 由一个二进制crate和一个 库crate 组成。二进制crate,rpz,是一个应用程序,它从URL和本地文件路径下载、解析和转换广告-(解)封锁文件,并将其转换为 响应策略区域 (RPZ) 文件。此RPZ文件可以被支持此类文件的DNS服务器使用(例如,Unbound)。

rpz 在行动

在此示例中,假设 unbound.conf(5) 已正确配置,并且在 rpz 部分设置了 namezonefile,分别设置为 ./var/unbound/db/rpz,并且在 remote-control 部分将 control-enable 设置为 true

[zack@laptop ~]$ cat<<EOF>/usr/local/etc/rpz/config
> timeout = 15
> rpz = "/var/unbound/db/rpz"
> local_dir = "/usr/local/etc/rpz/"
> adblock = [
      "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/BaseFilter/sections/adservers.txt",
      "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/BaseFilter/sections/adservers_firstparty.txt",
      "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/MobileFilter/sections/adservers.txt",
      "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/SpywareFilter/sections/mobile.txt",
      "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/SpywareFilter/sections/tracking_servers.txt",
      "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/SpywareFilter/sections/tracking_servers_firstparty.txt",
      "https://raw.githubusercontent.com/easylist/easylist/master/easylist/easylist_adservers.txt",
      "https://raw.githubusercontent.com/easylist/easylist/master/easylist/easylist_thirdparty.txt",
      "https://raw.githubusercontent.com/easylist/easylist/master/easyprivacy/easyprivacy_thirdparty.txt",
      "https://raw.githubusercontent.com/easylist/easylist/master/easyprivacy/easyprivacy_trackingservers.txt",
      "https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-agh.txt"
    ]
domain = ["https://www.stopforumspam.com/downloads/toxic_domains_whole.txt"]
hosts = ["https://raw.githubusercontent.com/AdAway/adaway.github.io/master/hosts.txt", "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts"]
wildcard = ["https://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock&showintro=0&mimetype=plaintext"]
> EOF
[zack@laptop ~]$ cat /usr/local/etc/rpz/unblock/domain/unbound
dpm.demdex.net # ESPN app on PS5 needs this.
[zack@laptop ~]$ rpz -f /usr/local/etc/rpz/config
unblock count written: 1
block count written: 271559
total lines written: 271560
domains parsed: 254147
comments parsed: 6629
blanks parsed: 4519
parsing errors: 24624
[zack@laptop ~]$ head -1 /var/unbound/db/rpz
dpm.demdex.net CNAME rpz-passthru.
[zack@laptop ~]$ tail -6 /var/unbound/db/rpz
stats.zone-telechargement CNAME .
*.stats.zone-telechargement CNAME .
5wh.co.zw CNAME .
www.5wh.co.zw CNAME .
pandi.co.zw CNAME .
www.pandi.co.zw CNAME .
[zack@laptop ~]$ unbound-control -q auth_zone_reload . && unbound-control -q flush_zone . && unbound-control -q flush_negative

广告-(解)封锁文件格式和编码

所有广告(解除)阻止文件必须是有效的UTF-8;然而,对于给定的域名,每个标签只能包含1-63个Unicode标量值,从以下集合中选择:!$&')+,-09;=_`AZaz{}~。标签必须由.分隔。文件中的域名必须由换行符或回车换行符分隔。域名长度必须小于254个字符,包括.标签分隔符。域名不区分大小写,大写字母被视为小写。域名不能是IPv4地址。

广告阻止风格

广告阻止风格规则构成的域名,要求该规则符合以下扩展正则表达式

^<ws>*(\|\|)?<ws>*<域名><ws>*\^?<ws>*$

其中,<domain>符合基于Domain的合法域名,基于ASCII_FIREFOX,并添加了以下要求:顶级域名必须是全部字母或至少长度为五个,并且以xn--开头,且不包含$<ws>是任意ASCII空白字符序列。

||开头的行将阻止所有子域名(即域名本身及其所有正确子域名);没有||,则仅阻止特定域名。

由于处理这些文件的保守性质,建议仍然使用应用级别的广告阻止器(例如,uBlock Origin)。广告阻止风格文件通常包含路径以及附加信息(例如,“第三方”)需要应用级别的信息来正确处理,因为这些条目将被rpz视为“解析错误”。

域名风格

仅域名规则构成的域名,要求该规则符合以下正则表达式

^<ws>*<域名><ws>*(#.*)?$

其中 <domain> 符合基于 ASCII_FIREFOX 的有效 Domain,顶级域名全部为字母或至少长度为五,并以 xn-- 开头,且 <ws> 是任意 ASCII 空白字符序列。

域名只代表自身(即,不会阻止正确的子域名)。

主机风格

hosts(5)-风格规则构建的域名,该规则必须符合以下扩展正则表达式

^<ws>*<IP><ws>+<域名><ws>*(#.*)?$

其中 <domain> 符合基于 ASCII_FIREFOX 的有效 Domain,顶级域名全部为字母或至少长度为五,并以 xn-- 开头,<ws> 是任意 ASCII 空白字符序列,而 <ip> 是以下之一

::::10.0.0.0127.0.0.1

域名只代表自身(即,不会阻止正确的子域名)。

通配符风格

通配符域名规则 构建的域名,该规则必须符合以下扩展正则表达式

^<ws>*(\*\.)?<域名><ws>*(#.*)?$

其中 <domain> 符合基于 ASCII_FIREFOX 的有效 Domain,顶级域名全部为字母或至少长度为五,并以 xn-- 开头,且 <ws> 是任意 ASCII 空白字符序列。

如果 domain*. 开头,则 domain 的长度必须小于 252,并且阻止所有正确的子域名——这 不包括 域名本身;否则,只阻止 domain

配置文件

必须通过 - 或 TOML 配置文件的绝对路径通过 -f/--file 命令行选项传递。如果传递了 -,则读取 stdin。该文件的格式必须符合以下

timeout = <timeout_in_seconds>
rpz = <absolute_file_path_to_the_RPZ_file_to_be_written>
local_dir = <absolute_file_path_to_the_directory_containing_local_files>
adblock = [<HTTP(S)_URLs>]
domain = [<HTTP(S)_URLs>]
hosts = [<HTTP(S)_URLs>]
wildcard = [<HTTP(S)_URLs>]

如果 rpz 不存在,则文件将写入 stdout。如果指定了 local_dir,则搜索 block/unblock/ 子目录;并且对于这些子目录中的每一个,都会搜索 adblock/domain/hosts/wildcard/ 子目录中的文件,这些文件将根据它们所在的目录进行解析。如果任何目录不存在,则不会出错。

如果指定了与数组相对应的事件密钥,则 URL 必须在整个数组中唯一。这些 URL 指向的文件被视为阻止文件(即,只允许在本地文件系统上使用解除阻止文件)。

代码段 timeout 表示允许 HTTP(S) 文件下载的最大 秒数。如果不存在或值为 0,则使用一小时的超时时间。如果指定的值超过一小时,则将其截断为一小时。

RPZ 文件

除非 stdout 是目标,否则将在配置文件中 rpz 值的同一位置创建一个临时 RPZ 文件,除了文件名后附加 tmp。成功后,此文件将被重命名为配置文件中的 rpz 值。此文件的包含内容是尽可能少的行数,其中取消阻止条目优先于阻止条目。

如果没有阻止条目或临时文件已存在,程序将中止。

选项

当通过 rpz 传递 -V/--version 时,将打印 rpz 的版本到 stdout。当通过 -h/--help 传递时,将打印有关程序及其选项的信息到 stdout。当通过 -f/--file 传递,并带有 - 或 TOML 配置文件的绝对路径时,rpz 将正常运行,并在完成后将摘要信息打印到 stdout。可以另外通过传递 -q/--quiet 并与 -f/--file 一起使用,以阻止将摘要信息打印到 stdout。当通过 -v/--verbose 传递,并带有 -f/--file 时,除了将正常的摘要信息打印到 stdout 外,还将打印到每个输入文件的详细摘要信息,包括错误类型和错误计数。

示例

如果 www.example.com*.example.comfoo.com 需要阻止,而 foo.example.com||foo.com 需要取消阻止,RPZ 文件将如下所示

foo.example.com CNAME rpz-passthru.
*.example.com CNAME .

成功后,将取消阻止、阻止和写入的总行数写入到 stdout,此外还将写入域名总数、注释、空白和解析错误总数。

错误

解析错误将被忽略;所有其他错误在程序中止之前写入到 stderr

状态

此软件包正在积极维护。

crate 仅在 x86_64-unknown-linux-gnux86_64-unknown-openbsd 目标上进行测试,但它们应该在平台上工作。

每晚都需要运行 rustc。一旦 BTreeMap 游标稳定下来[链接],稳定的 rustc 就可以工作了。在 OpenBSD-stable 上,只要在调用 cargo build --all-features --releasecargo install --all-features rpz 之前,将 RUSTC_BOOTSTRAP 以值 1 导出为 export,就可以使用 rust 端口。

依赖项

约 8–22MB
约 365K SLoC