如何提升Unbound视图中local-zones的配置行数限制?
解决Unbound 1.21视图中local-zone配置行数限制的问题
问题根因
你碰到的yacc stack overflow报错,是因为Unbound 1.21的配置解析器(基于yacc)在处理视图内大量重复的local-zone指令时,栈深度触碰到了硬编码的上限。旧版1.18的解析器栈配置更高,或者视图内指令的处理逻辑不同,所以没触发这个问题。
解决办法
1. 修改yacc栈大小重新编译
Unbound的配置解析逻辑写在parser.y文件里,你需要调整yacc的栈大小参数:
- 找到Unbound源码里的
parser.y,在文件开头加一行:
(默认栈大小可能是8192或16384,你报错在9994行,设为32768足够覆盖76k行的配置)%define parse.stacksize 32768 - 然后按OpenBSD的流程重新编译:
- 拿到对应版本的Unbound源码(可以从OpenBSD ports或者NLnetLabs获取)
- 解压后进目录,执行
./configure——记得用和系统捆绑版本一致的编译参数,用unbound -V就能查到原参数 - 依次跑
make和make install替换系统里的Unbound
2. 拆分配置到include文件(不用编译)
不想改源码编译的话,把视图里的local-zone指令拆到单独的包含文件里:
- 新建
refuse-zones.conf,把所有local-zone: "name" refuse都放进去 - 在视图里用
include: "refuse-zones.conf"代替直接写所有指令,这样解析器只处理一条include指令,不会触发栈溢出
3. 调整配置结构(临时 workaround)
你已经试过把local-zone移到顶级server:下能正常加载,如果这些拒绝规则是全局生效的,直接这么用就行;如果必须按视图区分,就把不同视图的规则分别拆到对应的include文件里。
补充说明
Unbound 1.21调整了配置解析器的逻辑,视图内的指令会被解析成嵌套结构,栈消耗比顶级指令高很多。这个硬编码的栈限制官方文档没提,只能通过改源码编译突破。
内容的提问来源于stack exchange,提问作者dfen
相关产品推荐
相关产品推荐

