智能DNS,没接触过的人会觉得很复杂,实际就是一套差异化解析逻辑。传统DNS无论访客来源,统一返回同一个IP。智能DNS读取请求端IP,判断访客属于电信、联通,或是国内、海外,返回距离最近、线路质量更好的地址。搭建一套可用的智能DNS,技术门槛不算高,但部分配置忽略的话,做完之后效果和普通DNS差别不大。
方案选型要看要解决的问题。家庭或者小团队,想要加快DNS解析,顺带拦截广告,SmartDNS搭配AdGuard Home的Docker组合最简单。如果要给业务域名做多线路权威解析,BIND视图或者PowerDNS Lua脚本方案更合适,BIND稳定可靠,PowerDNS灵活性强,但配置会繁琐一些。

先说Docker部署方案。GitHub上smartdns-server-dockercompose项目,整合SmartDNS、AdGuard Home、CloudFlared和Redis四个组件,docker-compose up -d一条命令一次性拉起全部服务。SmartDNS负责分流,AdGuard Home做广告拦截并提供Web管理页面,CloudFlared提供加密DoH上游,Redis充当缓存。部署完成,AdGuard Home管理页面地址localhost:7353,SmartDNS的WebUI在7180,本机DNS设置成127.0.0.1:7353即可。这套方案优势是广告过滤和DNS加速整合,适合家用场景。但它属于本地DNS,不能对外提供权威解析,不能用来托管域名NS记录。
如果要给域名做智能解析,BIND视图功能是绕不开的。视图核心逻辑:定义多组ACL,每组ACL对应一段客户端IP,不同视图内,同一个域名配置独立区域文件。电信用户匹配电信视图,联通匹配联通视图,海外访客走默认视图。BIND配置文件内,每个视图设置match-clients匹配条件,区域文件路径分开。部署不能缺少GeoIP数据库。BIND只能依靠源IP匹配,需要维护IP段对应的运营商、地区信息,可以用MaxMind GeoIP库,或者手动维护ACL列表。ACL列表上手简单,但维护成本高,IP段变更就要手动修改。GeoIP库自动化程度更高,但数据库需要定期更新,新分配IP会出现识别错误。
EDNS Client Subnet对最终效果影响,甚至超过方案选型。智能DNS判断访客位置有两种方式,读取LocalDNS出口IP,或者读取DNS查询包携带的客户端子网信息。如果用户使用8.8.8.8这类公共LocalDNS,出口IP在美国,但用户本人在北京,智能DNS会判定访客在美国,返回美国节点IP,延迟大幅上涨。测试数据显示这类误判能增加150毫秒以上延迟。EDNS Client Subnet作用,是LocalDNS转发查询时带上用户真实子网,权威DNS拿到信息才能精准调度。但ECS不是所有LocalDNS都支持,国内运营商对ECS支持参差不齐。自建智能DNS,最好同时开启ACL匹配和ECS支持,双重保障。
PowerDNS是另一条可选路线。架构和BIND不一样,DNS逻辑处理和数据存储解耦,后端可以对接MySQL、PostgreSQL,也能通过Remote对接HTTP API。做地理智能解析,PowerDNS依靠Lua脚本实现复杂调度,可根据访客城市、ASN、网络质量动态选路。有电商案例,部署前37%日本用户解析到美国机房,平均响应320毫秒;部署完成后99.2%日本用户解析到东京节点,响应降到45毫秒以内。效果差距明显,代价是配置复杂度高于BIND,Lua脚本没有可视化界面,修改规则需要重启服务或者写热加载逻辑。
dnsdist属于PowerDNS生态,定位DNS负载均衡器。本身不做地理判断,但是可以在多个后端分发查询,支持基于ECS路由。dnsdist从2.0.0版本支持YAML配置,相比旧版纯Lua写法友好不少。典型部署方式,前端接收查询,后端挂载多个PowerDNS或者BIND实例,dnsdist依据来源IP或者ECS信息分发请求到不同后端池。搭建高可用架构,dnsdist几乎是标配组件。
配置写完之后,验证步骤不能省略。dig是基础工具,dig www.example.com @你的DNS服务器IP直接查看解析结果。想要确认智能解析是否生效,要用dig +subnet模拟不同来源查询。dig +subnet=电信IP段 www.example.com @你的DNS和联通IP段查询,两次返回IP应当不同,相同就说明匹配策略失效。还有常见坑,TTL设置过高。调试阶段TTL临时改成300秒,修改配置等待五分钟就能看到效果;TTL设86400的话,改动要等一天才会生效,排错很耗时间。
最后一个容易忽略的细节,国内运营商宽带对53端口管控严格,家庭宽带默认封禁53端口,报备之后才能开通。在家搭建对外提供服务的智能DNS,要么更换非标准端口,直接部署到云服务器。云服务器53端口不封禁,但要设置安全组,做好DDoS防护,开放DNS递归服务很容易被利用做放大攻击。搭建前想清楚服务的使用对象,优先级高于调参。