防止域名劫持需严格限制/etc/resolv.conf权限:设为root:root所有者、644权限,并用chattr +i加不可变属性;若使用networkmanager等服务,须禁用其自动写入,或改用systemd-resolved、resolvconf等受控dns管理机制。

要防止域名劫持,仅靠修改 /etc/resolv.conf 或设置 DNS 服务器并不足够。真正关键的一环是确保 DNS 解析配置文件不被恶意篡改——尤其是 Linux 系统中负责指定 DNS 服务器的客户端解析文件(如 /etc/resolv.conf)的权限控制。
为什么需要限制 /etc/resolv.conf 文件权限
该文件明文存储 DNS 服务器地址(如 nameserver 8.8.8.8)。若攻击者获得普通用户或低权限进程的写入能力,就可能注入恶意 DNS 地址,将你的域名请求重定向到钓鱼或中间人服务器,造成静默劫持。默认情况下该文件常为 root 可写、其他用户可读,存在风险。
正确设置 resolv.conf 权限与归属
执行以下命令锁定文件,防止非 root 用户修改:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
-
更改所有者和用户组:运行
sudo chown root:root /etc/resolv.conf -
收紧文件权限:运行
sudo chmod 644 /etc/resolv.conf(即 owner 可读写,group 和 others 仅可读) -
启用不可变属性(推荐):运行
sudo chattr +i /etc/resolv.conf,这样连 root 也无法直接编辑或删除,必须先执行chattr -i才能修改
⚠️ 注意:启用 +i 后,若你使用 NetworkManager、systemd-resolved 或 dhclient 等服务自动更新 DNS,需先禁用其对 resolv.conf 的写入行为(例如配置 NetworkManager 使用 dns=none 或指向 resolvconf 工具),否则会导致服务报错或覆盖失败。
替代方案:使用受控的 DNS 管理机制
手动锁定 resolv.conf 在动态网络环境中易被覆盖。更稳健的做法是绕过直接写入,改用系统级 DNS 管理:
- 启用
systemd-resolved并配置/etc/systemd/resolved.conf中的DNS=行,然后运行sudo systemctl restart systemd-resolved,再让/etc/resolv.conf指向/run/systemd/resolve/stub-resolv.conf(通常已默认设置) - 使用
resolvconf工具(Debian/Ubuntu 常见):将静态 DNS 配置写入/etc/resolvconf/resolv.conf.d/head,再运行sudo resolvconf -u,由工具统一生成并保护最终文件 - 在 DHCP 客户端配置中硬编码 DNS(如
/etc/dhcp/dhclient.conf添加supersede domain-name-servers 1.1.1.1, 8.8.8.8;),从源头避免被覆盖
验证是否生效
完成设置后,执行以下检查:
- 运行
ls -l /etc/resolv.conf,确认显示-rw-r--r-- 1 root root - 运行
lsattr /etc/resolv.conf,应看到----i---------(含i标志) - 尝试用普通用户执行
echo "nameserver 9.9.9.9" | sudo tee /etc/resolv.conf,应失败;若启用了+i,连sudo也会被拒绝 - 用
nslookup google.com或dig @1.1.1.1 google.com测试解析是否正常,确保未因权限改动导致 DNS 失效










