-
配置本地 DNS 缓存服务器 (推荐家庭/办公室用户)
(图片来源网络,侵删)- 目的:加速域名解析,减少对外部 DNS 服务器的请求,提高上网速度,并能实现简单的域名过滤。
- 软件:
dnsmasq,它轻量、高效,集成了 DNS 缓存、DHCP 和 TFTP 功能。
-
配置权威 DNS 服务器 (推荐网站管理员/网络管理员)
- 目的:为你的域名(如
yourdomain.com)提供 DNS 记录,让互联网上的用户能够通过域名访问你的服务。 - 软件:
bind9(Berkeley Internet Name Domain),是目前最流行、功能最强大的开源 DNS 服务器软件。
- 目的:为你的域名(如
配置本地 DNS 缓存服务器 (使用 Dnsmasq)
这是在 Ubuntu 桌面或服务器上最简单、最有效的优化 DNS 的方法。
第 1 步:安装 Dnsmasq
sudo apt update sudo apt install dnsmasq
安装完成后,dnsmasq 会自动作为一个服务启动。
第 2 步:配置 Dnsmasq
我们需要创建一个自定义的配置文件,而不是直接修改主配置文件 /etc/dnsmasq.conf,以便于后续升级。

sudo nano /etc/dnsmasq.d/custom.conf
粘贴到文件中,下面是一个配置示例,并附有详细解释:
# 监听所有网络接口 (0.0.0.0),默认只监听 localhost (127.0.0.1)。 # 如果你希望局域网内的其他设备也能使用这个 DNS 服务器,需要取消注释这行。 # listen-address=127.0.0.1,192.168.1.1 # 指定上游 DNS 服务器,当 dnsmasq 缓存中没有结果时,会向这些服务器查询。 # 推荐使用公共 DNS,如 Cloudflare (1.1.1.1) 或 Google (8.8.8.8)。 server=1.1.1.1 server=8.8.8.8 # 强制所有 DNS 查询都通过 dnsmasq,而不是使用系统默认的 DNS。 # 这对于防止 DNS 泄露非常重要。 no-resolv # 添加自定义的域名解析。 # 格式:address=/域名/IP地址 # 将 allinone.local 解析到 192.168.1.100 # address=/allinone.local/192.168.1.100 # 添加自定义的域名到服务器的映射。 # 格式:server=/域名/上游DNS服务器IP # 将 *.internal.yourdomain.com 的查询转发到内部 DNS 服务器 192.168.1.53 # server=/internal.yourdomain.com/192.168.1.53 # 启用日志功能,方便排查问题。 # 日志会输出到 /var/log/syslog log-queries
保存并退出:在 nano 中,按 Ctrl+X,然后按 Y,最后按 Enter。
第 3 步:配置系统使用 Dnsmasq
我们需要修改系统的网络配置,让所有 DNS 请求都指向 dnsmasq。
-
编辑 Netplan 配置文件 (适用于 Ubuntu 18.04 及更新版本):
(图片来源网络,侵删)sudo nano /etc/netplan/01-netcfg.yaml
找到
dns部分,并将其修改为nameservers,并指向localhost。network: version: 2 renderer: networkd ethernets: ens33: # 替换为你的网卡名称 dhcp4: yes # --- 修改下面这部分 --- nameservers: addresses: [127.0.0.1] search: [yourlocaldomain.com] # 可选,添加本地域名后缀 # --- 修改结束 --- -
编辑
/etc/resolv.conf(传统方法,Netplan 可能会覆盖它): 我们可以将resolv.conf设置为由systemd-resolved管理,而systemd-resolved又会使用dnsmasq,这是一个更现代和稳健的方法。确保
systemd-resolved正在运行:sudo systemctl status systemd-resolved
如果未运行,启用并启动它:
sudo systemctl enable --now systemd-resolved
创建一个指向
dnsmasq的符号链接:sudo rm /etc/resolv.conf sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
第 4 步:重启 Dnsmasq 并测试
# 重启 dnsmasq 服务以应用新配置 sudo systemctl restart dnsmasq # 检查服务状态 sudo systemctl status dnsmasq
测试 DNS 解析和缓存:
-
第一次查询 (会向上游服务器请求,并缓存结果)
dig google.com
-
第二次查询 (应该会非常快,因为结果已从本地缓存返回)
dig google.com
-
查看日志 (如果启用了日志)
# 查看最近的 DNS 查询日志 sudo grep 'dnsmasq' /var/log/syslog | tail
配置权威 DNS 服务器 (使用 BIND9)
这个过程更复杂,通常用于管理你自己的域名。
第 1 步:安装 BIND9
sudo apt update sudo apt install bind9
第 2 步:配置 BIND9
BIND9 的配置文件位于 /etc/bind/ 目录下,核心文件是 named.conf.options 和 named.conf.local。
-
编辑主配置文件 (
named.conf.options):sudo nano /etc/bind/named.conf.options
这个文件用于设置全局选项,如监听的 IP 地址、允许哪些客户端查询、以及转发查询等。
options { // 监听在本地回环地址和你的服务器公网 IP (如果需要) listen-on port 53 { 127.0.0.1; YOUR_SERVER_IP; }; // 替换 YOUR_SERVER_IP listen-on-v6 port 53 { ::1; }; // 允许查询的客户端 // "any" 表示允许所有人查询你的权威记录 // "localhost" 表示只允许本机查询 allow-query { any; }; // 允许递归查询的客户端 // 递归查询是客户端要求 DNS 服务器帮忙完成整个查询过程 // 对于权威 DNS 服务器,通常设置为 "none" 或只信任的 IP allow-recursion { none; }; // 转发器:当 BIND9 收到的查询不在其管辖的区域内时,转发到这里 // forwarders { 8.8.8.8; 1.1.1.1; }; // 数据目录 directory "/var/cache/bind"; };保存并退出。
-
创建区域文件 (
named.conf.local):sudo nano /etc/bind/named.conf.local
这个文件用于定义你管理的“区域”(Zone),即一个完整的域名。
// 定义一个正向区域 (example.com -> IP) zone "example.com" { type master; // 表示这是主权威服务器 file "/etc/bind/zones/db.example.com"; // 区域数据文件路径 }; // 定义一个反向区域 (IP -> example.com) // 这用于反向 DNS 查询 (PTR 记录) zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/zones/db.192.168.1"; };保存并退出。
-
创建正向区域数据文件:
sudo mkdir -p /etc/bind/zones sudo cp /etc/bind/db.local /etc/bind/zones/db.example.com sudo nano /etc/bind/zones/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 YOUR_SERVER_IP # 替换为你的服务器IP ns1 IN A YOUR_SERVER_IP # 替换为你的服务器IP www IN A YOUR_SERVER_IP # www.example.com 指向同一个IP mail IN A YOUR_SERVER_IP # mail.example.com 指向同一个IP重要:
Serial:每次修改此文件后,必须增加这个数字,否则你的 DNS 服务器不会更新到其他服务器。YOUR_SERVER_IP:替换为你的服务器 IP 地址。
-
创建反向区域数据文件:
sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.168.1 sudo nano /etc/bind/zones/db.192.168.1
修改文件内容如下(注意 IP 地址是反写的):
; ; BIND reverse data file for 192.168.1.0/24 ; $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. 1 IN PTR example.com. ; 192.168.1.1 -> example.com重要:
1对应的是168.1.1的主机号。
第 3 步:检查配置并重启 BIND9
# 检查配置文件语法是否正确 sudo named-checkconf sudo named-checkzone example.com /etc/bind/zones/db.example.com sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1 # 如果没有输出,说明语法正确,现在重启 BIND9 sudo systemctl restart bind9 # 检查服务状态 sudo systemctl status bind9
第 4 步:测试
使用 dig 命令从你的服务器或其他机器上进行测试。
-
测试正向解析:
dig @127.0.0.1 example.com
-
测试反向解析:
dig @127.0.0.1 -x 192.168.1.1
-
测试 NS 记录:
dig @127.0.0.1 NS example.com
第 5 步:注册域名和修改 NS 记录
要让你的 DNS 服务器在互联网上生效,你需要:
- 在你的域名注册商(如 GoDaddy, Namecheap 等)处购买一个域名(
yourdomain.com)。 - 登录注册商的控制面板,将域名的 NS 记录修改为你新配置的 DNS 服务器的名称,
ns1.yourdomain.com。 - 等待 DNS 传播(可能需要几分钟到 48 小时)。
总结与常见问题
-
选择哪个方案?
- 只是想加速自己电脑或局域网的上网速度?用 Dnsmasq。
- 是要管理自己的网站域名,让其他人能访问?用 BIND9。
-
如何检查 DNS 是否生效?
- 使用
nslookup yourdomain.com或dig yourdomain.com。 - 使用在线 DNS 检查工具,如
whatsmydns.net,可以查看全球 DNS 服务器的解析状态。
- 使用
-
权限问题:确保 BIND9 配置文件的所有者是
root,组是bind,并且权限正确。named守护进程以bind用户身份运行。sudo chown -R root:bind /etc/bind sudo chmod -R 755 /etc/bind
希望这份详细的指南能帮助你成功配置 Ubuntu 上的 DNS 服务器!
