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 命令行工具
300KB
6K SLoC
rpz
rpz
由一个二进制crate和一个 库crate 组成。二进制crate,rpz
,是一个应用程序,它从URL和本地文件路径下载、解析和转换广告-(解)封锁文件,并将其转换为 响应策略区域 (RPZ) 文件。此RPZ文件可以被支持此类文件的DNS服务器使用(例如,Unbound)。
rpz 在行动
在此示例中,假设 unbound.conf(5)
已正确配置,并且在 rpz
部分设置了 name
和 zonefile
,分别设置为 .
和 /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标量值,从以下集合中选择:!
、$
、&
、'
、)
、+
、,
、-
、0
至9
、;
、=
、_
、`
、A
至Z
、a
至z
、{
、}
和~
。标签必须由.
分隔。文件中的域名必须由换行符或回车换行符分隔。域名长度必须小于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>
是以下之一
::
、::1
、0.0.0.0
或 127.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.com
和 foo.com
需要阻止,而 foo.example.com
和 ||foo.com
需要取消阻止,RPZ 文件将如下所示
foo.example.com CNAME rpz-passthru.
*.example.com CNAME .
成功后,将取消阻止、阻止和写入的总行数写入到 stdout
,此外还将写入域名总数、注释、空白和解析错误总数。
错误
解析错误将被忽略;所有其他错误在程序中止之前写入到 stderr
。
状态
此软件包正在积极维护。
crate 仅在 x86_64-unknown-linux-gnu
和 x86_64-unknown-openbsd
目标上进行测试,但它们应该在平台上工作。
每晚都需要运行 rustc
。一旦 BTreeMap
游标稳定下来[链接],稳定的 rustc
就可以工作了。在 OpenBSD-stable 上,只要在调用 cargo build --all-features --release
或 cargo install --all-features rpz
之前,将 RUSTC_BOOTSTRAP
以值 1
导出为 export
,就可以使用 rust
端口。
依赖项
约 8–22MB
约 365K SLoC