我们将以目前最流行、功能最强大的智能 DNS 软件 PowerDNS 为例,结合其权威服务器后端 pdns-recursor 和 geoip 插件,来完成一个完整的智能 DNS 部署。

方案概览
我们将实现以下功能:
- 主 authoritative DNS 服务器: 运行
pdns,管理我们的 DNS 区域文件。 - 智能解析能力: 使用
geoip插件,根据用户的地理位置返回不同的 IP 地址。 - 递归解析器: 运行
pdns-recursor,为内部网络或外部用户提供递归查询服务(可选,但推荐)。
第一步:环境准备
- 操作系统: 推荐使用 CentOS 7 或 CentOS 8/Stream,本教程以 CentOS 7 为例。
- 主机名: 设置一个清晰的主机名,
dns01.yourdomain.com。 - 防火墙: 确保防火墙允许 DNS 流量。
- TCP 和 UDP 的 53 端口。
- 如果配置了 Web 管理界面,还需要开放对应的端口(如 8081)。
- SELinux: 可以暂时设置为
permissive模式以简化安装和配置,生产环境建议正确配置 SELinux 策略。# 临时关闭 SELinux(重启后恢复) sudo setenforce 0
第二步:安装 PowerDNS
PowerDNS 提供了官方的 Yum 源,安装非常方便。
-
安装 EPEL 仓库:
sudo yum install -y epel-release
-
添加 PowerDNS 官方仓库:
(图片来源网络,侵删)sudo rpm -Uvh http://repo.powerdns.com/repo-files/powerdns-release-1-0.centos.noarch.rpm
-
安装 PowerDNS Authoritative Server 和 Recursor:
sudo yum install -y pdns pdns-recursor
-
安装 GeoIP 插件:
sudo yum install -y pdns-backend-geoip
第三步:配置 Authoritative Server (pdns)
这是智能 DNS 的核心。
-
编辑主配置文件:
(图片来源网络,侵删)sudo vi /etc/pdns/pdns.conf
-
关键配置项:
# 设置运行用户和组 launch=geoip geoip-database-files=/usr/share/GeoIP/GeoIP.dat,/usr/share/GeoIP/GeoIPv6.dat # 监听地址和端口 local-address=0.0.0.0 local-port=53 # 允许查询的网段 (0.0.0.0/0 表示允许所有,生产环境建议限制) allow-notify-from=127.0.0.1/32 allow-recursion=127.0.0.1/32, 10.0.0.0/8 # 允许本机和特定内网递归查询 # 如果只做权威服务器,不提供递归服务,可以设置为 allow-recursion= 来禁用 # Web 控制台配置(可选,但强烈推荐) api=yes api-key=your-super-secret-api-key webserver=yes webserver-address=0.0.0.0 webserver-port=8081 webserver-password=your-web-console-password
launch=geoip是关键,它告诉 PowerDNS 使用geoip后端来处理查询。 -
创建区域文件: 我们以
yourdomain.com为例。geoip后端需要一个特殊的区域文件格式。sudo mkdir -p /etc/pdns/zones sudo vi /etc/pdns/zones/yourdomain.com.zone
区域文件内容: 这个文件的结构与传统 BIND 不同,它更像是一个规则列表。
; 你的域名 yourdomain.com. { ; SOA 记录是必须的 yourdomain.com. SOA ns1.yourdomain.com. admin.yourdomain.com. ( 2025050101 ; serial 3600 ; refresh 1800 ; retry 604800 ; expire 86400 ; minimum ) ; NS 记录 yourdomain.com. NS ns1.yourdomain.com. yourdomain.com. NS ns2.yourdomain.com. ; A 记录 - 默认记录(当所有规则都不匹配时使用) www.yourdomain.com. 3600 A 192.0.2.100 ; --- 智能 DNS 规则开始 --- ; 规则1: 如果请求来自美国,返回美国服务器的 IP ; geostream: 条件匹配 ; record: 要返回的记录 www.yourdomain.com. geostream "country" "US" 3600 A 192.0.2.10 ; 规则2: 如果请求来自中国,返回中国服务器的 IP www.yourdomain.com. geostream "country" "CN" 3600 A 203.0.113.20 ; 规则3: 如果请求来自德国,返回德国服务器的 IP www.yourdomain.com. geostream "country" "DE" 3600 A 198.51.100.30 ; 规则4: 如果请求来自 AS12345 (某个ISP的ASN),返回特定IP ; 注意:这需要 recursor 支持 ASN 查询 www.yourdomain.com. geostream "asnum" "12345" 3600 A 198.51.100.40 ; 规则5: 如果请求来自 10.0.0.0/8 内网,返回内网IP ; geostream 也支持网络匹配 www.yourdomain.com. geostream "net" "10.0.0.0/8" 3600 A 172.16.0.50 }说明:
geostream是geoip后端的关键指令。- 第一个参数是匹配类型(
country,asnum,net)。 - 第二个参数是匹配值(国家代码、ASN号、IP网络)。
- 后面跟着的是标准的 DNS 记录类型、TTL 和值。
- PowerDNS 会按顺序检查规则,第一个匹配的规则生效,更具体的规则(如特定ASN)应放在通用规则(如国家)之前。
-
授权区域: 告诉 PowerDNS 去哪里加载这个区域文件。
sudo vi /etc/pdns/pdns.conf
在文件末尾添加:
zone=yourdomain.com zone-file=/etc/pdns/zones/yourdomain.com.zone
第四步:配置 Recursor (pdns-recursor)
Recursor 负责接收来自客户端的递归查询,并根据配置决定是否处理,在我们的场景中,它通常用于处理对 yourdomain.com 之外的域名的查询。
-
编辑配置文件:
sudo vi /etc/pdns-recursor/recursor.conf
-
关键配置项:
# 监听地址和端口 local-address=127.0.0.1 local-port=53 # 不允许来自外部的递归查询,只允许本机 allow-from=127.0.0.1/32 # 启用 DNSSEC 验证(推荐) dnssec=no # 初始可以设为 no,测试通过后改为 yes # 上游 DNS 服务器 forward-zones=.=8.8.8.8;8.8.4.4
local-address=127.0.0.1:让 Recursor 只监听本地回环地址,防止其被用作开放递归服务器。allow-from=127.0.0.1/32:只允许本机向它发起递归查询。forward-zones:将所有无法解析的请求转发到 Google 的公共 DNS。
第五步:启动和启用服务
-
启动并设置开机自启:
sudo systemctl enable pdns sudo systemctl start pdns sudo systemctl enable pdns-recursor sudo systemctl start pdns-recursor
-
检查服务状态:
sudo systemctl status pdns sudo systemctl status pdns-recursor
第六步:测试智能解析
这是最关键的一步,验证我们的智能 DNS 是否按预期工作。
-
使用
dig命令测试: 我们需要使用 指定我们的 DNS 服务器 IP 地址,并使用+short获得简洁的输出。-
假设你的 DNS 服务器 IP 是
0.113.1 -
测试默认规则:
# 从美国 IP 查询(可以使用代理或 VPS) dig @203.0.113.1 www.yourdomain.com +short # 预期输出: 192.0.2.10 (如果不在任何国家规则中,则会是默认的 192.0.2.100) # 从中国 IP 查询 dig @203.0.113.1 www.yourdomain.com +short # 预期输出: 203.0.113.20
-
测试国家规则: 你可以使用
geoiplookup工具来测试你的本机 IP 会被识别为哪个国家。# 安装 geoip 工具 sudo yum install -y geoip # 查看本机 IP 的国家 geoiplookup $(curl -s ipinfo.io/ip) # 假设输出是: IP: XX.XX.XX.XX -- Country: CN, CN # 用本机 IP 查询 dig @203.0.113.1 www.yourdomain.com +short # 预期输出: 203.0.113.20 (如果你的 IP 被识别为 CN)
-
-
通过 Web 控制台查看: 打开浏览器,访问
http://203.0.113.1:8081,输入你设置的webserver-password。- 在 "Lookup" 标签页,输入
www.yourdomain.com,你可以看到查询日志,确认哪个规则被命中。 - 在 "Zones" 标签页,可以管理你的区域。
- 在 "Lookup" 标签页,输入
第七步:部署 Secondary DNS (可选但推荐)
为了高可用性,你应该至少有一台 Secondary DNS 服务器,它从 Primary 服务器同步区域数据。
-
在 Secondary 服务器上:
- 安装
pdns(不需要recursor和geoip插件)。 - 配置
/etc/pdns/pdns.conf:launch=gmysql # 或其他你喜欢的后端,如 bind slave=yes master=203.0.113.1 # Primary DNS 的 IP allow-notify-from=203.0.113.1/32 # Primary 的 IP
- 确保 Secondary 能从 Primary 的 53 端口接收数据。
- 安装
-
在 Primary 服务器上:
- 修改
/etc/pdns/pdns.conf,允许 Secondary 的 notify:allow-notify-from=203.0.113.2/32 # Secondary 的 IP
- 修改
总结与进阶
- 我们通过安装
pdns和geoip插件,成功在 CentOS 上搭建了一个功能强大的智能 DNS 服务器,它可以根据请求者的地理位置返回不同的 IP,是实现 CDN 和负载均衡的理想选择。 - 进阶:
- 数据库后端: 对于大量域名,使用 MySQL 或 PostgreSQL 作为后端比管理大量文件更方便。
- GSLB (Global Server Load Balancing): 智能 DNS 是 GSLB 的一种实现方式,你还可以结合
latency或random等策略进行更复杂的负载均衡。 - DNSSEC: 为你的域名启用 DNSSEC,增强 DNS 安全性和可信度。
- 监控: 使用 Prometheus + Grafana 或 Zabbix 等工具监控 PowerDNS 的性能指标(查询量、缓存命中率等)。
希望这个详细的教程能帮助你成功部署 CentOS 智能 DNS!
