2025年07月08日/ 浏览 88
在Linux系统中,/etc/resolv.conf是域名解析的核心配置文件。这个看似简单的文本文件,实际承担着将人类可读的域名转换为机器识别的IP地址的重要任务。当你在终端输入ping example.com时,系统首先会查阅这个文件来确定向哪个DNS服务器发起查询。
典型的resolv.conf文件包含以下关键参数:
plaintext
nameserver 8.8.8.8
nameserver 8.8.4.4
domain example.com
search example.com sub.example.com
options timeout:2 attempts:3 rotate
其中nameserver行最为关键,系统会按顺序尝试列出的DNS服务器(通常建议配置3个以内)。search域则在解析不完整域名时自动尝试添加后缀,比如输入ping web可能实际查询web.example.com。
随着Linux系统的发展,resolv.conf的管理方式经历了重大变化。传统直接编辑文件的方法在现代发行版中可能失效,主要原因在于:
bash
sudo vi /etc/resolv.conf
nameserver 10.0.0.1
nameserver 192.168.1.1
为防止重启后配置丢失,需修改/etc/sysconfig/network-scripts/ifcfg-eth0(RHEL系)或/etc/network/interfaces(Debian系)添加:
plaintext
PEERDNS=no
DNS1=10.0.0.1
DNS2=192.168.1.1
bash
nmcli con modify "有线连接1" ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con modify "有线连接1" ipv4.dns-search "example.com"
nmcli con up "有线连接1"
使用nmcli device show可验证当前DNS配置。
bash
sudo systemctl enable systemd-resolved
sudo systemctl start systemd-resolved
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
配置应写入/etc/systemd/resolved.conf:
ini
[Resolve]
DNS=1.1.1.1 9.9.9.9
Domains=~example.com
使用dig命令可以测试不同DNS服务器的响应速度:
bash
dig example.com @8.8.8.8 | grep "Query time"
dig example.com @1.1.1.1 | grep "Query time"
当系统存在多个网络接口时,可通过指标(metric)控制优先级:
bash
ip route show default | grep metric
症状:修改resolv.conf后配置自动还原
解决方案:检查是否被NetworkManager或resolvconf服务管理
症状:DNS查询超时
解决方案:
bash
systemd-resolve --statistics # 查看缓存命中率
sudo tcpdump -i eth0 port 53 # 抓取DNS查询包
症状:特定域名解析失败
解决方案:
bash
host example.com # 基础查询
host -a example.com # 详细查询
使用DNS-over-TLS:ini
[Resolve]
DNS=9.9.9.9
DNSOverTLS=yes
限制DNS服务器访问:
bash
sudo iptables -A OUTPUT -p udp --dport 53 -d 8.8.8.8 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j DROP
定期清理DNS缓存:
bash
sudo systemd-resolve --flush-caches