手把手教你设置 Linux DNS 服务器地址 – wiki基地


手把手教你设置 Linux DNS 服务器地址:全面指南

在浩瀚的互联网世界中,域名系统(DNS)扮演着至关重要的“翻译官”角色。它将我们容易记忆的网站域名(如 www.google.com)转换成计算机能够理解的 IP 地址(如 172.217.160.142),从而让我们能够顺利访问网络资源。默认情况下,你的 Linux 系统通常会使用由你的互联网服务提供商(ISP)或网络管理员自动分配的 DNS 服务器。然而,在某些情况下,你可能希望或需要手动更改这些设置。

为什么要更改 Linux DNS 服务器地址?

更改 DNS 服务器的原因多种多样,主要包括:

  1. 提升访问速度: 某些公共 DNS 服务器(如 Google Public DNS、Cloudflare DNS)可能拥有更快的响应速度和更优化的路由,从而加快网页加载和网络应用的响应。
  2. 增强隐私保护: 一些注重隐私的 DNS 提供商(如 Cloudflare、Quad9)承诺不记录用户的查询日志,或者提供更强的隐私策略,减少个人浏览信息被追踪的风险。
  3. 提高安全性: 部分 DNS 服务(如 Quad9、OpenDNS FamilyShield)提供恶意软件、钓鱼网站过滤功能,可以在 DNS 层面阻止你访问已知的危险站点,增加一层安全防护。
  4. 绕过地理限制或审查: 在某些地区,特定的 DNS 服务器可能有助于访问被本地网络限制的内容(请遵守当地法律法规)。
  5. 使用特定功能: 例如,OpenDNS 提供了家长控制和内容过滤功能,需要将其 DNS 服务器地址配置在你的设备或路由器上。
  6. 故障排除: 当遇到无法解析域名(“找不到服务器”错误)时,更换 DNS 服务器是常见的排查步骤之一,可以判断是否是当前 DNS 服务器的问题。
  7. 内部网络需求: 企业或组织内部可能需要指向内部 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
    • 优点:速度快,稳定性高,全球分布广泛。
  • 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)。
  • OpenDNS Home:
    • IPv4: 208.67.222.222, 208.67.220.220
    • IPv6: 2620:119:35::35, 2620:119:53::53
    • 优点:提供可选的内容过滤和安全防护功能(需注册账户配置)。
  • Quad9:
    • IPv4: 9.9.9.9, 149.112.112.112
    • IPv6: 2620:fe::fe, 2620:fe::9
    • 优点:注重安全,阻止对已知恶意域名的访问,也注重隐私。

你可以根据自己的需求(速度、隐私、安全、功能)选择一组或多组 DNS 服务器。通常建议配置至少两个 DNS 地址(一个主用,一个备用)以提高可靠性。

方法一:临时修改 DNS (直接编辑 /etc/resolv.conf)

这是最直接但也通常是临时的方法。/etc/resolv.conf 文件是 Linux 系统传统上用于存储 DNS 服务器信息的地方。

步骤:

  1. 打开终端: 你可以通过应用程序菜单找到终端,或者使用快捷键(通常是 Ctrl+Alt+T)。
  2. 编辑文件: 使用你喜欢的文本编辑器(如 nano, vim, gedit)以 root 权限打开 /etc/resolv.conf。例如,使用 nano
    bash
    sudo nano /etc/resolv.conf

    输入你的用户密码以获取管理员权限。
  3. 修改内容:
    • 找到以 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 秒。
  4. 保存并退出:
    • 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 桌面环境为例,其他环境类似):

  1. 打开系统设置: 点击屏幕右上角的网络/音量/电源图标区域,选择“设置”或“有线设置”/“Wi-Fi 设置”。或者从应用程序菜单中搜索“设置”。
  2. 进入网络设置: 在设置窗口中,找到“网络”或“Wi-Fi”/“有线”选项卡。
  3. 选择连接: 找到你当前正在使用的网络连接(例如,你的 Wi-Fi 名称或“有线连接 1”),点击旁边的齿轮图标⚙️进行编辑。
  4. 配置 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。
  5. 应用更改: 点击窗口右上角的“应用”按钮。你可能需要输入管理员密码。
  6. 重新连接网络(可选但推荐): 为了确保更改立即生效,你可以断开当前网络连接再重新连接,或者直接禁用再启用该网络连接。点击设置窗口顶部的开关即可。

现在,你的特定网络连接将使用你指定的 DNS 服务器。如果你有多个网络连接(例如,同时有 Wi-Fi 和有线),你需要分别为它们配置 DNS,或者配置你常用的那个。

方法三:通过 NetworkManager (命令行 nmcli – 适用于服务器或高级用户)

如果你在没有图形界面的服务器上,或者更喜欢使用命令行,nmcli 是 NetworkManager 的命令行工具,功能强大。

步骤:

  1. 打开终端。
  2. 列出当前网络连接:
    bash
    nmcli connection show

    找到你想要修改的连接的名称(NAME 列)。假设连接名称是 MyWifiWired connection 1。记下这个名称。
  3. 查看当前 DNS 设置(可选):
    bash
    nmcli connection show "连接名称" | grep dns

    "连接名称" 替换为你的实际连接名。你会看到当前的 ipv4.dnsipv6.dns 设置。
  4. 设置 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 地址,用空格分隔。
  5. 禁用自动获取 DNS (重要): 为了防止 DHCP 服务器提供的 DNS 覆盖你的设置,你需要告诉 NetworkManager 忽略自动获取的 DNS:
    bash
    sudo nmcli connection modify "连接名称" ipv4.ignore-auto-dns yes
  6. 设置 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
  7. 应用更改: 使更改生效,需要重新激活连接。最简单的方法是:
    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 的配置文件。

步骤:

  1. 检查 systemd-resolved 状态:
    bash
    systemctl status systemd-resolved

    确认服务是 active (running)。同时,检查 /etc/resolv.conf 是否是一个符号链接:
    bash
    ls -l /etc/resolv.conf

    如果它指向 stub-resolv.conf 或类似文件,那么你很可能在使用 systemd-resolvedstub-resolv.conf 通常只包含 nameserver 127.0.0.53,表示所有查询都先发给本地的 systemd-resolved 进程。
  2. 编辑 systemd-resolved 配置文件:
    配置文件位于 /etc/systemd/resolved.conf。使用 root 权限编辑它:
    bash
    sudo nano /etc/systemd/resolved.conf
  3. 修改配置:
    • 在文件中找到 [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)。
  4. 重启 systemd-resolved 服务:
    bash
    sudo systemctl restart systemd-resolved
  5. 验证配置(重要):
    由于 /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 dhcpiface 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

    添加或修改 DNS1DNS2 (以及 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,验证设置是否生效至关重要。

  1. 检查 /etc/resolv.conf (有局限性):
    bash
    cat /etc/resolv.conf

    • 如果使用方法一,你应该直接看到你添加的 nameserver
    • 如果使用 NetworkManager (方法二/三) 且未使用 systemd-resolved,这里通常会显示你设置的 DNS。
    • 如果使用 systemd-resolved (方法四),这里可能只显示 nameserver 127.0.0.53,这表示查询被转发到本地 systemd-resolved 进程。你需要使用下面的方法来确认最终使用的服务器。
  2. 使用 dignslookup:
    这两个是强大的 DNS 查询工具。
    bash
    dig google.com
    # 或者
    nslookup google.com

    dig 的输出中,查找 ;; SERVER: 行,它会显示回答你查询的 DNS 服务器 IP 地址和端口。
    nslookup 的输出中,第一行通常会显示 Server:Address:,指明了当前使用的 DNS 服务器。
    多次运行查询,看看是否会轮流使用你配置的多个 DNS 服务器。

  3. 使用 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 服务器对你的网络来说响应较慢。尝试更换其他公共 DNS 进行测试。可以使用 namebench 等工具测试不同 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 设置!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部