凌峰创科服务平台

Ubuntu如何搭建DNS服务器?

本教程将引导你完成 BIND9 的安装、基本配置,使其成为一个能够响应本地网络查询的缓存 DNS 服务器,并最终配置一个可以解析自定义域名(如 yourdomain.com)的权威 DNS 服务器。

Ubuntu如何搭建DNS服务器?-图1
(图片来源网络,侵删)

教程大纲

  1. 环境准备
  2. 安装 BIND9
  3. 配置基本缓存 DNS 服务器
    • 编辑主配置文件
    • 配置本地解析文件
    • 重启并测试服务
  4. 配置权威 DNS 服务器 (可选)
    • 创建区域文件
    • 更新主配置文件
    • 重启并测试权威解析
  5. 安全加固
  6. 常见问题与总结

环境准备

在开始之前,请确保你有一台运行 Ubuntu (建议 20.04 或 22.04 LTS) 的服务器,

  • 你拥有服务器的 sudo 权限。
  • 服务器有一个固定的公网 IP 地址(0.113.10)。
  • 你已经购买了一个域名(yourdomain.com),并将该域名的 NS 记录指向你的服务器 IP,这是为了让互联网上的其他 DNS 服务器知道你的域名由你搭建的这台服务器解析。

重要提示:本教程中的示例 IP 地址是 0.113.10,域名是 yourdomain.com,请将它们替换为你自己的实际 IP 和域名。


安装 BIND9

更新你的软件包列表,然后安装 BIND9。

sudo apt update
sudo apt install bind9

安装完成后,BIND9 服务会自动启动,你可以使用以下命令检查其状态:

Ubuntu如何搭建DNS服务器?-图2
(图片来源网络,侵删)
sudo systemctl status bind9

如果看到绿色的 active (running),说明服务已成功启动。


配置基本缓存 DNS 服务器

默认情况下,BIND9 已经配置为一个缓存 DNS 服务器,它会递归查询并向你转发 DNS 请求,但为了更好地控制和学习,我们将手动配置它。

a. 编辑主配置文件

主配置文件是 /etc/bind/named.conf.options,我们将在这里定义哪些网络可以查询我们的 DNS 服务器,以及是否使用上游 DNS 服务器进行转发。

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

在文件中,找到 options { ... }; 块,我们需要做两件事:

Ubuntu如何搭建DNS服务器?-图3
(图片来源网络,侵删)
  1. 定义允许查询的网络:添加 allow-query { localhost; 192.168.1.0/24; };168.1.0/24 是你的局域网网段,请根据你的实际情况修改,这可以防止滥用。
  2. 配置转发器:在 options 块内添加 forwarders,指向你信任的上游 DNS 服务器,如 Google (8.8.8) 或 Cloudflare (1.1.1),这能加快解析速度。

修改后的文件内容可能如下:

options {
    directory "/var/cache/bind";
    // 允许查询的网络
    // localhost 是必须的,用于本地服务查询
    // 192.168.1.0/24 是你的局域网,请修改成你自己的
    allow-query { localhost; 192.168.1.0/24; };
    // 如果你不希望服务器进行递归查询,只做转发,可以取消下面这行的注释
    // recursion no;
    // 配置转发器,将无法解析的请求转发给这些服务器
    forwarders {
        8.8.8.8;
        1.1.1.1;
    };
    // 防止 DNS 欺骗
    dnssec-validation auto;
    // 监听所有网络接口
    listen-on { any; };
};

保存并关闭文件 (Ctrl+X, 然后按 Y, 最后按 Enter)。

b. 配置本地解析文件

为了确保本地主机名也能正确解析,我们检查一下 /etc/bind/named.conf.local 文件,确保它没有被修改(默认情况下是空的,因为我们没有配置区域)。

cat /etc/bind/named.conf.local

我们需要告诉 BIND9 使用 /etc/hosts 文件来解析本地主机名,编辑 /etc/bind/named.conf.default-zones

sudo nano /etc/bind/named.conf.default-zones

找到 zone "localhost" { ... };zone "127.in-addr.arpa" { ... }; 这两个区域块,确保它们是启用的,它们默认就是启用的,负责将 localhost 解析为 0.0.1

c. 重启并测试服务

配置完成后,重启 BIND9 服务以使更改生效。

sudo systemctl restart bind9

现在我们来测试一下。

  1. 测试本地解析

    nslookup localhost

    应该能看到 0.0.1 的解析结果。

  2. 测试缓存和转发功能

    nslookup google.com

    应该能成功解析出 Google 的 IP 地址。

  3. 测试从另一台电脑: 在你的局域网内的另一台电脑上,将 DNS 服务器地址设置为你的 Ubuntu 服务器的 IP (0.113.10 或你的局域网 IP),然后在这台电脑上执行 nslookup google.com,看是否能成功解析。

如果以上测试都通过,恭喜你,你已经成功搭建了一个基础的缓存 DNS 服务器!


配置权威 DNS 服务器 (可选)

将教你如何让你的 DNS 服务器成为一个“权威”服务器,能够回答 yourdomain.com 的查询。

a. 创建区域文件

区域文件存储了特定域名的 DNS 记录,我们将在 /etc/bind/zones/ 目录下创建它,如果该目录不存在,请先创建。

sudo mkdir -p /etc/bind/zones

创建区域文件 db.yourdomain.com

sudo nano /etc/bind/zones/db.yourdomain.com

粘贴进去,并根据你的实际情况修改 A 记录和 NS 记录。

;
; BIND data file for yourdomain.com
;
$TTL    604800
@       IN      SOA     ns1.yourdomain.com. admin.yourdomain.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.yourdomain.com.
@       IN      A       203.0.113.10    ; 你的服务器公网IP
ns1     IN      A       203.0.113.10    ; 你的服务器公网IP
; 如果你有邮件服务器
; mail    IN      A       203.0.113.10
; @       IN      MX      10      mail.yourdomain.com.
; 如果你想创建子域名,www.yourdomain.com
; www     IN      A       203.0.113.10

解释

  • $TTL: 生存时间,单位秒,这里设为 7 天。
  • SOA: "Start of Authority" (权威起始) 记录,是区域文件中最重要的记录。ns1.yourdomain.com. 是主域名服务器,admin.yourdomain.com. 是管理员邮箱。Serial 号(这里是 2)在修改文件后必须递增,以便从服务器知道何时进行同步。
  • NS: "Name Server" (域名服务器) 记录,指定了负责该域名的 DNS 服务器。
  • A: "Address" (地址) 记录,将域名映射到 IPv4 地址。

b. 更新主配置文件

我们需要在 /etc/bind/named.conf.local 中告诉 BIND9 关于这个新区域的信息。

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

在文件末尾添加以下内容:

//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
// include "/etc/bind/zones.rfc1918";
// --- 添加以下内容 ---
zone "yourdomain.com" {
    type master;
    file "/etc/bind/zones/db.yourdomain.com";
    allow-transfer { none; }; // 禁止区域传输,更安全
    allow-query { any; }; // 允许任何人查询这个区域
};
// 反向区域解析 (可选,但推荐)
// 将 IP 地址反向解析为域名
zone "113.0.203.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.203.0.113";
};

解释

  • zone "yourdomain.com": 定义了我们要管理的区域。
  • type master: 表示这台服务器是该区域的主权威服务器。
  • file "/etc/bind/zones/db.yourdomain.com": 指向我们刚刚创建的区域文件。
  • allow-query { any; }: 允许任何人查询这个域名的记录,对于生产环境,你可以限制为特定 IP。

c. 重启并测试权威解析

重启 BIND9 服务:

sudo systemctl restart bind9

测试你的权威 DNS 服务器:

  1. 在本地服务器上测试

    nslookup ns1.yourdomain.com 127.0.0.1
    nslookup yourdomain.com 127.0.0.1

    应该能看到 0.113.10 的解析结果。

  2. 从另一台电脑测试: 确保那台电脑的 DNS 服务器已经设置为你 Ubuntu 服务器的 IP,然后执行:

    nslookup yourdomain.com

    如果能成功解析,说明你的权威 DNS 服务器已经工作了!

  3. 最终验证: 在你的域名注册商(如 GoDaddy, Namecheap 等)处,将 yourdomain.com 的 NS 记录修改为:

    • ns1.yourdomain.com
    • ns2.yourdomain.com (如果你有第二台服务器,可以添加这个)

    等待 DNS 传播(可能需要几分钟到几小时),之后,在全球任何地方执行 nslookup yourdomain.com,都应该能解析到你的服务器 IP。


安全加固

生产环境中,安全至关重要。

  1. 使用防火墙 (UFW):

    # 只允许 DNS (端口 53) 和 SSH (端口 22) 的流量
    sudo ufw allow 53/tcp
    sudo ufw allow 53/udp
    sudo ufw allow 22/tcp
    sudo ufw enable
  2. 运行 named-checkconfnamed-checkzone: 在修改配置后,运行这些命令可以检查配置文件和区域文件的语法错误,避免服务无法启动。

    sudo named-checkconf
    sudo named-checkzone yourdomain.com /etc/bind/zones/db.yourdomain.com
  3. 限制区域传输: 在 named.conf.local 中,我们已经设置了 allow-transfer { none; };,这可以防止任何人从你的服务器拉取区域数据,是一种重要的安全措施。

  4. 使用 chroot 环境运行 (可选): BIND9 可以在一个 chroot (change root) 环境中运行,将 DNS 服务的文件系统与主系统隔离,提供额外的安全层,Ubuntu 的 BIND9 包默认可能已经配置了 chroot


常见问题与总结

  • 问题: nslookup 返回 connection refusedserver can't find

    • 排查:
      1. 检查 BIND9 服务状态: sudo systemctl status bind9
      2. 检查防火墙是否阻止了 53 端口。
      3. 检查配置文件语法: sudo named-checkconf
      4. 检查日志文件: sudo tail -f /var/log/syslog | grep named
  • 问题: 我的域名解析很慢。

    • 排查:
      1. 确认你的域名注册商的 NS 记录是否已正确更新。
      2. 使用 dig yourdomain.com @your_server_ip 命令进行更详细的查询,看是否有延迟。
      3. 检查 named.conf.options 中的 forwarders 配置是否合理。
  • 你已经成功地在 Ubuntu 上安装并配置了 BIND9 DNS 服务器,它现在既可以作为一个高效的缓存 DNS 服务器为你的局域网服务,也可以作为一个权威 DNS 服务器管理你自己的域名,随着你对 BIND9 的熟悉,你还可以配置更高级的功能,如 DNSSEC、日志记录、动态更新等。

分享:
扫描分享到社交APP
上一篇
下一篇