在 Linux 系统中设置 DNS 可以通过多种方法实现,具体取决于你的网络配置方式(如 systemd-resolved、NetworkManager 或直接修改配置文件)以下是常见的方法,Linux系统如何高效配置DNS?这几种方法你掌握了吗?,还在为Linux DNS配置头疼?这几种高效方法你试过吗?

今天 9136阅读

在 Linux 系统中,DNS 服务器的配置可以通过多种方式实现,具体方法取决于系统使用的网络管理工具和发行版特性,现代 Linux 系统通常采用 systemd-resolved 或 NetworkManager 来管理网络配置,而传统方法则涉及直接编辑网络配置文件,无论采用哪种方式,配置完成后都应使用 nslookupdig 命令验证 DNS 解析是否生效。

方法 1:临时修改 DNS(立即生效,重启后失效)

对于需要快速测试 DNS 或临时变更的场景,可以直接修改 /etc/resolv.conf 文件,需要注意的是,大多数现代 Linux 发行版会在系统重启或网络服务重新启动时自动覆盖此文件。

1 直接写入方法

# 清空原有配置并写入新的 DNS 服务器
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "nameserver 8.8.4.4" >> /etc/resolv.conf'

注意:直接使用 sudo echo 重定向可能会因权限问题失败,建议使用 bash -ctee 命令。

2 使用 sed 命令替换

# 替换文件中的第一个 nameserver 记录
sudo sed -i '1s/^.*$/nameserver 8.8.8.8/' /etc/resolv.conf
# 添加备用 DNS(如果不存在)
grep -q "8.8.4.4" /etc/resolv.conf || sudo bash -c 'echo "nameserver 8.8.4.4" >> /etc/resolv.conf'

在 Linux 系统中设置 DNS 可以通过多种方法实现,具体取决于你的网络配置方式(如 systemd-resolved、NetworkManager 或直接修改配置文件)以下是常见的方法,Linux系统如何高效配置DNS?这几种方法你掌握了吗?,还在为Linux DNS配置头疼?这几种高效方法你试过吗? 第1张 (图片来源网络,版权归原作者所有)

方法 2:永久修改 DNS(推荐方案)

1 使用 systemd-resolved(现代 Linux 系统默认)

适用于大多数基于 systemd 的现代 Linux 发行版(Ubuntu 18.04+、Debian 10+、CentOS 8+等):

  1. 编辑配置文件

    sudo nano /etc/systemd/resolved.conf
  2. 修改配置内容(取消注释并填写):

    [Resolve]
    DNS=8.8.8.8 1.1.1.1  # 多个DNS服务器用空格分隔
    FallbackDNS=9.9.9.9  # 备用DNS
    Domains=yourdomain.com  # 搜索域
    DNSSEC=allow-downgrade  # DNS安全扩展
  3. 重启服务使配置生效

    sudo systemctl restart systemd-resolved
    sudo systemctl enable systemd-resolved
  4. 验证配置状态

    systemd-resolve --status
    resolvectl status

2 使用 NetworkManager(支持图形界面和命令行)

NetworkManager 是大多数桌面版 Linux 的默认网络管理工具,提供图形界面和命令行两种配置方式。

命令行操作:

# 查看当前网络连接名称
nmcli connection show --active
# 修改DNS配置(IPv4和IPv6)
nmcli connection modify <连接名> ipv4.dns "8.8.8.8 1.1.1.1"
nmcli connection modify <连接名> ipv6.dns "2001:4860:4860::8888"
# 设置DNS优先级(防止被DHCP覆盖)
nmcli connection modify <连接名> ipv4.ignore-auto-dns yes
nmcli connection modify <连接名> ipv6.ignore-auto-dns yes
# 应用新配置
nmcli connection up <连接名>

图形界面操作:

  1. 打开"网络设置"
  2. 选择当前网络连接 → 齿轮图标
  3. 切换到"IPv4/IPv6"标签页
  4. 将"自动(DHCP)"改为"手动"
  5. 输入DNS服务器地址(多个地址用逗号分隔)
  6. 点击"应用"

3 手动修改网络配置文件

Debian/Ubuntu 系统(使用netplan):

现代版本通常使用 netplan:

sudo nano /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.1.100/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
        search: [mydomain.com]

应用配置:

sudo netplan apply

CentOS/RHEL 系统:

sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=8.8.8.8
DNS2=1.1.1.1
PEERDNS=no  # 防止DHCP覆盖DNS设置

重启网络服务:

sudo systemctl restart network

在 Linux 系统中设置 DNS 可以通过多种方法实现,具体取决于你的网络配置方式(如 systemd-resolved、NetworkManager 或直接修改配置文件)以下是常见的方法,Linux系统如何高效配置DNS?这几种方法你掌握了吗?,还在为Linux DNS配置头疼?这几种高效方法你试过吗? 第2张 (图片来源网络,版权归原作者所有)

方法 3:防止 /etc/resolv.conf 被自动覆盖

某些系统组件(如 dhclient、NetworkManager)会定期重置 /etc/resolv.conf,可通过以下方法解决:

1 文件锁定方法

sudo chattr +i /etc/resolv.conf  # 添加不可修改属性
sudo chattr -i /etc/resolv.conf  # 需要修改时解除锁定

2 创建符号链接(systemd-resolved)

sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

3 配置DHCP客户端

编辑 /etc/dhcp/dhclient.conf

supersede domain-name-servers 8.8.8.8, 1.1.1.1;

DNS 配置验证方法

# 查看当前DNS配置
cat /etc/resolv.conf
resolvectl status  # systemd系统专用
# 测试基础解析
nslookup example.com
ping -c 3 example.com
# 详细DNS查询(需安装dnsutils或bind-utils)
dig example.com +short
dig example.com ANY  # 获取全部记录
dig @8.8.8.8 example.com  # 指定DNS服务器查询
# 检查DNS响应时间
time dig example.com
# 查看DNS缓存(如有)
systemd-resolve --statistics

高级配置与优化

本地DNS缓存配置

安装并配置 dnsmasq 提高解析效率:

sudo apt install dnsmasq  # Debian/Ubuntu
sudo yum install dnsmasq  # CentOS/RHEL
# 配置/etc/dnsmasq.conf
echo "server=8.8.8.8" | sudo tee -a /etc/dnsmasq.conf
echo "server=1.1.1.1" | sudo tee -a /etc/dnsmasq.conf
echo "cache-size=1000" | sudo tee -a /etc/dnsmasq.conf
sudo systemctl restart dnsmasq

然后修改DNS设置为127.0.0.1即可使用本地缓存。

DoH/DoT 加密DNS配置

使用加密DNS提高隐私性:

# 使用systemd-resolved配置DoT
sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1 9.9.9.9
DNSOverTLS=opportunistic

或使用 cloudflare 的DNS over HTTPS:

sudo apt install cloudflared
sudo cloudflared proxy-dns --port 5053

注意事项与最佳实践

  1. DNS服务器选择原则

    • 推荐组合使用多个供应商的DNS(如8.8.8.8+1.1.1.1+9.9.9.9)
    • 优先选择地理位置近的DNS服务器
    • 考虑使用专业DNS如OpenDNS(208.67.222.222)或Quad9(9.9.9.9)
  2. 企业环境特殊配置

    • 内网域名解析需要配置搜索域
    • 可能需要配置条件转发(特定域名使用特定DNS)
    • 注意AD域控制器的DNS要求
  3. 云服务器注意事项

    • AWS/Azure/GCP等云平台通常有特殊的元数据服务
    • 修改DNS可能影响实例元数据服务访问
    • 建议保留云厂商提供的默认DNS作为备用
  4. 故障排查流程

    graph TD
    A[DNS不工作] --> B{能ping通DNS服务器?}
    B -->|是| C[检查/etc/resolv.conf]
    B -->|否| D[检查网络连接]
    C --> E{配置正确?}
    E -->|是| F[测试dig @8.8.8.8 example.com]
    E -->|否| G[修正配置]
    F --> H{有响应?}
    H -->|是| I[检查本地防火墙]
    H -->|否| J[联系网络管理员]
  5. 安全建议

    • 定期检查DNS设置是否被恶意修改
    • 考虑使用DNSSEC验证
    • 避免使用不可信的公共DNS服务器
    • 监控异常的DNS查询流量

常见问题解答

Q:修改DNS后为什么没有立即生效? A:可能原因包括:1) 应用程序有DNS缓存;2) 系统有nscd缓存服务;3) 网络配置未完全重载,可尝试重启网络服务或清除缓存。

Q:如何彻底清除DNS缓存? A:根据系统配置不同:

# systemd-resolved
sudo systemd-resolve --flush-caches
# nscd
sudo systemctl restart nscd
# dnsmasq
sudo systemctl restart dnsmasq

Q:为什么dig和nslookup结果不同? A:可能原因:1) 查询的DNS服务器不同;2) dig默认查询A记录而nslookup可能查询其他记录;3) 缓存状态不同,建议使用+trace参数追踪完整解析路径。

通过本文介绍的多种方法,您可以根据具体需求选择最适合的DNS配置方式,对于生产环境,建议使用systemd-resolved或NetworkManager等系统集成工具进行管理,以确保配置的持久性和一致性。


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]