在Linux系统中架设DNS(域名系统)服务器,通常使用BIND(Berkeley Internet Name Domain)软件,它是目前最广泛使用的DNS服务器软件之一,以下以Ubuntu/Debian和CentOS/RHEL系统为例,详细说明DNS架设的完整步骤。

环境准备
-
系统要求
- 推荐使用稳定版的Linux发行版(如Ubuntu 20.04+、CentOS 8+)。
- 服务器需配置静态IP地址(192.168.1.100),确保网络连通性。
- 关闭防火墙或开放DNS相关端口(TCP/UDP 53),若使用
firewalld(CentOS)执行:firewall-cmd --permanent --add-service=dns firewall-cmd --reload
若使用
ufw(Ubuntu)执行:ufw allow 53/tcp ufw allow 53/udp
-
安装工具
安装bind9(Ubuntu/Debian)或bind(CentOS/RHEL)及管理工具:- Ubuntu/Debian:
apt update && apt install -y bind9 bind9utils bind9-doc
- CentOS/RHEL:
yum install -y bind bind-utils
- Ubuntu/Debian:
BIND核心配置文件
BIND的主要配置文件位于/etc/bind/(Ubuntu)或/etc/named/(CentOS),核心文件包括:
named.conf:主配置文件,定义全局参数和区域引用。- 区域文件:存储具体域名解析记录(如正向区域、反向区域)。
编辑主配置文件named.conf
备份原文件后编辑:
cp /etc/bind/named.conf /etc/bind/named.conf.bak vim /etc/bind/named.conf
关键配置如下:
directory "/var/cache/bind"; # 区域文件存放目录
allow-query { any; }; # 允许查询的客户端(any表示允许所有,可限制为内网IP,如192.168.1.0/24)
recursion yes; # 允许递归查询
forwarders { 8.8.8.8; 1.1.1.1; }; # 上游DNS服务器(可选,用于转发无法解析的请求)
};
# 定义正向区域(示例:example.com)
zone "example.com" {
type master; # 主DNS服务器
file "/etc/bind/db.example.com"; # 区域文件路径
allow-update { none; }; # 禁止动态更新(安全考虑)
};
# 定义反向区域(示例:192.168.1.0/24)
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};```
#### **2. 创建区域文件**
**正向区域文件**(`/etc/bind/db.example.com`):
```bash
cp /etc/bind/db.local /etc/bind/db.example.com
vim /etc/bind/db.example.com
``` 示例:
```;
; BIND data file for example.com
;
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.com.
@ IN A 192.168.1.100
ns1 IN A 192.168.1.100
www IN A 192.168.1.101
mail IN A 192.168.1.102
说明:

SOA记录:起始授权机构,包含序列号(Serial,修改后需递增)、刷新时间等。NS记录:域名服务器记录,指向ns1.example.com。A记录:正向解析,将域名映射到IP地址。
反向区域文件(/etc/bind/db.192.168.1):
cp /etc/bind/db.127 /etc/bind/db.192.168.1
vim /etc/bind/db.192.168.1
``` 示例:
```;
; BIND reverse data file for 192.168.1.0/24
;
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.com.
100 IN PTR ns1.example.com.
101 IN PTR www.example.com.
102 IN PTR mail.example.com.
说明:
- 反向区域文件名需符合
in-addr.arpa格式,此处为168.192.in-addr.arpa,简化为db.192.168.1。 PTR记录:反向解析,将IP地址映射到域名。
启动与测试服务
-
启动DNS服务
- Ubuntu/Debian:
systemctl start bind9 systemctl enable bind9 # 开机自启
- CentOS/RHEL:
systemctl start named systemctl enable named
- Ubuntu/Debian:
-
检查服务状态
systemctl status bind9 # 或 named
若启动失败,查看日志:
/var/log/syslog(Ubuntu)或/var/log/messages(CentOS)。 -
测试解析
使用nslookup、dig或host工具测试:- 正向解析测试:
nslookup www.example.com 192.168.1.100
预期输出:
www.example.com A 192.168.1.101。
- 反向解析测试:
nslookup 192.168.1.101 192.168.1.100
预期输出:
1.168.192.in-addr.arpa PTR www.example.com。
- 正向解析测试:
常见配置优化
-
限制查询范围
出于安全考虑,建议将allow-query限制为内网IP,避免公网随意查询:allow-query { 192.168.1.0/24; localhost; }; };``` -
启用DNSSEC(可选)
DNSSEC(域名系统安全扩展)可防止DNS欺骗,配置较复杂,需生成密钥对并添加区域记录,此处略(可参考BIND官方文档)。 -
日志配置
在named.conf中添加日志条目,记录查询和错误信息:channel default_log { file "/var/log/named/named.log" versions 3 size 10m; severity info; print-time yes; }; category default { default_log; }; };``` 创建日志目录并授权: ```bash mkdir -p /var/log/named && chown bind:bind /var/log/named
DNS记录类型说明
| 记录类型 | 作用 | 示例 |
|---|---|---|
| A | 将域名映射到IPv4地址 | www IN A 192.168.1.101 |
| AAAA | 将域名映射到IPv6地址 | ipv6 IN AAAA 2408:8207:8f3f::1 |
| CNAME | 别名记录,指向另一个域名 | blog IN CNAME www.example.com |
| MX | 邮件交换记录,指定邮件服务器 | mail IN MX 10 mail.example.com |
| NS | 域名服务器记录,指定权威DNS服务器 | example.com IN NS ns1.example.com |
| PTR | 反向解析记录,IP映射到域名 | 101 IN PTR www.example.com |
| SOA | 起始授权机构,区域核心记录 | 包含序列号、管理员邮箱等 |
相关问答FAQs
问题1:如何排查DNS服务无法解析的问题?
解答:
- 检查服务状态:
systemctl status bind9,确认服务正常运行。 - 检查配置文件语法:
named-checkconf /etc/bind/named.conf,若有错误会提示具体行号。 - 检查区域文件语法:
named-checkzone example.com /etc/bind/db.example.com,验证记录格式是否正确。 - 查看日志:
tail -f /var/log/syslog(Ubuntu)或tail -f /var/log/messages(CentOS),定位错误原因(如权限不足、端口冲突等)。 - 测试网络连通性:
ping 192.168.1.100,确认客户端与DNS服务器通信正常。
问题2:如何配置DNS转发,将无法解析的请求转发到上游DNS?
解答:
在named.conf的options段中添加forwarders选项,指定上游DNS服务器(如运营商DNS或公共DNS):
directory "/var/cache/bind";
allow-query { any; };
recursion yes;
forwarders { 114.114.114.114; 8.8.8.8; }; # 上游DNS服务器
forward first; # 优先转发,转发失败则自行查询(可选,默认为first)
};```
配置完成后重启服务:`systemctl restart bind9`,测试解析外部域名(如`www.baidu.com`),确认请求是否被正确转发。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/31170.html