2.5 KiB
2.5 KiB
问题分析
-
问题现象:规则更新后,规则没有生效。用户添加或删除规则后,DNS服务器仍然使用旧的规则进行域名屏蔽。
-
问题根源:
- 在
addDomainRule方法中,当添加一个域名规则时,它会为该域名的所有子域名也添加规则。例如,添加example.com规则时,会同时添加example.com和com规则。 - 但是,在
RemoveRule方法中,当删除一个域名规则时,它只删除了指定的域名规则,而没有删除为子域名添加的规则。 - 这导致即使删除了主规则,子域名规则仍然存在,因此规则仍然生效。
- 在
-
具体问题:
- 当添加
||test.example.com规则时,addDomainRule方法会添加test.example.com和example.com两个规则。 - 当删除
||test.example.com^规则时,RemoveRule方法只会删除test.example.com规则,而不会删除example.com规则,因此example.com仍然会被屏蔽。 - 此外,
RemoveRule方法在处理通配符和URL匹配规则时,也没有正确处理子域名规则的删除。
- 当添加
修复方案
-
修复
RemoveRule方法:- 当删除一个域名规则时,同时删除为该域名的所有子域名添加的规则。
- 确保删除规则时,同时更新所有相关映射,包括主规则和子域名规则。
-
验证修复效果:
- 启动DNS服务器
- 添加一条域名规则,例如
||test.example.com - 验证该规则及其子域名规则都被正确添加
- 删除该规则
- 验证该规则及其所有子域名规则都被正确删除
- 验证DNS服务器不再使用该规则进行域名屏蔽
实现步骤
-
修改
shield/manager.go文件中的RemoveRule方法:- 在删除域名规则时,添加删除所有相关子域名规则的逻辑
- 确保删除规则时,同时更新所有相关映射
-
测试修复后的功能:
- 启动DNS服务器
- 访问Web界面,添加一条本地规则,例如
||test.example.com - 验证该规则被正确添加
- 点击删除按钮删除该规则
- 验证该规则及其所有子域名规则都被正确删除
- 验证DNS服务器不再使用该规则进行域名屏蔽
预期结果
- 用户添加规则后,规则立即生效
- 用户删除规则后,规则立即失效
- 规则更新后,DNS服务器使用最新的规则进行域名屏蔽
- 本地规则文件被正确更新,添加和删除的规则都能正确反映在文件中