Fix DNS Poisoning
上个月,发现“cloudflare.com”被解析为“127.0.0.1”,于是研究了一下DNS污染。
1. 检测
可以直接使用相关网站,检查各个DNS针对指定域名的解析是否正确。例如:
也可以使用命令或工具,查询使用指定DNS解析指定域名的结果。nslookup
命令的示例如下:
# nslookup 域名 DNS地址
nslookup cloudflare.com 223.5.5.5
2. 解决方案
一般设置DNS为可靠的共用DNS即可。由于是网络运营商的DNS发现的污染,所以不推荐使用三大运营商的DNS。暂时改为使用“阿里公共DNS”。
最简单的是,修改网络出口设备(例如路由器)的DNS,所有网络设备(例如手机、电脑)都使用其默认DNS。比较麻烦的是,各个网络设备各自设置DNS。
国内外的免费公共DNS,可参考:
几个比较有名的DNS如下:
3. 扩展内容
3.1. 关于nslookup
命令
一般各大系统都有nslookup
命令。对于Debian 11和Ubuntu 22.04,可能没有默认安装nslookup
,需要手动安装。
# Debian或Ubuntu,安装nslookup命令
sudo apt install bind9-dnsutils
# 查看域名的DNS A记录解析
nslookup -type=A cloudflare.com 223.5.5.5
该命令的详细说明,可以参考man nslookup
或Debian官方文档:nslookup(1) — bind9-dnsutils — Debian bookworm — Debian Manpages
3.2. 如何修改DNS配置
3.2.1. 总结
- 路由器,进入其管理后台,修改DNS配置。
- 网络终端设备(电脑,手机等),需要明确配置DNS的范围,一般是:全局、指定网络接口、指定代理服务。
- 全局DNS,需确定管理DNS服务的程序,再修改其配置文件。
- 指定网络接口的DNS,一般修改其网卡设置。
- 代理服务的DNS,一般不走本地设置,需要参考该代理服务的配置说明。
3.2.2. 关于配置全局DNS
对于Linux(例如Debian 12),一般查看/etc/resolv.conf
文件,可以了解当前使用什么DNS。直接修改该文件,可以更改当前全局DNS,例如:
# 设置DNS为阿里DNS
nameserver 223.5.5.5
但是,如果有其它程序接管了/etc/resolv.conf
文件,比如systemd-resolved服务,系统重启后会该文件被重置,导致设置无效。注意各个系统的情况不同,比如:
- Debian 11/12,默认没有安装systemd-resolved
- Ubuntu 22.04,默认安装并启用systemd-resolved
3.2.3. 关于配置网络接口DNS
图形界面,通过网络配置,修改相应的DNS。
- 例如Ubuntu 22.04,使用NetworkManager管理。网络接口的配置文件在
/etc/NetworkManager/system-connections/
- 例如Ubuntu 22.04,使用NetworkManager管理。网络接口的配置文件在
命令界面,一般修改配置文件
/etc/network/interfaces
。- 例如Debian 11/12,其示例配置如下:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp3s0
#iface enp3s0 inet dhcp
iface enp3s0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 223.5.5.5 192.168.0.1
3.3. 管理DNS缓存
3.3.1. Linux的DNS缓存
- 使用
systemd-resolve
,适合Ubuntu 20.04及以下、Debian 11/12等。
# 清除DNS缓存
sudo systemd-resolve --flush-caches
# 查看DNS缓存情况
sudo systemd-resolve --statistics
对于Debian 11/12,需要启用systemd-resolve服务。
sudo systemctl enable systemd-resolved.service
- 使用
resolvectl
,适合Ubuntu 20.04以上。
# 清除DNS缓存
sudo resolvectl flush-caches
# 查看DNS缓存情况
sudo resolvectl statistics
- 重启网络服务,清除DNS缓存,适合一般Linux。
# 基于Init.d的系统
sudo /etc/init.d/networking restart
# 基于SystemD的系统
sudo service networking restart
3.3.2. Windows的DNS缓存
rem 清除DNS缓存
ipconfig /flushdns
3.3.3. Chrome浏览器的DNS缓存
Chrome本身建立了自己的DNS缓存,并提供简单的管理功能。打开链接:chrome://net-internals/#dns 即可。