手把手教你设置 Linux DNS 服务器地址:全面指南
在浩瀚的互联网世界中,域名系统(DNS)扮演着至关重要的“翻译官”角色。它将我们容易记忆的网站域名(如 www.google.com
)转换成计算机能够理解的 IP 地址(如 172.217.160.142
),从而让我们能够顺利访问网络资源。默认情况下,你的 Linux 系统通常会使用由你的互联网服务提供商(ISP)或网络管理员自动分配的 DNS 服务器。然而,在某些情况下,你可能希望或需要手动更改这些设置。
为什么要更改 Linux DNS 服务器地址?
更改 DNS 服务器的原因多种多样,主要包括:
- 提升访问速度: 某些公共 DNS 服务器(如 Google Public DNS、Cloudflare DNS)可能拥有更快的响应速度和更优化的路由,从而加快网页加载和网络应用的响应。
- 增强隐私保护: 一些注重隐私的 DNS 提供商(如 Cloudflare、Quad9)承诺不记录用户的查询日志,或者提供更强的隐私策略,减少个人浏览信息被追踪的风险。
- 提高安全性: 部分 DNS 服务(如 Quad9、OpenDNS FamilyShield)提供恶意软件、钓鱼网站过滤功能,可以在 DNS 层面阻止你访问已知的危险站点,增加一层安全防护。
- 绕过地理限制或审查: 在某些地区,特定的 DNS 服务器可能有助于访问被本地网络限制的内容(请遵守当地法律法规)。
- 使用特定功能: 例如,OpenDNS 提供了家长控制和内容过滤功能,需要将其 DNS 服务器地址配置在你的设备或路由器上。
- 故障排除: 当遇到无法解析域名(“找不到服务器”错误)时,更换 DNS 服务器是常见的排查步骤之一,可以判断是否是当前 DNS 服务器的问题。
- 内部网络需求: 企业或组织内部可能需要指向内部 DNS 服务器以解析内部服务域名。
无论你的动机是什么,本指南将手把手教你如何在不同的 Linux 环境下设置和更改 DNS 服务器地址。我们将涵盖从临时修改到永久生效,从图形界面到命令行操作的多种方法。
准备工作:选择合适的 DNS 服务器
在开始配置之前,你需要确定要使用哪些 DNS 服务器的 IP 地址。以下是一些常用的、可靠的公共 DNS 服务器选项(通常提供 IPv4 和 IPv6 地址):
- Google Public DNS:
- IPv4:
8.8.8.8
,8.8.4.4
- IPv6:
2001:4860:4860::8888
,2001:4860:4860::8844
- 优点:速度快,稳定性高,全球分布广泛。
- IPv4:
- Cloudflare DNS:
- IPv4:
1.1.1.1
,1.0.0.1
- IPv6:
2606:4700:4700::1111
,2606:4700:4700::1001
- 优点:速度极快,非常注重隐私保护,支持 DNS over HTTPS (DoH) 和 DNS over TLS (DoT)。
- IPv4:
- OpenDNS Home:
- IPv4:
208.67.222.222
,208.67.220.220
- IPv6:
2620:119:35::35
,2620:119:53::53
- 优点:提供可选的内容过滤和安全防护功能(需注册账户配置)。
- IPv4:
- Quad9:
- IPv4:
9.9.9.9
,149.112.112.112
- IPv6:
2620:fe::fe
,2620:fe::9
- 优点:注重安全,阻止对已知恶意域名的访问,也注重隐私。
- IPv4:
你可以根据自己的需求(速度、隐私、安全、功能)选择一组或多组 DNS 服务器。通常建议配置至少两个 DNS 地址(一个主用,一个备用)以提高可靠性。
方法一:临时修改 DNS (直接编辑 /etc/resolv.conf
)
这是最直接但也通常是临时的方法。/etc/resolv.conf
文件是 Linux 系统传统上用于存储 DNS 服务器信息的地方。
步骤:
- 打开终端: 你可以通过应用程序菜单找到终端,或者使用快捷键(通常是
Ctrl+Alt+T
)。 - 编辑文件: 使用你喜欢的文本编辑器(如
nano
,vim
,gedit
)以 root 权限打开/etc/resolv.conf
。例如,使用nano
:
bash
sudo nano /etc/resolv.conf
输入你的用户密码以获取管理员权限。 - 修改内容:
- 找到以
nameserver
开头的行。这些行定义了当前使用的 DNS 服务器。 - 你可以注释掉(在行首添加
#
)或删除现有的nameserver
行。 - 添加新的
nameserver
行,每行一个 DNS 服务器 IP 地址。例如,要使用 Google DNS:
nameserver 8.8.8.8
nameserver 8.8.4.4
# 如果需要 IPv6,也可以添加
# nameserver 2001:4860:4860::8888 - 你可以添加
search
指令来指定默认搜索域(通常用于局域网),例如search mydomain.local
。 - 你也可以添加
options
指令,例如options timeout:1
设置查询超时时间为 1 秒。
- 找到以
- 保存并退出:
- 在
nano
中,按Ctrl+X
,然后按Y
确认保存,最后按Enter
确认文件名。 - 在
vim
中,按Esc
进入命令模式,输入:wq
并按Enter
。
- 在
重要提示:
这种方法通常是临时的。在许多现代 Linux 发行版中(特别是使用 NetworkManager 或 systemd-resolved 的系统),/etc/resolv.conf
文件是由网络管理服务动态生成的。当你重启网络服务、重新连接网络或重启系统时,你所做的修改很可能会被覆盖掉。
因此,这种方法主要适用于:
- 快速测试某个 DNS 服务器是否可用。
- 在不使用现代网络管理工具的极简系统或特定场景下。
如果你需要永久性的更改,请使用下面的方法。
方法二:通过 NetworkManager (图形界面 – 适用于桌面环境)
大多数流行的 Linux 桌面发行版(如 Ubuntu, Fedora, Linux Mint, Debian 等)默认使用 NetworkManager 来管理网络连接。通过其图形界面更改 DNS 是最用户友好的方法。
步骤 (以 GNOME 桌面环境为例,其他环境类似):
- 打开系统设置: 点击屏幕右上角的网络/音量/电源图标区域,选择“设置”或“有线设置”/“Wi-Fi 设置”。或者从应用程序菜单中搜索“设置”。
- 进入网络设置: 在设置窗口中,找到“网络”或“Wi-Fi”/“有线”选项卡。
- 选择连接: 找到你当前正在使用的网络连接(例如,你的 Wi-Fi 名称或“有线连接 1”),点击旁边的齿轮图标⚙️进行编辑。
- 配置 IPv4 或 IPv6:
- 在连接设置窗口中,切换到“IPv4”选项卡。
- 找到“DNS”部分。默认情况下,“自动”开关可能是打开的。将其关闭。
- 在下方的“DNS 服务器”输入框中,输入你选择的 DNS 服务器 IP 地址,用逗号分隔。例如:
8.8.8.8, 8.8.4.4
。 - (可选)如果你也想为 IPv6 设置 DNS,切换到“IPv6”选项卡,重复类似步骤,关闭“自动”DNS,并在“DNS 服务器”框中输入 IPv6 地址,例如:
2001:4860:4860::8888, 2001:4860:4860::8844
。 - 重要: 确保旁边的 “自动(DHCP)” 或类似获取地址的方式仍然是你需要的 (除非你想设置静态 IP)。我们这里只改 DNS。
- 应用更改: 点击窗口右上角的“应用”按钮。你可能需要输入管理员密码。
- 重新连接网络(可选但推荐): 为了确保更改立即生效,你可以断开当前网络连接再重新连接,或者直接禁用再启用该网络连接。点击设置窗口顶部的开关即可。
现在,你的特定网络连接将使用你指定的 DNS 服务器。如果你有多个网络连接(例如,同时有 Wi-Fi 和有线),你需要分别为它们配置 DNS,或者配置你常用的那个。
方法三:通过 NetworkManager (命令行 nmcli
– 适用于服务器或高级用户)
如果你在没有图形界面的服务器上,或者更喜欢使用命令行,nmcli
是 NetworkManager 的命令行工具,功能强大。
步骤:
- 打开终端。
- 列出当前网络连接:
bash
nmcli connection show
找到你想要修改的连接的名称(NAME 列)。假设连接名称是MyWifi
或Wired connection 1
。记下这个名称。 - 查看当前 DNS 设置(可选):
bash
nmcli connection show "连接名称" | grep dns
将"连接名称"
替换为你的实际连接名。你会看到当前的ipv4.dns
和ipv6.dns
设置。 - 设置 IPv4 DNS:
bash
sudo nmcli connection modify "连接名称" ipv4.dns "8.8.8.8 8.8.4.4"- 将
"连接名称"
替换为你的连接名。 - 将
"8.8.8.8 8.8.4.4"
替换为你选择的 DNS 服务器 IP 地址,用空格分隔。
- 将
- 禁用自动获取 DNS (重要): 为了防止 DHCP 服务器提供的 DNS 覆盖你的设置,你需要告诉 NetworkManager 忽略自动获取的 DNS:
bash
sudo nmcli connection modify "连接名称" ipv4.ignore-auto-dns yes - 设置 IPv6 DNS (可选): 如果需要,同样设置 IPv6 DNS:
bash
sudo nmcli connection modify "连接名称" ipv6.dns "2001:4860:4860::8888 2001:4860:4860::8844"
sudo nmcli connection modify "连接名称" ipv6.ignore-auto-dns yes - 应用更改: 使更改生效,需要重新激活连接。最简单的方法是:
bash
sudo nmcli connection down "连接名称" && sudo nmcli connection up "连接名称"
或者,如果这是你当前活动的连接:
bash
sudo nmcli connection reload
sudo nmcli networking off && sudo nmcli networking on
(第二种方法会短暂断开所有网络连接)
现在,通过 nmcli
修改的 DNS 设置将是持久的,并且与图形界面的修改效果相同。
方法四:通过 systemd-resolved
(适用于使用 systemd 的现代系统)
许多现代 Linux 发行版(如 Ubuntu 18.04+, Fedora, Arch Linux 等)使用 systemd-resolved
服务来管理 DNS 解析。在这种情况下,/etc/resolv.conf
通常是一个指向 systemd-resolved
管理的文件的符号链接(例如,指向 /run/systemd/resolve/stub-resolv.conf
或 /run/systemd/resolve/resolv.conf
)。直接修改这个符号链接指向的文件是无效的,或者修改 /etc/resolv.conf
本身也会被覆盖。
正确的配置方法是修改 systemd-resolved
的配置文件。
步骤:
- 检查
systemd-resolved
状态:
bash
systemctl status systemd-resolved
确认服务是 active (running)。同时,检查/etc/resolv.conf
是否是一个符号链接:
bash
ls -l /etc/resolv.conf
如果它指向stub-resolv.conf
或类似文件,那么你很可能在使用systemd-resolved
。stub-resolv.conf
通常只包含nameserver 127.0.0.53
,表示所有查询都先发给本地的systemd-resolved
进程。 - 编辑
systemd-resolved
配置文件:
配置文件位于/etc/systemd/resolved.conf
。使用 root 权限编辑它:
bash
sudo nano /etc/systemd/resolved.conf - 修改配置:
- 在文件中找到
[Resolve]
部分。 - 找到
#DNS=
这一行(或者如果不存在就添加一行)。去掉行首的#
,并在等号后面输入你想要的 DNS 服务器 IP 地址,用空格分隔。例如:
ini
[Resolve]
DNS=8.8.8.8 1.1.1.1 2001:4860:4860::8888 2606:4700:4700::1111 - (可选)你还可以设置
FallbackDNS=
,这些服务器会在主 DNS 无响应或 DHCP 未提供 DNS 时使用:
ini
FallbackDNS=8.8.4.4 1.0.0.1 2001:4860:4860::8844 2606:4700:4700::1001 - (可选)如果你想强制使用 DNS over TLS (DoT) 以增加安全性(前提是你选择的 DNS 服务器支持 DoT,如 Cloudflare 和 Google),可以设置
DNSOverTLS=
:
ini
DNSOverTLS=opportunistic # 尝试使用 DoT,如果失败则回退到普通 DNS
# 或者 DNSOverTLS=yes # 强制使用 DoT,如果失败则解析失败 - 保存并退出编辑器 (
Ctrl+X
,Y
,Enter
in nano)。
- 在文件中找到
- 重启
systemd-resolved
服务:
bash
sudo systemctl restart systemd-resolved - 验证配置(重要):
由于/etc/resolv.conf
可能仍然指向127.0.0.53
,你需要使用resolvectl
命令来查看实际生效的 DNS 服务器:
bash
resolvectl status
在输出中查找 “Global” 部分或特定接口(如eth0
,wlan0
)的 “DNS Servers” 字段,确认它显示了你刚刚配置的 IP 地址。
这种方法提供了系统全局的 DNS 设置,通常会覆盖 NetworkManager 等工具通过 DHCP 获取的 DNS(除非 NetworkManager 配置了特定的 DNS 优先)。
方法五:编辑网络接口配置文件 (传统方法,较少使用)
在不使用 NetworkManager 或 systemd-resolved 的系统上(例如一些老旧系统,或者明确配置为使用传统网络脚本的系统),你可能需要直接编辑网络接口的配置文件。
-
Debian / Ubuntu (使用
/etc/network/interfaces
):
编辑/etc/network/interfaces
文件:
bash
sudo nano /etc/network/interfaces
在相应的接口配置(例如iface eth0 inet dhcp
或iface eth0 inet static
)下添加dns-nameservers
指令:
“`
auto eth0
iface eth0 inet dhcp
dns-nameservers 8.8.8.8 8.8.4.4或者对于静态 IP 配置
auto eth1
iface eth1 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 1.1.1.1
修改后,需要重启网络服务或接口:
bash
sudo systemctl restart networking # 或者 sudo /etc/init.d/networking restart或者针对特定接口
sudo ifdown eth0 && sudo ifup eth0
“` -
RHEL / CentOS / Fedora (传统
network-scripts
):
编辑对应接口的配置文件,通常位于/etc/sysconfig/network-scripts/ifcfg-<interface_name>
(例如ifcfg-eth0
):
bash
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
添加或修改DNS1
和DNS2
(以及DNS3
等) 参数:
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
# ... 其他设置 ...
PEERDNS=no # 非常重要:设置为 no,防止 DHCP 提供的 DNS 覆盖你的设置
DNS1=8.8.8.8
DNS2=1.1.1.1
对于静态 IP 配置也类似添加DNS1
,DNS2
。修改后,重启网络服务:
bash
sudo systemctl restart network # 或者 sudo service network restart
# 或者针对特定接口
sudo ifdown eth0 && sudo ifup eth0
注意: 这种传统方法在现代系统中越来越少见,NetworkManager 或 systemd-resolved 通常是首选。请先确认你的系统实际使用的网络管理方式。
验证你的 DNS 设置
无论你使用哪种方法更改了 DNS,验证设置是否生效至关重要。
-
检查
/etc/resolv.conf
(有局限性):
bash
cat /etc/resolv.conf- 如果使用方法一,你应该直接看到你添加的
nameserver
。 - 如果使用 NetworkManager (方法二/三) 且未使用
systemd-resolved
,这里通常会显示你设置的 DNS。 - 如果使用
systemd-resolved
(方法四),这里可能只显示nameserver 127.0.0.53
,这表示查询被转发到本地systemd-resolved
进程。你需要使用下面的方法来确认最终使用的服务器。
- 如果使用方法一,你应该直接看到你添加的
-
使用
dig
或nslookup
:
这两个是强大的 DNS 查询工具。
bash
dig google.com
# 或者
nslookup google.com
在dig
的输出中,查找;; SERVER:
行,它会显示回答你查询的 DNS 服务器 IP 地址和端口。
在nslookup
的输出中,第一行通常会显示Server:
和Address:
,指明了当前使用的 DNS 服务器。
多次运行查询,看看是否会轮流使用你配置的多个 DNS 服务器。 -
使用
resolvectl
(如果使用systemd-resolved
):
这是验证systemd-resolved
配置的最佳方式。
bash
resolvectl status
查看 “Global” DNS servers 和特定接口的 “DNS Servers” 列表。
你也可以用它来查询域名,并查看是哪个服务器响应的:
bash
resolvectl query google.com
输出会包含 “SERVER:” 信息。
常见问题与故障排除
- 更改未生效:
- 确保你使用了适合你系统的正确方法(NetworkManager? systemd-resolved? 传统脚本?)。
- 对于 NetworkManager 或传统脚本,确保你重新加载或重启了网络连接/服务。
- 对于
systemd-resolved
,确保你重启了systemd-resolved.service
。 - 检查配置文件中是否有拼写错误或语法错误。
- 确保你以 root 或 sudo 权限编辑的文件并保存成功。
- 如果你通过 DHCP 获取 IP 地址,检查是否设置了忽略自动 DNS 的选项(如
ipv4.ignore-auto-dns yes
in nmcli,PEERDNS=no
in network-scripts)。
- 无法解析任何域名:
- 检查你输入的 DNS 服务器 IP 地址是否正确且可达。尝试
ping
这些 IP 地址。 - 检查你的防火墙设置 (如
ufw
,firewalld
,iptables
) 是否阻止了到 UDP/TCP 端口 53 的出站连接。 - 尝试换回 ISP 的默认 DNS 或其他公共 DNS (如
8.8.8.8
),看是否恢复正常,以判断是否是你选择的 DNS 服务器本身有问题。
- 检查你输入的 DNS 服务器 IP 地址是否正确且可达。尝试
- 网络连接变慢:
- 可能是你选择的 DNS 服务器对你的网络来说响应较慢。尝试更换其他公共 DNS 进行测试。可以使用
namebench
等工具测试不同 DNS 服务器在你网络环境下的速度。
- 可能是你选择的 DNS 服务器对你的网络来说响应较慢。尝试更换其他公共 DNS 进行测试。可以使用
总结
在 Linux 系统中设置 DNS 服务器地址是一个相对直接的过程,但关键在于理解你的系统使用了哪种网络管理机制(NetworkManager, systemd-resolved, 或传统脚本),并选择对应且持久化的配置方法。
- 对于桌面用户,通过 NetworkManager 的图形界面通常是最简单、最推荐的方式。
- 对于服务器用户或命令行爱好者,
nmcli
(如果使用 NetworkManager) 或修改/etc/systemd/resolved.conf
(如果使用 systemd-resolved) 是可靠的永久性方案。 - 直接编辑
/etc/resolv.conf
只适用于临时测试或非常特定的环境。 - 编辑传统网络脚本 (
/etc/network/interfaces
或/etc/sysconfig/network-scripts/
) 适用于未使用现代网络管理工具的系统。
无论选择哪种方法,配置完成后务必使用 dig
, nslookup
, 或 resolvectl status
等工具进行验证,确保你的系统确实在使用新的 DNS 服务器。通过掌握这些方法,你可以根据自己的需求灵活地优化和控制 Linux 系统的网络解析行为,从而可能获得更快的速度、更强的隐私保护或更高的安全性。希望这篇详细的指南能帮助你成功配置你的 Linux DNS 设置!