编辑
/etc/resolv.conf
添加 nameserver
行,或用 nmcli
命令设置 DNS 后重启Linux命令行配置DNS完全指南
DNS基础概念
1 什么是DNS?
域名系统(Domain Name System,DNS)是互联网的电话簿,负责将人类可读的域名(如www.example.com)转换为计算机可识别的IP地址(如192.0.2.1),每次访问网站时,系统都会通过DNS查询获取目标服务器的IP地址。
2 DNS工作流程
- 客户端请求:应用程序发起DNS查询请求
- 递归查询:DNS服务器逐级查询权威服务器
- 缓存机制:中间结果会被缓存加速后续查询
- 最终响应:返回最终IP地址给客户端
Linux系统DNS配置文件
文件路径 | 适用场景 | 优先级 |
---|---|---|
/etc/resolv.conf | 传统手动配置 | 高 |
NetworkManager | Desktop环境动态管理 | 中 |
systemdresolved | 现代系统服务管理 | 低 |
/etc/sysconfig/networkscripts/ifcfg* | 网络接口绑定配置 | 特定接口 |
1 /etc/resolv.conf文件
nameserver 8.8.8.8 # Google公共DNS
nameserver 8.8.4.4 # 备用DNS
search example.com # 域名后缀搜索域
options ndots:1 # 配置选项
2 NetworkManager配置
# 查看当前连接配置 nmcli connection show "Wired connection 1" # 修改DNS服务器 nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 8.8.4.4" # 设置DNS搜索域 nmcli connection modify "Wired connection 1" ipv4.ignoreautodns yes nmcli connection modify "Wired connection 1" ipv4.dnssearch "example.com"
DNS配置实战操作
1 静态DNS配置方法
# 直接编辑resolv.conf sudo nano /etc/resolv.conf # 添加以下内容: nameserver 1.1.1.1 # Cloudflare DNS nameserver 1.0.0.1 # 备用DNS search localdomain # 本地网络搜索域
2 动态DNS管理(NetworkManager)
# 查看当前DNS配置 nmcli dev show | grep DNS # 添加新DNS服务器 nmcli con mod "YourConnectionName" +ipv4.dns "9.9.9.9" # 删除现有DNS配置 nmcli con mod "YourConnectionName" ipv4.dns "8.8.8.8"
3 使用systemdresolved配置
# 编辑全局DNS配置 sudo nano /etc/systemd/resolved.conf # 配置示例: [Resolve] DNS=9.9.9.9 149.112.112.112 Domain~.localhost LLMNR=no MultiCastDNS=yes
公共DNS服务器推荐
服务商 | IP地址 | 特点 |
---|---|---|
Google Public DNS | 8.8.8 / 8.8.4.4 | 速度快,全球覆盖 |
Cloudflare | 1.1.1 / 1.0.0.1 | 隐私保护,恶意软件拦截 |
OpenDNS | 67.222.222 / 208.67.220.220 | 家庭友好,内容过滤 |
AliDNS | 5.5.5 / 223.6.6.6 | 国内访问优化 |
Quad9 | 9.9.9 / 149.112.112.112 | 安全阻断,恶意软件防护 |
DNS配置验证方法
1 基本连通性测试
# 测试域名解析 ping c 3 www.baidu.com # 显示完整解析路径 dig +trace www.baidu.com
2 DNS专项测试工具
# 使用dig查询详细信息 dig www.example.com +nocmd +noall +answer # 测试多个DNS服务器响应时间 for server in 8.8.8.8 1.1.1.1 9.9.9.9; do echo $server; dig @$server www.google.com +time=1; done
3 高级诊断命令
# 显示DNS缓存状态 sudo systemdresolve flushcaches # 查看网络接口DNS配置 ip 4 route show | grep proto
常见问题解决方案
1 配置不生效怎么办?
症状 | 原因分析 | 解决方案 |
---|---|---|
修改后仍使用旧DNS | NetworkManager缓存未更新 | sudo systemctl restart NetworkManager |
resolv.conf被重置 | 系统服务自动覆盖 | 禁用systemdresolved或NetworkManager管理 |
仅生效一个DNS | 配置文件语法错误 | 检查空格和注释格式 |
2 DNS污染/劫持处理
# 启用DNSSEC验证(需要系统支持) sudo nano /etc/resolv.conf # 添加以下行: options edns0 trustad
高级配置技巧
1 按接口指定DNS服务器
# 编辑网络接口配置文件(以CentOS为例) sudo nano /etc/sysconfig/networkscripts/ifcfgeth0 # 添加以下配置: DNS1=8.8.8.8 DNS2=8.8.4.4 DEFROUTE=no PEERDNS=no PEERROUTES=no
2 使用splitdns实现智能解析
# 安装bindutils工具包(包含host/dig等) sudo apt install bindutils # 创建本地hosts文件规则 echo "192.168.1.100 mail.local" | sudo tee a /etc/hosts
安全注意事项
- 避免使用不可靠DNS:不要随意使用未知来源的DNS服务器
- 定期清理缓存:
sudo systemdresolve flushcaches
- 启用加密DNS:考虑部署DoH/DoT(需应用支持)
- 限制DNS查询权限:通过防火墙规则控制访问范围
- 监控异常流量:使用tcpdump观察DNS查询模式
sudo tcpdump i any port 53 c 100
Q&A常见问题解答
Q1:如何测试当前DNS配置是否生效?
A:可以使用以下命令组合验证:
# 查看当前使用的DNS服务器 cat /etc/resolv.conf | grep nameserver # 测试域名解析功能 dig www.google.com @8.8.8.8 # 检查网络接口配置 nmcli dev show | grep IP4.DNS
如果所有命令都能正确返回预期结果,说明DNS配置已生效。
Q2:如何设置自定义DNS并防止被系统自动覆盖?
A:需要根据系统类型采取不同策略:
- 禁用NetworkManager管理:
nmcli connection edit "YourConnection" set ipv4.ignoreautodns yes
- 禁用systemdresolved服务:
sudo systemctl stop systemdresolved sudo systemctl disable systemdresolved
- 持久化配置:将自定义DNS写入/etc/resolv.conf后,使用以下命令防止覆盖:
sudo chattr +i /etc/resolv.