在Linux系统中,DNS(域名系统)配置是网络通信的基础,它负责将人类可读的域名(如www.example.com)转换为机器可识别的IP地址,正确配置DNS不仅能确保网络连接正常,还能优化访问速度、提升安全性,本文将详细介绍Linux系统中查看、修改及排查DNS配置的多种方法,涵盖命令行工具、配置文件操作及不同发行版的差异处理。

DNS在Linux中的作用与基础概念
DNS相当于互联网的“电话簿”,当用户在浏览器输入域名时,计算机会通过DNS查询获取对应的IP地址,进而建立连接,Linux系统中,DNS配置通常存储在特定的配置文件中,由系统或网络管理工具(如NetworkManager、systemd-resolved)读取并应用,常见的DNS解析流程包括:检查本地hosts文件→查询系统DNS配置→向DNS服务器发起请求,若配置错误,可能导致域名无法解析、网络连接异常等问题。
查看当前DNS配置的方法
在排查问题或确认设置时,首先需要了解当前系统的DNS配置状态,以下是几种常用查看方法:
使用systemd-resolved查询(现代Linux系统)
较新的Linux发行版(如Ubuntu 18.04+、CentOS 8+)默认使用systemd-resolved服务管理DNS,通过以下命令可查看全局DNS配置:
resolvectl status
输出示例会显示当前DNS服务器地址(如DNS Servers: 8.8.8.8 8.8.4.4)、域名搜索列表等信息。
检查/etc/resolv.conf文件
/etc/resolv.conf是传统的DNS配置文件,直接记录了系统使用的DNS服务器,使用cat或less查看:
cat /etc/resolv.conf ``` 通常包含`nameserver`行(如`nameserver 114.114.114.114`),指定DNS服务器IP;`search`行定义域名后缀(如`search localdomain`);`domain`行指定默认域名。 #### 3. 使用`nmcli`命令(NetworkManager环境) 若系统使用NetworkManager(如Ubuntu桌面版、RHEL/CentOS),可通过`nmcli`查看网络接口的DNS配置: ```bash nmcli dev show | grep "DNS"
或针对特定接口(如eth0):
nmcli con show "eth0" | grep "ipv4.dns"
使用netstat或ss检查DNS监听状态
通过以下命令可确认DNS服务是否在监听(如systemd-resolved默认监听0.0.53:53):
ss -tuln | grep 53
或
netstat -tuln | grep 53
不同查看方法的适用场景对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
resolvectl status |
systemd-resolved管理的现代系统 | 信息全面,包含域名搜索等细节 | 依赖systemd-resolved服务 |
/etc/resolv.conf |
所有Linux系统(传统或现代) | 直接查看核心配置 | 部分系统可能被NetworkManager覆盖 |
nmcli |
NetworkManager管理的网络 | 关联网络接口,适合多网卡环境 | 需安装NetworkManager |
ss/netstat |
检查DNS服务监听状态 | 确认服务是否运行 | 仅显示监听,不包含具体DNS地址 |
修改DNS配置的方法
根据使用场景(临时修改、永久修改)和发行版差异,DNS配置方法可分为以下几类:
临时修改(重启后失效)
仅用于临时测试或快速切换DNS,重启系统或网络服务后恢复原配置:
-
方法1:直接编辑
/etc/resolv.conf
使用vim或nano打开文件,修改nameserver行:sudo vim /etc/resolv.conf
添加或修改为:
nameserver 8.8.8.8 nameserver 1.1.1.1
保存后立即生效,但NetworkManager可能覆盖该文件(需结合方法3锁定)。
-
方法2:使用
resolvectl命令
为全局或特定域设置DNS:# 设置全局DNS服务器 sudo resolvctl dns 8.8.8.8 1.1.1.1 # 为特定域设置DNS(如example.com) sudo resolvctl domain example.com 192.168.1.1
永久修改(重启后生效)
根据网络管理工具不同,永久修改方法分为以下情况:
(1)NetworkManager管理网络(Ubuntu桌面版、RHEL/CentOS等)
-
使用
nmcli命令(推荐)
为指定网络连接(如eth0)设置DNS:
# 设置静态DNS(覆盖原有配置) sudo nmcli con mod "eth0" ipv4.dns "8.8.8.8 1.1.1.1" # 更新连接并重启网络 sudo nmcli con down "eth0" && sudo nmcli con up "eth0"
若需自动获取DNS(DHCP分配),确保
ipv4.ignore-auto-dns为no:sudo nmcli con mod "eth0" ipv4.ignore-auto-dns no
-
修改NetworkManager配置文件
编辑/etc/NetworkManager/NetworkManager.conf,在main段添加:[main] dns=none
然后创建
/etc/NetworkManager/dnsmasq.d.conf,指定DNS:[main] dns=dnsmasq
并在
/etc/NetworkManager/dnsmasq.d/01-dns.conf中添加:server=8.8.8.8 server=1.1.1.1
重启NetworkManager服务:
sudo systemctl restart NetworkManager
(2)Netplan管理网络(Ubuntu Server 18.04+等)
编辑Netplan配置文件(如/etc/netplan/01-netcfg.yaml),在对应网络接口下添加nameservers:
network:
version: 2
ethernets:
eth0:
dhcp4: yes
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
search: [localdomain]
应用配置:
sudo netplan apply
(3)systemd-networkd管理网络(CentOS Stream、Debian等)
编辑网络配置文件(如/etc/systemd/network/eth0.network),添加DNS=字段:
[Match] Name=eth0 [Network] DHCP=yes DNS=8.8.8.8 1.1.1.1
重启网络服务:
sudo systemctl restart systemd-networkd
(4)直接修改/etc/resolv.conf并锁定(不推荐)
若需直接使用/etc/resolv.conf,需通过chattr锁定文件防止被NetworkManager覆盖:
sudo chattr +i /etc/resolv.conf
解锁时使用:
sudo chattr -i /etc/resolv.conf
不同发行版永久修改DNS方法对比
| 发行版/环境 | 推荐工具 | 配置文件/命令示例 | 注意事项 |
|---|---|---|---|
| Ubuntu Desktop | NetworkManager (nmcli) | nmcli con mod "eth0" ipv4.dns "8.8.8.8" |
需重启网络连接 |
| Ubuntu Server | Netplan | /etc/netplan/01-netcfg.yaml |
应用配置需运行netplan apply |
| RHEL/CentOS 7+ | NetworkManager | 同Ubuntu Desktop | 部分版本需安装NetworkManager |
| CentOS Stream | systemd-networkd | /etc/systemd/network/eth0.network |
需启用systemd-networkd服务 |
| Debian | systemd-networkd | 同CentOS Stream | 老版本可能使用ifupdown |
DNS常见问题排查
即使配置正确,DNS解析也可能因多种问题失败,以下是排查步骤:
测试DNS解析是否正常
使用nslookup、dig或ping测试域名解析:
-
nslookup(基础查询):nslookup www.baidu.com
输出应包含服务器地址(
Server: 127.0.0.53)和解析结果(Address: 182.61.200.7)。 -
dig(详细查询):
dig www.baidu.com
查看
ANSWER SECTION确认IP地址是否返回。 -
ping(连通性测试):ping www.baidu.com
若能解析出IP但ping不通,可能是网络或防火墙问题。
检查DNS服务状态
-
若使用
systemd-resolved,确认服务运行:systemctl status systemd-resolved
未运行则启动并设为开机自启:
sudo systemctl enable --now systemd-resolved
-
若使用
dnsmasq(NetworkManager的DNS缓存服务),检查状态:systemctl status dnsmasq
检查/etc/resolv.conf
确保/etc/resolv.conf可被用户读取(权限通常为644),且nameserver行格式正确(无多余空格或特殊字符),若文件被锁定(chattr +i),需先解锁再修改。
检查防火墙与SELinux
防火墙(如ufw、firewalld)可能阻止DNS查询(端口53),临时关闭防火墙测试:
sudo ufw disable # Ubuntu sudo firewall-cmd --reload # CentOS
若SELinux启用,检查是否阻止DNS服务:
sudo getenforce
若为Enforcing,可临时设为Permissive测试:
sudo setenforce 0
相关问答FAQs
Q1:修改DNS配置后不生效怎么办?
A:首先确认修改方式是否为“永久修改”(如nmcli需重启网络连接,Netplan需运行netplan apply),其次检查/etc/resolv.conf是否被NetworkManager覆盖(可通过chattr +i锁定或使用NetworkManager的配置工具),若仍不生效,尝试重启网络服务(systemctl restart NetworkManager或systemctl restart systemd-networkd),并检查防火墙或SELinux是否阻止DNS查询。
Q2:如何设置自定义DNS域名搜索列表?
A:域名搜索列表用于简化域名解析(如输入test会自动解析为test.localdomain),可通过以下方式设置:
- NetworkManager:使用
nmcli添加搜索域:sudo nmcli con mod "eth0" ipv4.dns-search "localdomain,example.com"
- Netplan:在配置文件中添加
search字段:nameservers: search: [localdomain, example.com]
- systemd-resolved:使用
resolvectl:sudo resolvctl domain eth0 localdomain example.com
修改后重启网络服务使配置生效。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/18211.html