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 推荐列表

服务商

IPv4

IPv6

特点

Google

8.8.8.8
8.8.4.4

2001:4860:4860::8888

全球覆盖

Cloudflare

1.1.1.1
1.0.0.1

2606:4700:4700::1111

隐私优先

Quad9

9.9.9.9

2620:fe::fe

安全过滤

OpenDNS

208.67.222.222

2620:119:35::35

家庭防护

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污染检测异常!")
        # 触发应急处理