Unbound非递归DNS配置问题:无法拒绝domain.com以外的域名查询
Unbound非递归DNS配置问题:无法拒绝domain.com以外的域名查询
我来帮你解决这个Unbound配置的问题——你想要让它只响应*.domain.com的查询,其他域名直接返回REFUSED,对吧?我看了你的现有配置,问题出在refuse_non_local的规则逻辑和local-zone的设置搭配上,下面给你一步步修正:
问题根源分析
你原来用的access-control: 0.0.0.0/0 refuse_non_local规则,它的作用是拒绝那些不属于本地权威域、转发域或存根域的查询,但Unbound默认会尝试递归解析其他域名(比如gmail.com),所以这条规则并没有直接阻断所有非domain.com的请求。另外,local-zone: "domain.com" transparent的设置会让Unbound优先尝试自己解析该域,和你想要的纯转发逻辑也有冲突。
正确配置方案
我们需要用白名单模式:只允许domain.com及其子域的查询被转发处理,所有其他域名直接返回REFUSED。下面是调整后的完整配置:
server: interface: a.b.c.d # 你的公网IP verbosity: 2 logfile: "unbound.log" log-queries: yes hide-identity: yes hide-version: yes # 允许信任的内网/回环客户端访问 access-control: 127.0.0.1/8 allow access-control: 192.168.0.0/24 allow # 允许公网客户端连接,但后续通过local-zone限制查询范围 access-control: 0.0.0.0/0 allow # 告诉Unbound不要默认处理domain.com,交给forward-zone转发 local-zone: "domain.com" nodefault # 通配规则:所有其他域名直接返回REFUSED local-zone: "." refuse forward-zone: name: "domain.com" forward-addr: 192.168.0.1 # 你的本地DNS服务器
配置说明
local-zone: "domain.com" nodefault:这条规则让Unbound放弃对domain.com的默认递归解析逻辑,完全交给下面的forward-zone处理查询请求。local-zone: "." refuse:这是一个全局通配规则,匹配所有未被前面规则覆盖的域名,直接返回REFUSED响应。Unbound的local-zone是按“最具体优先”的顺序匹配的,所以domain.com的查询不会被这条规则拦截。- 访问控制调整:保留对信任客户端的允许规则,同时允许公网客户端连接——因为我们已经通过local-zone限制了查询范围,不用担心非授权查询。
测试验证
配置修改后重启Unbound,然后用dig命令测试:
- 查询合法域名:
dig @a.b.c.d test.domain.com,应该能返回从192.168.0.1获取的正常解析结果。 - 查询非法域名:
dig @a.b.c.d gmail.com,应该返回类似** server can't find gmail.com: REFUSED的响应。
备注:内容来源于stack exchange,提问作者AAB
相关产品推荐
相关产品推荐

