简易dns服务器搭建

安装BIND,编辑配置文件,定义正向/反向解析记录,重启服务

简易DNS服务器搭建指南

DNS基础概念

什么是DNS?

DNS(Domain Name System)是互联网的核心服务之一,负责将人类可读的域名(如www.example.com)转换为计算机可识别的IP地址(如192.168.1.1),它通过分布式数据库实现全球域名解析。

DNS工作原理

组件 功能
客户端 发起域名解析请求
递归 resolver 逐级查询并返回结果
权威服务器 存储特定域名的权威记录
缓存服务器 临时存储解析结果加速查询

常见DNS记录类型

记录类型 用途 示例
A 域名→IPv4地址 example.com → 192.168.1.1
AAAA 域名→IPv6地址 example.com → 2001:db8::1
CNAME 别名指向 www.example.com → example.com
MX 邮件交换 指定邮件服务器优先级
NS 命名服务器 指定域名权威服务器
TXT 文本记录 存储任意字符串信息

搭建前准备

系统要求

  • 推荐Linux系统(CentOS/Ubuntu/Debian)
  • 最低配置:1核CPU/512MB内存/1GB存储空间
  • 固定公网IP(非必须但推荐)

软件选择

软件名称 特点 适用场景
BIND 开源标准DNS软件 生产环境首选
dnsmasq 轻量级DNS+DHCP 小型网络/开发测试
Unbound 高性能验证型DNS 安全敏感环境

网络拓扑建议

[客户端] > [DNS服务器] > [上游DNS]
          |                 |
      局域网设备          公网解析

使用BIND搭建DNS服务器

安装BIND

Ubuntu/Debian系
sudo apt update
sudo apt install bind9 bind9utils bind9doc y
CentOS/RHEL系
sudo yum install bind bindutils y

配置文件结构

/etc/bind/       # 主配置文件目录
├── named.conf    # 主配置文件
├── db.*          # 区域文件(ZONE文件)
└── keys/         # TSIG密钥目录

配置正向解析

编辑/etc/bind/named.conf.local

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allowupdate { none; };
};

创建区域文件/etc/bind/db.example.com

$TTL    86400       ; 默认生存时间(秒)
@       IN          SOA     ns1.example.com. admin.example.com. (
                              2023100101 ; 序列号
                              3600       ; 刷新间隔
                              1800       ; 重试间隔
                              1209600    ; 过期时间
                              86400 )    ; 最小TTL
        IN          NS      ns1.example.com.
        IN          NS      ns2.example.com.
ns1     IN          A       192.168.1.1
ns2     IN          A       192.168.1.2
www     IN          A       192.168.1.100

配置反向解析区

编辑/etc/bind/named.conf.local追加:

简易dns服务器搭建

zone "1.168.192.inaddr.arpa" {
    type master;
    file "/etc/bind/db.192.168.1";
    allowupdate { none; };
};

创建反向区域文件/etc/bind/db.192.168.1

$TTL    86400
@       IN          SOA     ns1.example.com. admin.example.com. (
                              2023100101 ; 序列号
                              3600       ; 刷新间隔
                              1800       ; 重试间隔
                              1209600    ; 过期时间
                              86400 )    ; 最小TTL
        IN          NS      ns1.example.com.
        IN          NS      ns2.example.com.
1       IN          PTR     ns1.example.com.
100     IN          PTR     www.example.com.

启动与测试

# 检查配置文件语法
sudo namedcheckconf /etc/bind/named.conf
sudo namedcheckzone example.com /etc/bind/db.example.com
# 启动服务
sudo systemctl restart bind9
# 测试解析
dig @localhost example.com
nslookup www.example.com 127.0.0.1

高级配置选项

缓存设置

named.conf中配置:

options {
    forwarders {
        8.8.8.8;       # Google公共DNS
        8.8.4.4;       # Google备用DNS
    };
    querycachesize 10000; # 缓存条目数
};

访问控制

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allowquery { 192.168.1.0/24; }; # 仅允许内网查询
};

TSIG签名认证

生成密钥:

简易dns服务器搭建

sudo tsigkeygen a hmacmd5 b example.com c secret.key

配置named.conf

keys {
    "examplekey" {
        algorithm hmacmd5;
        secret "yourgeneratedsecretkey";
    };
};

常见问题排查

无法解析的排查步骤

检查项 操作命令 预期结果
服务状态 systemctl status bind9 active (running)
配置文件 namedcheckconf 无语法错误
日志查看 journalctl u bind9 无报错信息
防火墙规则 sudo ufw status 53端口开放
递归查询 dig +trace example.com 显示完整解析路径

性能优化建议

  • 启用查询缓存(默认开启)
  • 调整maxcachesize参数(默认1M)
  • 使用allowqueryonzone限制查询范围
  • 部署分离视图(splithorizon)实现内外网分离

安全加固措施

最小化安装原则

移除不必要的功能模块:

sudo apt remove bind9doc bind9host y

限制递归查询

编辑named.conf.options

简易dns服务器搭建

options {
    recursion yes;            # 允许递归查询(内部网络)
    allowrecursion { 192.168.1.0/24; }; # 仅内网可递归
};

签名验证配置

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    inlinesigning yes;       # 启用DNSSEC签名
    autodnssec maintain;     # 自动维护NSEC记录
};

Q&A问答专栏

Q1:为什么配置了反向解析区但PTR查询仍然失败?
A:常见原因包括:

  1. 反向区域文件命名不符合规范(应为db.<网络>,如db.192.168.1
  2. PTR记录未正确对应IP地址(需注意IP段与区域声明匹配)
  3. SOA记录中的NS记录与正向区域不一致
  4. BIND未加载反向区域配置(检查named.conf.local是否生效)

Q2:如何为新子域名添加A记录?
操作步骤:

  1. 编辑主区域文件/etc/bind/db.example.com,添加:
    subdomain IN A 192.168.1.200
  2. 更新SOA记录中的序列号(如从2023100101改为2023100102)
  3. 重新加载配置:
    sudo systemctl reload bind9
  4. 验证新增记录:
    dig subdomain.example.com @localhost

来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/205113.html

Like (0)
小编小编
Previous 2025年5月21日 22:07
Next 2025年5月21日 22:24

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注