防止dns劫持的核心防御措施是:一、技术层面启用dnssec、使用加密dns(doh/dot)、更换可信dns服务商、加固dns服务器并监控流量;二、管理层面及时打补丁、加强安全培训、建立应急机制;三、用户层面优先用https、不点陌生链接、安装安全软件。

防止黑客篡改 DNS 设置,核心不是“防人”,而是让关键配置文件无法被非授权写入或覆盖。系统级加锁的关键在于:锁定 /etc/resolv.conf 文件本身,并切断自动服务对它的直接写入路径。
锁定 resolv.conf 文件权限与属性
这是最直接有效的防护动作,适用于所有主流 Linux 发行版(如 Ubuntu、CentOS、Debian):
-
重设归属:运行
sudo chown root:root /etc/resolv.conf,确保只有 root 能拥有该文件 -
收紧权限:运行
sudo chmod 644 /etc/resolv.conf,使 owner 可读写,group 和 others 仅可读 -
启用不可变标志(推荐):运行
sudo chattr +i /etc/resolv.conf,加锁后连 root 也无法编辑或删除,必须先执行chattr -i才能修改
验证是否生效:执行 ls -l /etc/resolv.conf 应显示 -rw-r--r-- 1 root root;执行 lsattr /etc/resolv.conf 应看到含 i 标志(如 ----i--------e---)。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
阻断自动服务的写入行为
单纯加锁 resolv.conf 后,若 NetworkManager、systemd-resolved 或 dhclient 仍试图覆盖它,会导致服务异常或日志报错。必须同步禁用其直接写入能力:
-
NetworkManager:编辑
/etc/NetworkManager/NetworkManager.conf,在[main]段下添加dns=none,然后重启服务:sudo systemctl restart NetworkManager -
systemd-resolved:确保它不接管
resolv.conf,检查/etc/systemd/resolved.conf中的ResolveConf=是否设为no或stub,并确认/etc/resolv.conf是指向/run/systemd/resolve/stub-resolv.conf的软链接(若不是,可重建:sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf) -
dhclient:在
/etc/dhcp/dhclient.conf中添加supersede domain-name-servers 1.1.1.1, 8.8.8.8;,从 DHCP 获取阶段就固定 DNS,避免后续覆盖
改用受控的 DNS 管理机制
比硬锁更稳健的做法,是放弃直接维护 resolv.conf,转而使用系统原生支持的受控机制:
-
systemd-resolved:配置
/etc/systemd/resolved.conf的DNS=行(例如DNS=1.1.1.1 8.8.8.8),启用 DNSSEC(DNSSEC=yes),再执行sudo systemctl restart systemd-resolved -
resolvconf 工具(Debian/Ubuntu):将静态 DNS 写入
/etc/resolvconf/resolv.conf.d/head,再运行sudo resolvconf -u,由工具统一生成并保护最终文件 -
静态网卡配置(RHEL/CentOS):在
/etc/sysconfig/network-scripts/ifcfg-*中设置DNS1=1.1.1.1、DNS2=8.8.8.8,并确保PEERDNS=no
Windows 平台等效防护要点
Windows 不依赖 resolv.conf,但同样需防 DNS 劫持和篡改:
- 在“网络适配器属性 → IPv4 属性 → 高级 → DNS”中,勾选“使用以下 DNS 服务器地址”,手动填入可信 DNS(如
1.1.1.1、8.8.8.8),并取消勾选“在 DNS 中注册此连接的地址”(防恶意注册覆盖) - 启用 DNS over HTTPS(DoH):在“设置 → 网络和 Internet → DNS 服务器分配 → 编辑”中,打开 IPv4 手动设置,填入加密 DNS 地址(如
https://dns.google/dns-query),并将“首选 DNS 加密”设为“仅加密(通过 HTTPS 的 DNS)” - 管理员权限下运行:
netsh dns add encryption "1.1.1.1" "https://cloudflare-dns.com/dns-query",确保系统识别该地址为加密源;再执行ipconfig /flushdns清除旧缓存










