在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