自己架设dns服务器
- 云服务器
- 2025-08-19
- 11
前期准备
(一)硬件要求
| 设备类型 | 最低配置建议 | 备注 |
|---|---|---|
| 服务器主机 | CPU双核及以上,内存≥1GB,硬盘剩余空间≥500MB | 若部署规模较大或承担高并发解析任务,需相应提升配置 |
| 网络环境 | 具备公网IP地址(可选),稳定的局域网连接 | 公网IP可用于对外提供DNS服务,内网使用则只需局域网畅通即可 |
(二)软件选择
常见的开源DNS服务器软件有BIND(Berkeley Internet Name Domain)、Unbound、dnsmasq等,BIND功能最为强大且广泛应用,适合大多数场景;Unbound侧重于安全性和抗缓存投毒;dnsmasq轻量级,常用于小型网络环境,以下以BIND为例进行介绍。
安装BIND软件(以Linux系统为例)
(一)基于Debian/Ubuntu系统的安装步骤
- 更新软件包索引:打开终端,输入命令sudo apt update,确保获取最新的软件包信息。
- 安装BIND软件包:执行命令sudo apt install bind9 bind9utils bind9-doc,这里安装了主程序(bind9)、实用工具(bind9utils)以及文档(bind9-doc)。
- 验证安装结果:可以通过查看版本号来确认是否安装成功,命令为named -v,若能正常显示版本信息,则说明安装完成。
(二)基于CentOS/RHEL系统的安装步骤
- 启用EPEL源(可选但推荐):由于官方仓库中的软件版本可能不是最新的,添加EPEL源可以获得更多更新的软件包,执行命令sudo yum install epel-release。
- 安装BIND软件包:使用命令sudo yum install bind bind-utils bind-doc进行安装。
- 检查安装状态:同样使用named -v命令查看版本号,确认安装无误。
配置BIND服务器
(一)主配置文件路径及结构
在Linux系统中,BIND的主要配置文件通常是/etc/bind/named.conf,该文件包含了全局设置、区域定义等多个部分,基本结构如下:
options { ... // 全局选项设置,如监听端口、日志级别等 }; zone "example.com" { type master; file "/var/lib/bind/db.example.com"; ... // 针对特定域名区域的详细配置 };
(二)关键配置参数详解
| 参数名称 | 作用 | 示例取值及说明 |
|---|---|---|
| listen-on port
| 指定DNS服务器监听的网络接口和端口号,默认是53端口 | listen-on port 53 { any; }表示在所有网络接口上监听53端口 |
| directory “/var/lib/bind” | 设定工作目录,用于存放区域文件等相关数据 | 一般保持默认即可,也可根据实际情况修改 |
| allow-query { address_match_list }; | 控制哪些客户端可以向此服务器发起查询请求 | allow-query { localnet; }只允许本地网络内的主机进行查询;allow-query { any; }允许所有IP地址的主机查询 |
| recursion yes/no | 是否启用递归查询功能,开启后会代替客户端继续向上级DNS服务器查找未命中的结果 | 对于公共DNS服务器通常设为yes,企业内部专用服务器可根据需求设置为no以提高安全性 |
(三)创建区域文件
假设我们要为域名mydomain.com创建正向解析记录,对应的区域文件路径为/var/lib/bind/db.mydomain.com如下:
$TTL 86400 ; Time To Live in seconds @ IN SOA ns1.mydomain.com. admin.mydomain.com. ( 2024101001 ; Serial number (incrementing daily) 3600 ; Refresh interval in seconds 1800 ; Retry interval in seconds 604800 ; Expiry time in seconds 86400 ) ; Negative caching TTL in seconds ; Name servers authoritative for this zone ns1 IN NS ns1.mydomain.com. ns2 IN NS ns2.mydomain.com. ; Address records for hosts within the domain www IN A 192.168.1.100 mail IN A 192.168.1.101
$TTL定义了默认的生存时间;SOA记录了授权起始信息,包括主名称服务器、管理员邮箱(用点号替换@符号)、序列号等信息;NS记录指定了该区域的权威名称服务器;A记录则是将域名映射到具体的IP地址。


启动与测试DNS服务器
(一)启动服务
在Debian/Ubuntu系统中,使用命令sudo systemctl start bind9启动BIND服务;在CentOS/RHEL系统中,则为sudo systemctl start named,若要使服务开机自启,可将上述命令中的start替换为enable。
(二)测试方法
- 使用dig命令测试:在客户端终端输入dig @<dns_server_ip> mydomain.com,其中<dns_server_ip>是你架设的DNS服务器的IP地址,如果配置正确,应能看到返回的解析结果,包括IP地址、TTL值等信息。 ; <<>> DiG 9.16.1-Ubuntu <<>> @192.168.1.50 mydomain.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<opcode: QUERY, status: NOERROR, id: 65478 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 3 ... ;; ANSWER SECTION: mydomain.com. 86400 IN A 192.168.1.100
- 通过浏览器访问网站测试:将客户端设备的DNS设置指向你搭建的DNS服务器IP地址,然后尝试访问该域名下的网站(如http://www.mydomain.com),看是否能正常打开页面。
常见问题排查思路
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 无法解析任何域名 | 防火墙阻止了DNS服务的端口通信;配置文件错误导致服务未正常启动 | 检查防火墙规则,开放53端口;仔细检查配置文件语法是否正确,可使用named-checkconf命令进行校验 |
| 部分域名能解析,部分不能 | 对应不能解析的域名的区域文件不存在或配置有误;上游DNS服务器故障影响递归查询结果 | 确认相关区域文件已正确创建并放置在指定位置;更换上游DNS服务器地址试试 |
| 解析延迟较高 | 网络带宽不足;缓存设置不合理;过多的无效查询占用资源 | 优化网络环境,增加带宽;调整缓存策略,适当增大缓存大小;限制不必要的查询请求 |
相关问题与解答
如何更改DNS服务器监听的端口号?
答:在BIND的主配置文件/etc/bind/named.conf中,找到类似listen-on port 53 { any; }这样的行,将端口号改为你想要的值即可,但需要注意的是,修改端口后要确保客户端也知道使用新的端口来进行DNS查询,同时还要检查防火墙是否允许新端口的流量通过。
为什么我的电脑设置了自己搭建的DNS服务器却还是无法上网?
答:可能有以下几种原因及解决方法:一是检查电脑的网络设置中是否正确填写了DNS服务器的IP地址;二是确认DNS服务器上的区域文件是否正确配置了常用网站的域名解析记录;三是查看DNS服务器是否正常运行,可以通过查看服务状态(如systemctl status bind9或systemctl status named)来判断;四是排查是否存在网络连通性问题,比如服务器所在主机能否
