在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