授权DNS服务器可以根据递归DNS服务器发送的EDNS Client Subnet(ECS)中的值,返回不同的结果。如果客户端是通过内网IP向递归DNS服务器发起查询的,而且递归DNS服务器发出的递归查询使用的公网IP跟客户端使用的公网IP不是一个地区时,就无法给客户端提供一个最优的解析结果了。
PowerDNS Recurse 4.2增加了一个设置“ecs-add-for”,可以指定哪些subnet允许作为ECS的值,对于不允许作为ECS值的subnet,将会取ecs-scope-zero-address的值作为ECS的值。所以通过这两个设置可以为内网客户端设定一个默认的ECS值。
配置文件内容大概如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 允许来自任何地方的查询 allow-from=0.0.0.0/0, ::/0 # 这里面“!”开头的项是排除项,排除了内网IP ecs-add-for=0.0.0.0/0, ::/0, !127.0.0.0/8, !10.0.0.0/8, !100.64.0.0/10, !169.254.0.0/16, !192.168.0.0/16, !172.16.0.0/12, !::1/128, !fc00::/7, !fe80::/10 # 被ecs-add-for排除后应取的ECS值,改成合适的公网IP ecs-scope-zero-address=1.1.1.1 # 这里告诉PowerDNS Recursor发送到任何授权DNS服务器的请求都应该附带ECS edns-subnet-whitelist=0.0.0.0/0 # PowerDNS Recursor监听的IP local-address=127.0.0.1, 172.20.0.2 # PowerDNS Recursor向外发出查询使用的源IP,可以利用此项做策略路由,无特别需求一般不用设置此值 query-local-address=172.20.0.3 |
配置生效后,对PowerDNS Recursor发出的查询进行抓包,可以发现来自内网的查询,Client Subnet的值是1.1.1.1,而有公网IP的客户端查询,将会是客户端本身的公网IP。