您的当前位置:首页>全部文章>文章详情

自建DNS服务器(基于Bind9)

发表于:2025-11-26 12:07:58浏览:18次TAG: #dns

作为程序员+新手父亲,自建DNS服务器可用于家庭网络加速、广告过滤、隐私保护(避免ISP劫持),或开发/测试环境的域名解析管理。

Bind9是互联网主流的DNS服务器软件,支持A记录、CNAME、MX、TXT等所有DNS记录类型,适合需要自定义复杂解析规则的开发/测试环境(如本地域名 devtest 指向开发机)。

1. 安装Bind9(Ubuntu)

# 安装Bind9及管理工具
sudo apt update && sudo apt install -y bind9 bind9utils bind9-doc

# 验证安装成功
sudo systemctl status named  # 输出 active (running) 即为成功

2. 核心配置(3个关键文件)

Bind9配置文件路径:/etc/bind/,核心文件如下:

(1)主配置文件:named.conf.options(DNS全局设置)

sudo nano /etc/bind/named.conf.options

添加以下配置(启用递归查询、允许内网访问、设置上游DNS):

options {
    directory "/var/cache/bind";
    recursion yes;  # 允许递归查询(客户端获取DNS解析结果)
    allow-recursion { 192.168.1.0/24; 127.0.0.1; };  # 仅允许内网和本地访问(避免被滥用)
    listen-on { 192.168.1.100; 127.0.0.1; };  # 监听服务器IP(替换为你的服务器内网IP)
    forwarders {  # 上游DNS服务器(推荐Cloudflare)
        1.1.1.1;
        1.0.0.1;
    };
    dnssec-validation auto;  # 自动DNSSEC验证(增强安全性)
    auth-nxdomain no;  # 禁用无效域名响应
    listen-on-v6 { any; };
};

(2)区域配置文件:named.conf.local(添加自定义域名区域)

sudo nano /etc/bind/named.conf.local

添加本地域名区域(如 dev 域,指向开发环境):

# 正向解析区域:将域名转换为IP
zone "dev" {
    type master;
    file "/etc/bind/zones/db.dev";  # 解析记录文件路径
};

# 反向解析区域(可选):将IP转换为域名
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
};

(3)解析记录文件:创建正向/反向解析文件

  1. 创建区域文件目录:

    sudo mkdir -p /etc/bind/zones
    
  2. 正向解析文件(db.dev):

    sudo nano /etc/bind/zones/db.dev
    

    添加以下内容(自定义域名→IP映射):

    $TTL    604800  # 缓存时间(7天)
    @       IN      SOA     ns.dev. admin.dev. (
                      2024050101  ; Serial(版本号,修改后递增)
                      604800     ; Refresh(刷新时间)
                      86400      ; Retry(重试时间)
                      2419200    ; Expire(过期时间)
                      604800 )   ; Negative Cache TTL(否定缓存时间)
    ;
    @       IN      NS      ns.dev.  # 名称服务器记录
    ns      IN      A       192.168.1.100  # ns.dev 指向DNS服务器IP
    test    IN      A       192.168.1.200  # test.dev 指向开发机IP
    api     IN      A       192.168.1.201  # api.dev 指向API服务器IP
    www     IN      CNAME   test.dev.  # www.dev 别名指向 test.dev
    
  3. 反向解析文件(db.192.168.1,可选):

    sudo nano /etc/bind/zones/db.192.168.1
    

    添加以下内容(IP→域名映射):

    $TTL    604800
    @       IN      SOA     ns.dev. admin.dev. (
                      2024050101
                      604800
                      86400
                      2419200
                      604800 )
    ;
    @       IN      NS      ns.dev.
    100     IN      PTR     ns.dev.  # 192.168.1.100 → ns.dev
    200     IN      PTR     test.dev.  # 192.168.1.200 → test.dev
    

3. 验证配置并启动服务

# 检查配置文件语法错误
sudo named-checkconf /etc/bind/named.conf.local
sudo named-checkzone dev /etc/bind/zones/db.dev  # 验证正向区域
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1  # 验证反向区域

# 重启Bind9服务
sudo systemctl restart named

# 设置开机自启
sudo systemctl enable named

4. 测试DNS解析(关键步骤)

在客户端(开发机或本地电脑)执行以下命令,验证解析是否生效:

# 测试自定义域名解析(替换为你的服务器IP和域名)
nslookup test.dev 192.168.1.100
# 预期输出:Address: 192.168.1.200(与配置文件一致)

# 测试公网域名解析(验证上游DNS是否正常)
nslookup www.baidu.com 192.168.1.100
# 预期输出:百度的IP地址

5. 运维要点

  • 查看日志:sudo tail -f /var/log/syslog | grep named(排查解析错误)
  • 新增域名:修改 db.dev 文件,递增 Serial 版本号,执行 sudo rndc reload 重载配置
  • 备份配置:定期备份 /etc/bind/ 目录(避免配置丢失)
  • 防火墙开放:如果启用UFW,需允许53端口(DNS默认端口):
    sudo ufw allow 53/tcp
    sudo ufw allow 53/udp
    sudo ufw reload
    

四、关键注意事项

  1. 安全性

    • 禁止公网访问递归查询(Bind9已通过 allow-recursion 限制内网,Pi-hole默认仅允许内网)
    • 定期更新系统和DNS软件(sudo apt update && sudo apt upgrade
    • 家庭网络使用时,避免将服务器IP暴露到公网(仅用内网静态IP)
  2. 稳定性

    • 服务器建议开启开机自启(Pi-hole和Bind9默认已配置)
    • 上游DNS选择2个以上(避免单点故障)
    • 家庭网络可搭配路由器DHCP,自动分配DNS服务器IP给设备
  3. 儿童网络保护扩展

    • Pi-hole可安装 pihole-FTL 插件,支持按设备分组过滤(如儿童设备单独应用严格过滤规则)
    • 推荐添加家长控制列表:https://raw.githubusercontent.com/AdguardTeam/AdGuardSDNSFilter/master/Filters/filter.txt

五、常见问题排查

  1. 客户端无法解析域名:

    • 检查服务器防火墙是否开放53端口(TCP/UDP)
    • 验证Bind9/Pi-hole服务是否运行(sudo systemctl status namedsudo systemctl status pihole-FTL
    • 客户端是否正确设置DNS为服务器IP(可通过 ipconfig /all(Windows)或 cat /etc/resolv.conf(Linux)查看)
  2. 公网域名解析失败:

    • 检查上游DNS是否可达(ping 1.1.1.1 测试)
    • 查看日志排查是否被防火墙拦截

按以上方案部署后,即可实现自定义域名解析(开发/测试用)和家庭网络广告过滤(儿童保护),兼顾技术需求和家庭使用场景。如果需要更复杂的配置(如DNS负载均衡、主从复制),可随时补充需求!

TIPS:若更多的是考虑家庭广告拦截或者儿童保护,可考虑使用另一个软件:Pi-hole(家庭首选,广告过滤+简单DNS),以下是使用安装教程

Pi-hole是基于DNS的广告拦截工具,同时具备DNS服务器功能,支持Web界面管理,适合家庭网络(可过滤儿童视频/网站广告、恶意域名)。

1. 一键安装(Ubuntu)

# 更新系统并安装依赖
sudo apt update && sudo apt install -y curl

# 一键安装Pi-hole(全程中文引导)
curl -sSL https://install.pi-hole.net | bash

2. 安装引导配置(关键步骤)

  1. 选择DNS上游服务器(推荐:Cloudflare DNS 1.1.1.1 或 Google DNS 8.8.8.8
  2. 选择阻塞列表(默认即可,后续可在Web面板添加儿童专用过滤列表)
  3. 同意安装Web管理面板(必须选,方便后续配置)
  4. 同意安装lighttpd(Web服务器,无需额外配置)
  5. 记录安装完成后的 管理员密码(用于登录Web面板)

3. 核心配置(Web面板操作)

  1. 访问Web面板:浏览器输入 http://服务器IP/admin(如 http://192.168.1.100/admin
  2. 登录:输入安装时记录的密码
  3. 关键配置:
    • 添加自定义域名解析(开发/测试用):
      • 进入 Local DNSDNS Records
      • 新增记录:域名(如 test.dev)→ 目标IP(如开发机IP 192.168.1.200
    • 添加儿童广告过滤列表
      • 进入 Group ManagementAdlists
      • 新增列表:https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts(通用广告过滤)
      • 新增儿童专用列表:https://raw.githubusercontent.com/CHN-CERT-CC/ChildSafeHosts/master/childsafe.hosts(过滤不良网站)
    • 修改管理员密码(可选):
      • 进入 SettingsSystemPassword 重置

4. 客户端使用DNS服务器

让家庭设备(手机、电脑、电视、婴儿监控器等)使用自建DNS:

  • 方法1:路由器全局配置(推荐)→ 在路由器DNS设置中,将首选DNS改为Pi-hole服务器IP(如 192.168.1.100),备用DNS留空或填 1.1.1.1
  • 方法2:单设备配置 → 手机/电脑网络设置中,手动设置DNS为服务器IP

5. 运维要点

  • 重启Pi-hole:sudo pihole restartdns
  • 更新阻塞列表:sudo pihole -g
  • 查看查询日志:Web面板 → Query Log(可监控儿童设备访问的域名)
  • 重置密码:sudo pihole -a -p

6. 常见问题排查

  • Pi-hole Web面板无法访问:
    • 检查lighttpd服务是否运行(sudo systemctl status lighttpd
    • 重新安装Web面板:sudo pihole -r(选择 Repair 修复)

如果需要更复杂的配置(如DNS负载均衡、主从复制),可自行google