1.判断是否被劫持
对比三个是否相同 不相同则表示服务器dns被污染了
# 将 api.lolicon.app 更换成 你指定的域名
本地dns dig api.lolicon.app +short
Google DNS dig @8.8.8.8 api.lolicon.app +short
Cloudflare dig @1.1.1.1 api.lolicon.app +short
阿里DNS dig @223.5.5.5 api.lolicon.app +short
2.修复方法
2.1 临时方法,会随着服务器重启而还原
sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf
/etc/resolv.conf 是 临时文件,会被 NetworkManager 自动覆盖
2.2 永久修复
2.2.1 确认当前连接名称
nmcli con show
NAME UUID TYPE DEVICE
enp1s0 d267b569-f178-3e39-a628-d88fc32e3f42 ethernet enp1s0
br-1ee89c17cf72 a32cbf5e-1f89-4bf5-9833-3b15e641d68f bridge br-1ee89c17cf72
br-4cb559b08a22 df6275d2-8168-4e8b-b639-b20594e8d8d9 bridge br-4cb559b08a22
br-c136dbac66d8 53a9add8-7f1e-4b3a-b472-69134ec25e88 bridge br-c136dbac66d8
br-ed9598822592 df09683b-ca38-4e9b-885d-ed955b577278 bridge br-ed9598822592
lo 1a604d3d-0dd0-4c35-a953-270f9c75bf77 loopback lo
docker0 90482ebf-6636-4fd7-8c22-f363a8c68040 bridge docker0
2.2.2 修改dns配置
# 替换 YOUR_CONNECTION_NAME 为实际名称(如"enp1s0")
sudo nmcli con mod "YOUR_CONNECTION_NAME" ipv4.dns "8.8.8.8 1.1.1.1"
sudo nmcli con mod "YOUR_CONNECTION_NAME" ipv4.ignore-auto-dns yes
2.2.3 应用配置
sudo nmcli con down "YOUR_CONNECTION_NAME" && sudo nmcli con up "YOUR_CONNECTION_NAME"
2.2.4 验证
# 重启
reboot
# 连接后 查看dns
cat /etc/resolv.conf
3.避免dns污染
1. 全球公共 DNS 推荐列表
2. CentOS 永久配置方法
# 使用 nmcli 修改主连接
sudo nmcli con mod enp1s0 ipv4.dns "9.9.9.9 149.112.112.112"
sudo nmcli con mod enp1s0 ipv6.dns "2620:fe::fe 2620:fe::9"
sudo nmcli con mod enp1s0 ipv4.ignore-auto-dns yes
sudo nmcli con mod enp1s0 ipv6.ignore-auto-dns yes
# 应用配置
sudo nmcli con down enp1s0 && sudo nmcli con up enp1s0
3. DNS-over-HTTPS (DoH) 配置
# 安装 cloudflare 的 doh-client
sudo yum install epel-release -y
sudo yum install doh-client -y
# 配置文件 /etc/dns-over-https/doh-client.conf
listen = [
"127.0.0.1:5353",
]
upstream = [
"https://1.1.1.1/dns-query",
"https://dns.google/dns-query",
]
# 设置系统使用本地 DoH
sudo nmcli con mod enp1s0 ipv4.dns "127.0.0.1"
sudo nmcli con mod enp1s0 ipv4.dns-options "port=5353"
3.1 DNS-over-TLS (DoT) 配置
# 使用 systemd-resolved
sudo vi /etc/systemd/resolved.conf
[Resolve]
DNS=9.9.9.9#dns.quad9.net
DNSOverTLS=yes
4. 部署本地 DNS 缓存服务器
# 安装 Unbound
sudo yum install unbound -y
# 配置文件 /etc/unbound/unbound.conf
server:
tls-cert-bundle: "/etc/pki/tls/certs/ca-bundle.crt"
do-udp: yes
do-tcp: yes
interface: 127.0.0.1
access-control: 127.0.0.0/8 allow
forward-zone:
name: "."
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 1.1.1.1@853#cloudflare-dns.com
4.1 配置系统使用本地解析
sudo vi /etc/resolv.conf
nameserver 127.0.0.1
options edns0 single-request-reopen
5. 验证防护效果
5.1 检测
# 安装 dns 诊断工具
sudo yum install bind-utils wireshark-cli -y
# 运行检测
dig +short porttest.dns.google @8.8.8.8 | grep -E '53$'
# 正常应返回:edns0-client-subnet 8.8.8.8/32
# 抓包验证加密
tshark -i any -Y "dns" -T fields -e dns.qry.name -e ip.src
5.2 自动化监控脚本
#!/usr/bin/env python3
import dns.resolver
def check_dns_pollution(domain="twitter.com"):
try:
answers = dns.resolver.resolve(domain, 'A')
return all(ip.address.startswith(('104.244', '199.59')) for ip in answers)
except:
return False
if __name__ == "__main__":
if not check_dns_pollution():
print("DNS污染检测异常!")
# 触发应急处理