凌峰创科服务平台

ubuntu dns 服务器配置

  1. 安装 BIND
  2. 配置主要区域文件
  3. 配置反向区域文件
  4. 配置 BIND 主配置文件
  5. 启动和测试服务
  6. 安全增强(可选但推荐)
  7. 常见问题排查

第 1 步:安装 BIND

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

ubuntu dns 服务器配置-图1
(图片来源网络,侵删)
sudo apt update
sudo apt install bind9 -y

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

sudo systemctl status bind9

如果看到 active (running),则表示服务正在运行。


第 2 步:配置主要区域文件

主要区域文件用于将域名(如 example.com)解析为 IP 地址(如 168.1.10)。

1 创建区域配置文件

BIND 的区域定义通常存放在 /etc/bind/named.conf.local 文件中,我们需要在这个文件中声明我们的主要区域和反向区域。

ubuntu dns 服务器配置-图2
(图片来源网络,侵删)

打开并编辑该文件:

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

在文件末尾添加以下内容(请务必将 example.comyour.email.com 替换为你自己的域名和管理员邮箱):

#
# Do any local configuration here
#
# 主要区域配置
zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};
# 反向区域配置 (稍后会用到)
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192.168.1";
};
  • zone "example.com": 定义你要管理的区域。
  • type master;: 表示这个 DNS 服务器是该区域的主服务器。
  • file "/etc/bind/db.example.com";: 指向存储该区域数据的文件,这个文件我们稍后会创建。

2 创建区域数据文件

我们需要创建 /etc/bind/db.example.com 文件,最好的方法是复制一个现有的模板文件。

sudo cp /etc/bind/db.local /etc/bind/db.example.com

然后编辑这个新文件:

ubuntu dns 服务器配置-图3
(图片来源网络,侵删)
sudo nano /etc/bind/db.example.com

修改为如下所示(同样,替换域名和 IP 地址):

;
; 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.10
@       IN      AAAA    ::1
; 主机记录
ns1     IN      A       192.168.1.10
www     IN      A       192.168.1.10
mail    IN      A       192.168.1.11
ftp     IN      CNAME   www.example.com.

解释:**

  • $TTL 604800: 设置默认的“生存时间”,即 DNS 记录在缓存中保留的时间(这里是 7 天)。
  • 表示当前区域名(即 example.com)。
  • SOA (Start of Authority): 区域授权记录,这是区域中最重要的记录。
    • ns1.example.com.: 负责此区域的 DNS 服务器主机名。
    • admin.example.com.: 管理此区域的邮箱地址( 被替换为 )。
    • 2: 序列号,当你修改了区域文件后,必须增加这个数字,以便从服务器知道需要重新加载数据。
  • NS (Name Server): 声明哪些服务器是该区域的权威名称服务器。
  • A (Address): 将主机名映射到 IPv4 地址。@ IN A 192.168.1.10 表示 example.com 本身指向 168.1.10
  • AAAA: 将主机名映射到 IPv6 地址。
  • CNAME (Canonical Name): 别名记录。ftpwww 的一个别名。

第 3 步:配置反向区域文件

反向区域用于将 IP 地址解析为域名(反向查找)。

1 创建反向区域数据文件

同样,我们复制一个模板文件来创建反向区域文件。

sudo cp /etc/bind/db.127 /etc/bind/db.192.168.1

然后编辑它:

sudo nano /etc/bind/db.192.168.1

如下(确保 IP 地址段与你的网络匹配):

;
; BIND reverse data file for 1.168.192.in-addr.arpa
;
$TTL    604800
@       IN      SOA     ns1.example.com. admin.example.com. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.example.com.
; PTR (Pointer) 记录
10      IN      PTR     ns1.example.com.
10      IN      PTR     www.example.com.
11      IN      PTR     mail.example.com.

解释:**

  • 反向区域名 168.192.in-addr.arpa168.1.10 的 IP 地址倒序写法。
  • PTR (Pointer): 指针记录,用于反向解析。
    • 10 IN PTR ns1.example.com.: 表示 IP 地址 168.1.10 对应的主名是 ns1.example.com
    • 注意: 10 是 IP 地址的最后一部分。

第 4 步:配置 BIND 主配置文件

为了安全起见,默认情况下 BIND 只监听在本地回环地址 0.0.1 上,我们需要修改它,让它监听在服务器的所有网络接口上,以便局域网内的其他设备可以使用它。

打开主配置文件:

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

找到 options 块,并修改或添加 listen-onallow-query 指令,修改后的部分应如下所示:

options {
    directory "/var/cache/bind";
    // 监听在所有可用的 IPv4 地址上
    listen-on { any; };
    // 如果需要支持 IPv6,取消下面这行的注释
    // listen-on-v6 { any; };
    // 允许任何客户端查询(对于内网 DNS 服务器是安全的)
    // 对于生产环境,最好限制为你的局域网网段,allow-query { 192.168.1.0/24; };
    allow-query { any; };
    // 考虑添加以下行以提高安全性
    // recursion yes;
    // allow-recursion { localhost; localnets; };
    // 禁止区域传输,除非你有从服务器
    allow-transfer { none; };
    // 其他配置...
};
  • listen-on { any; }: 告诉 BIND 监听服务器所有 IPv4 网络接口上的 DNS 请求。
  • allow-query { any; }: 允许任何来源的机器向此服务器发起 DNS 查询请求,对于家庭或小型办公室网络,这是最简单的设置,对于更严格的环境,可以将其替换为你的局域网网段,如 168.1.0/24

第 5 步:启动和测试服务

1 检查配置语法

在重启服务之前,务必检查配置文件的语法是否正确。

sudo named-checkconf
sudo named-checkzone example.com /etc/bind/db.example.com
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1

如果没有任何输出,说明语法正确。

2 重启 BIND 服务

sudo systemctl restart bind9

3 测试 DNS 服务器

让我们在服务器上测试我们自己配置的 DNS。

测试正向解析 (域名 -> IP)

使用 dignslookup 命令。

dig @127.0.0.1 www.example.com
# 或者使用 nslookup
nslookup www.example.com 127.0.0.1

你应该能看到类似 ANSWER SECTION 的输出,显示 www.example.com 的 IP 地址是 168.1.10

测试反向解析 (IP -> 域名)

dig @127.0.0.1 -x 192.168.1.10
# 或者使用 nslookup
nslookup 192.168.1.10 127.0.0.1

你应该能看到 ANSWER SECTION 显示 168.1.10 对应的域名是 www.example.com


第 6 步:配置客户端使用新的 DNS 服务器

要让局域网内的其他设备使用这个新的 DNS 服务器,你需要将它们的 DNS 设置指向这台 Ubuntu 服务器的 IP 地址(168.1.10)。

  • 在路由器上: 登录你的路由器管理界面,在 LAN 或 DHCP 设置中,将 DNS 服务器地址设置为 168.1.10,这样连接到路由器的所有设备都会自动使用它。
  • 在单个设备上:
    • Windows: 网络设置 -> 更改适配器选项 -> 右键点击网络连接 -> 属性 -> Internet 协议版本 4 (TCP/IPv4) -> 属性 -> 使用下面的 DNS 服务器地址 -> 填入 168.1.10
    • macOS: 系统偏好设置 -> 网络 -> 高级 -> DNS -> 点击 添加 168.1.10
    • Linux (Ubuntu): 设置 -> 网络 -> 点击齿轮图标 -> IPv4 -> DNS 服务器 -> 填入 168.1.10

第 7 步:安全增强(可选但推荐)

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

1 使用 Chroot Jail (BIND9 默认启用)

BIND9 在 Ubuntu 上默认以 chroot 方式运行,这意味着它被限制在一个虚拟的根目录 (/var/lib/named) 中,即使被攻破,也难以影响系统其他部分,这通常已经配置好了,无需额外操作。

2 限制查询和递归

/etc/bind/named.conf.options 中,我们已经做了基本的限制,一个更安全的配置是:

options {
    // ... 其他配置 ...
    // 只允许来自本地网络和本机的查询
    allow-query { localhost; 192.168.1.0/24; };
    // 只允许来自本地网络和本机的递归查询
    allow-recursion { localhost; 192.168.1.0/24; };
    // 只允许向指定的服务器转发无法解析的查询
    // forwarders { 8.8.8.8; 1.1.1.1; };
    // forward only;
};

3 使用防火墙 (ufw)

如果你的服务器启用了 ufw (Uncomplicated Firewall),你需要允许 DNS 流量(端口 53)。

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw reload

第 8 步:常见问题排查

  • 问题: named-checkzone 报错 "zone example.com/IN: loaded serial 2`
    • 原因: 通常是因为序列号没有更新,编辑区域文件,将 SOA 记录中的 Serial 号加一,然后再次检查。
  • 问题: 客户端无法解析,但服务器上可以。
    • 原因 1: 防火墙阻止了端口 53,检查 ufwiptables 规则。
    • 原因 2: 客户端的 DNS 设置不正确,确保客户端配置了正确的 DNS 服务器 IP。
    • 原因 3: allow-query 设置过于严格,没有包含客户端的 IP 地址。
  • 问题: 日志显示 permission deniedcannot open file 'db.example.com': permission denied
    • 原因: BIND 运行在 bind 用户下,该用户可能没有读取区域文件的权限,确保区域文件的属主是 root:bind,并且权限是 644
      sudo chown root:bind /etc/bind/db.example.com
      sudo chmod 644 /etc/bind/db.example.com

至此,你已经成功配置了一个基本的、功能齐全的 Ubuntu DNS 服务器,你可以根据需要添加更多的 AAAAACNAMEMX (邮件交换) 等记录。

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