在Linux系统中,DNS(域名系统)配置是网络连接的基础,它负责将人类可读的域名(如www.example.com)转换为机器可识别的IP地址,正确的DNS配置能确保系统高效访问互联网、内网服务或特定资源,本文将详细介绍Linux系统中添加DNS的多种方法,涵盖不同发行版和场景,并附上注意事项和验证步骤。
DNS配置基础:核心概念与文件
在Linux中,DNS配置的核心是告诉系统使用哪些DNS服务器进行域名解析,这些信息通常存储在特定配置文件中,常见的包括:
/etc/resolv.conf
:传统的DNS解析配置文件,直接列出DNS服务器地址。- 网络管理工具的配置文件(如NetworkManager的ifcfg文件、netplan的yaml文件等):通过网络管理工具动态管理DNS,优先级高于直接修改
/etc/resolv.conf
。 /etc/systemd/resolved.conf
:systemd-resolved
服务的配置文件,用于管理本地DNS缓存和上游服务器。
需要注意的是,直接编辑/etc/resolv.conf
在某些系统(如使用NetworkManager或systemd-resolved的系统)中可能被覆盖,因此推荐使用网络管理工具或系统服务进行配置。
方法一:直接编辑/etc/resolv.conf(临时/简单场景)
/etc/resolv.conf
是Linux中最直接的DNS配置文件,适用于快速测试或临时修改,但需注意其可能被网络管理工具覆盖。
操作步骤:
-
查看当前配置
使用cat
或less
命令查看文件内容:cat /etc/resolv.conf
输出示例:
# Generated by NetworkManager nameserver 8.8.8.8 nameserver 8.8.4.4
其中
nameserver
行指定DNS服务器地址,可多个,按优先级顺序排列。 -
编辑配置文件
使用vim
或nano
等文本编辑器(需root权限):sudo vim /etc/resolv.conf
添加或修改
nameserver
行,例如使用公共DNS(如Google DNS:8.8.8
、8.4.4
,或Cloudflare DNS:1.1.1
、0.0.1
),或内网DNS服务器(如168.1.1
)。 -
保存并退出
在vim
中按Esc
,输入wq
保存退出。
注意事项:
- 临时性:在Ubuntu、CentOS等使用NetworkManager或systemd-resolved的系统中,重启网络服务或系统后,
/etc/resolv.conf
可能被重置为默认值。 - 权限:文件需root权限编辑,普通用户需通过
sudo
执行。 - 格式规范:每行一个
nameserver
,注释以开头,避免语法错误(如多余空格)。
方法二:使用NetworkManager管理DNS(桌面/服务器通用)
NetworkManager是大多数Linux发行版(如Ubuntu、CentOS、Fedora)的默认网络管理工具,支持通过命令行或图形界面动态配置DNS,且会自动更新/etc/resolv.conf
,避免被覆盖。
场景1:命令行配置(nmcli)
nmcli
是NetworkManager的命令行工具,适用于服务器或无界面环境。
-
查看当前网络连接
nmcli connection show
记录要修改的连接名称(如
eno1
、Wired connection 1
)。 -
配置DNS服务器
为指定连接添加DNS服务器(可多个,用空格分隔):sudo nmcli connection modify "连接名称" ipv4.dns "8.8.8.8 8.8.4.4 1.1.1.1"
为
eno1
添加Google和Cloudflare DNS:sudo nmcli connection modify eno1 ipv4.dns "8.8.8.8 1.1.1.1"
-
重启网络连接生效
sudo nmcli connection down "连接名称" && sudo nmcli connection up "连接名称"
或直接重启NetworkManager服务(影响所有连接):
sudo systemctl restart NetworkManager
-
验证配置
检查/etc/resolv.conf
是否更新:cat /etc/resolv.conf | grep nameserver
或使用
nmcli
查看连接属性:nmcli connection show "连接名称" | grep ipv4.dns
场景2:图形界面配置(NetworkManager-applet)
在桌面版Linux中,可通过系统托盘的网络图标配置DNS:
- 点击网络图标,选择“有线设置”或“Wi-Fi设置”。
- 点击当前连接的齿轮图标(“网络设置”),进入连接详情。
- 选择“IPv4”或“IPv6”标签页,在“DNS服务器”字段中输入DNS地址(如
8.8.8,1.1.1.1
),用逗号分隔。 - 点击“应用”,系统会自动保存并重启网络服务。
注意事项:
- 连接优先级:NetworkManager会优先使用当前活动连接的DNS配置,多网卡环境下需为每个连接单独配置。
- DHCP与DNS:如果通过DHCP自动获取IP,DHCP服务器可能会下发DNS配置,此时需在NetworkManager中禁用DHCP DNS(勾选“自动DNS”选项为关闭)或覆盖DHCP配置。
方法三:使用systemd-resolved管理DNS(现代系统默认)
systemd-resolved
是systemd套件的一部分,提供本地DNS缓存和解析服务,广泛应用于Ubuntu 18.04+、Fedora等系统,它通过/etc/systemd/resolved.conf
配置,并管理/etc/resolv.conf
的符号链接(默认指向/run/systemd/resolve/stub-resolv.conf
)。
操作步骤:
-
查看systemd-resolved状态
确保服务已运行:systemctl status systemd-resolved
若未运行,启动并启用:
sudo systemctl enable --now systemd-resolved
-
编辑resolved.conf配置文件
sudo vim /etc/systemd/resolved.conf
取消注释并修改以下行(默认为注释):
# DNS= # 指定上游DNS服务器,多个用空格分隔,如 DNS=8.8.8.8 1.1.1.1 # FallbackDNS= # 备用DNS服务器,当主DNS不可用时使用 # DNSStubListener=yes # 监听本地53端口(默认开启,提供DNS缓存)
配置Google和Cloudflare DNS:
DNS=8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 FallbackDNS=114.114.114.114 223.5.5.5
-
重启systemd-resolved服务
sudo systemctl restart systemd-resolved
-
验证DNS解析
使用resolvectl
命令(systemd-resolved的工具)查看解析状态:resolvectl status
输出应包含配置的DNS服务器和缓存信息。
测试域名解析:resolvectl www.example.com
注意事项:
/etc/resolv.conf
的符号链接:默认情况下,/etc/resolv.conf
指向/run/systemd/resolve/stub-resolv.conf
,直接修改无效,若需手动管理,可删除符号链接并创建新文件(但不推荐,可能影响系统功能)。- DNS缓存:
systemd-resolved
默认开启本地缓存(Cache= yes
),可通过resolvectl query
查询缓存命中情况。
方法四:针对特定发行版的配置(如netplan)
Ubuntu Server 18.04+、Debian 10+等系统使用netplan
作为网络配置工具,通过yaml文件管理网络和DNS。
操作步骤:
-
查找netplan配置文件
通常位于/etc/netplan/
目录下,如01-network-manager-all.yaml
或50-cloud-init.yaml
。 -
编辑yaml文件
sudo vim /etc/netplan/01-network-manager-all.yaml
在网络接口配置中添加
nameservers
节点,指定DNS服务器:network: version: 2 ethernets: eno1: # 网络接口名称 dhcp4: yes dhcp6: no nameservers: addresses: [8.8.8.8, 1.1.1.1, 114.114.114.114] # DNS服务器列表 search: [example.com] # 可选:域名后缀,如内部域名解析
-
应用配置
sudo netplan apply
或
netplan --debug apply
(调试模式,查看错误)。 -
验证配置
检查/etc/resolv.conf
是否更新:cat /etc/resolv.conf
或使用
nslookup
测试:nslookup www.example.com
注意事项:
- yaml语法:缩进必须使用2个空格,不能使用tab键;冒号后需加空格。
- 静态IP配置:若使用静态IP,需在
ethernets
下添加addresses
、gateway4
等参数,DNS仍通过nameservers
配置。
DNS配置验证与故障排查
配置完成后,需验证DNS解析是否生效,常见工具包括:
-
nslookup
nslookup www.example.com
若返回IP地址,则解析成功;若超时或报错,检查DNS服务器可达性(
ping 8.8.8.8
)。 -
dig
dig www.example.com
显示详细的DNS解析过程,包括查询的DNS服务器、响应时间等。
-
ping
ping www.example.com
通过域名测试网络连通性,依赖DNS解析成功。
常见问题:
- DNS解析超时:检查DNS服务器是否可达(
ping DNS_IP
),或更换公共DNS测试。 /etc/resolv.conf
被重置:确认是否使用NetworkManager/netplan/systemd-resolved管理,避免直接修改该文件。- 特定域名无法解析:检查
/etc/hosts
文件是否有错误条目,或DNS服务器是否支持该域名(如内网域名需配置正确的DNS后缀)。
不同配置方法对比总结
为方便选择,以下表格总结常见DNS配置方法的适用场景和特点:
配置方法 | 适用场景 | 配置文件/命令 | 生效方式 | 优点 | 缺点 |
---|---|---|---|---|---|
直接编辑/etc/resolv.conf |
临时测试、简单场景 | /etc/resolv.conf |
立即生效,但可能被覆盖 | 操作简单,无需额外工具 | 不稳定,重启后可能失效 |
NetworkManager(nmcli) | 通用桌面/服务器,动态管理 | nmcli connection modify |
重启网络连接后生效 | 自动维护/etc/resolv.conf |
需熟悉nmcli命令 |
systemd-resolved | 现代系统(Ubuntu 18.04+等) | /etc/systemd/resolved.conf |
重启服务后生效 | 提供DNS缓存,支持多DNS策略 | 配置相对复杂,依赖systemd |
netplan | Ubuntu Server、Debian等yaml配置系统 | /etc/netplan/*.yaml |
执行netplan apply 后生效 |
统一管理网络和DNS,适合服务器 | 需掌握yaml语法 |
相关问答FAQs
Q1:为什么修改了DNS配置后,域名解析仍然失败?
A:可能原因包括:
- DNS服务器不可达:检查网络连通性(
ping DNS_IP
),确认DNS服务器未屏蔽或故障。 - 配置文件未生效:若使用NetworkManager/netplan,需重启网络服务或应用配置;若直接修改
/etc/resolv.conf
,确认文件未被其他工具覆盖。 - 本地缓存问题:清理本地DNS缓存(如
sudo systemctl flush-dns
或重启systemd-resolved
服务)。 /etc/hosts
冲突:检查/etc/hosts
文件中是否有错误条目覆盖了域名解析。
Q2:如何为Linux系统的不同网络接口配置不同的DNS?
A:通过NetworkManager或netplan可实现多网卡DNS隔离:
- NetworkManager:为每个网络连接单独配置DNS。
eno1
连接使用8.8.8
,wlan0
连接使用1.1.1
:sudo nmcli connection modify eno1 ipv4.dns "8.8.8.8" sudo nmcli connection modify wlan0 ipv4.dns "1.1.1.1" sudo nmcli connection down eno1 && sudo nmcli connection up eno1 sudo nmcli connection down wlan0 && sudo nmcli connection up wlan0
- netplan:在yaml文件中为不同接口配置
nameservers
:network: version: 2 ethernets: eno1: dhcp4: yes nameservers: addresses: [8.8.8.8] wlan0: dhcp4: yes nameservers: addresses: [1.1.1.1]
执行
sudo netplan apply
后,每个接口将使用配置的DNS服务器。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/26709.html