如何提高 Unbound 对视图中本地区域的限制?

问题描述 投票:0回答:1

从 unbound 1.18 升级到 1.21 后,unbound 对视图中本地区域指令的数量有大约 10k 行的限制。如何提高此限制以匹配旧版本?

我将系统从 OpenBSD 7.5 升级到 7.6,这将捆绑的 unbound 从 1.18.1 升级到 1.21。新版本无法从旧配置启动,旧配置大约有76k行长。 (主要是视图中一长串

local-zone: "name" refuse
区域指令。)

~$ tail -4 unbound.conf
view: # censored DNS for all LAN clients
        name: "filter"
        view-first: yes
        include: "full-refuse_zones"
~$ unbound-checkconf unbound.conf
full-refuse_zones:9994: error: yacc stack overflow
read unbound.conf failed: 1 errors in configuration file
~$ wc unbound.conf full-refuse_zones
      82     168    1715 unbound.conf
   75987  227961 3196835 full-refuse_zones
   76069  228129 3198550 total

我仔细检查了旧版本是否正在加载完整配置,并确认 1.18 没有默默截断,而是正确处理了整个配置。在 1.21 上,在处理视图时,它会阻塞不到 10k 行。如果我将长长的

local-zone
列表移动到顶层,只需在包含上方添加
server:
指令,文件就会加载正常。

~$ tail -5 unbound-global.conf
view: # censored DNS for all LAN clients
        name: "filter"
        view-first: yes
server:
        include: "full-refuse_zones"
~$ unbound-checkconf unbound-global.conf
unbound-checkconf: no errors in unbound-global.conf
~$ wc unbound-global.conf full-refuse_zones
      83     169    1723 unbound-global.conf
   75987  227961 3196835 full-refuse_zones
   76070  228130 3198558 total

我还没有设法找到 yacc 在 NLnetLabs 或 OpenBSD 版本的 unbound 中抛出错误的位置,所以我不知道它在哪里被更改。我还没有在手册页或发行说明中找到提示。如果更改结果是硬编码限制,我可以从源代码构建。

openbsd unbound
1个回答
0
投票

解决方法:使用“view-first: no”和虚拟本地数据记录

背景:我使用 unbound 进行基于 DNS 的广告过滤,但我希望我的递归解析器保留未过滤的 DNS 供其自己使用。使用旧版本的 unbound,我会在视图中加载许多

local-zone
声明,并使用
access-control-view
首先引导客户端查找。我从未发现新版本在哪里限制了视图声明的大小,所以这种方法不起作用。

解决方案:将本地区域移至全局级别并添加未过滤的视图。这是显而易见的答案,但它一开始不起作用,因为没有本地数据的视图不会忽略全局本地数据[1]。我通过 TXT 记录解决了这个问题,该记录还告诉客户正在使用的视图;当

view-first: no
生效时,此记录足以覆盖所有顶级本地数据。

我使用额外的环回地址 127.0.0.2 和以下 unbound.conf 片段配置了我的解析器机器。 “include”文件由约 70k 本地区域组成,与我用于包含在视图中的版本没有变化;现在它包含在顶层并且解析没有错误。

access-control: 127.0.0.2/32 allow
access-control-view: 127.0.0.2/32 "unfiltered"
local-data: 'which-view.home. IN TXT "global local-data"'
include: "/var/unbound/etc/filter"
view:
        name: "unfiltered"
        view-first: no
        local-data: 'which-view.home. IN TXT "uncensored view"'

过滤广告服务器查询的默认行为演示:

~$ dig -b 127.0.0.1 which-view.home TXT +short
"global local-data"
~$ dig -b 127.0.0.1 doubleclick.net +comments +noedns

; <<>> dig 9.10.8-P1 <<>> -b 127.0.0.1 doubleclick.net +comments +noedns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 569
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;doubleclick.net.               IN      A

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jan 07 11:02:26 EST 2025
;; MSG SIZE  rcvd: 33

从其他源地址查询时未过滤行为的演示:

~$ dig -b 127.0.0.2 which-view.home TXT +short
"uncensored view"
~$ dig -b 127.0.0.2 doubleclick.net +comments +noedns

; <<>> dig 9.10.8-P1 <<>> -b 127.0.0.2 doubleclick.net +comments +noedns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56550
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;doubleclick.net.               IN      A

;; ANSWER SECTION:
doubleclick.net.        600     IN      A       142.251.40.110

;; Query time: 52 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jan 07 11:02:59 EST 2025
;; MSG SIZE  rcvd: 49

[1] https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html#view-options

© www.soinside.com 2019 - 2024. All rights reserved.