DNS Protection

DNS Protection

  • 注意,本文的主题不是DNSSEC

DNS明文风险

将遭遇DNS劫持、DNS污染

网域服务器缓存污染(英语:DNS cache pollution)、DNS污染DNS劫持,是一种破坏域名系统查询解析的行为[1],通常由计算机程序自动执行,从而导致DNS服务器缓存错误记录,又称域名服务器缓存投毒(DNS cache poisoning)和DNS缓存投毒污染一词可能取自域名系统域名解析之特性,若递归DNS解析器查询上游时收到错误回复,所有下游也会受影响。

这些篡改可能是出于恶意目的,例如网络钓鱼;也可能是出于互联网服务提供商(ISP)的自身目的,例如防火长城以及公共或路由器提供的DNS服务提供商将用户的网络流量引导至ISP自己的web服务器,以便投放广告、收集统计数据或实现ISP的其他目的;还可能是DNS服务提供商为了阻止对特定域名的访问而采取的一种审查形式。

zh.wikipedia.org

说人话就是,DNS Request请求网站A记录(ipv4),DNS Response有问题。

问题在:

1.为什么要DNS污染

在OSI七层模型中,你可以将它视作打地基(数据链路层和物理层之上)的行为,为Packet的网络层、传输层打地基。正向DNS(我们讨论)向DNS Server发送DNS Query,返回的A/AAAA记录包含IP地址,下一步会就是(简单地假设)建立TCP连接。也就是DNS(在没有host的情况下)对于TCP连接来说是必要不充分条件,而ISP对一些内容予以屏蔽,便可以采用这种方式。

2.如何?

使用DNS报文抢答,DNS服务器缓存投毒,DNS重定向,他们互有交集。但是离不开深度包检测

3.深度包检测

能够解析OSI七层模型的流量

4.DNS报文抢答

进行旁路抢答,对于Destination53端口的Source==中国IP,构造(伪造)DNS报文请求,返回一个空的IP、错误的IP。到应用层即第七层。

5.DNS缓存投毒

如题

6.DNS重定向

1.到第四层即网络层,采用PBR策略路由(对于Destination Port 53,路由到污染的DNS服务器)。

2.到第三层即传输层,对于匹配的DNS服务器IP地址,重定向如上。

和DNS缓存投毒配合使用。

解决方案

1.使用Hosts文件

在操作系统的Hosts文件中,最简单地以”IP-域名“映射的形式进行编写

例如:

1
77.88.44.55 yandex.com

你可以使用ping.pe的ping服务,在网站中输入域名后就会显示ping的结果,而下方将显示它的ip,保存到本地hosts文件。

Windows用户推荐使用VScode编辑,可以解决许多修改hosts过程中的问题。

2.使用Socks5代理

许多国家和地区的ISP都具备识别该流量的能力,抗审查能力弱。

同时其socks5的流量一般明文,请加密它,否则可能将被深度包检测,数据包或被丢弃。

3.使用HTTP代理

症状同上。

4.使用DNS Over TLS

TLS加密使用,它是较前几类都要稍微高级的方式。

本地与DoT服务器进行TLS握手,之后进行DNS加密查询。

首次查询必然比明文的DNS要慢,因为TLS1.3初次握手必然要有1 RTT

同时这种方法十分容易被检测,因为有且仅有DoT向服务器的853发送数据,ISP可以轻易识别并被路由到黑洞。

5.使用DNS Over HTTPS

它伪装成了正常的网页访问,向HTTPS的443端口发送。

但它仍旧可以被封锁,因为外界可以通过你的dns查询和sni得知你在使用DoH服务。

可以自建DNS服务,请看第8小节。

6.使用DNS Over QUIC

QUIC的优点在于可以充分被QoS

不,不会

这玩意用的人太少

可能也不会引起什么重视

目前率先支持的有下面提到的Adguard Home

7.Oblivious DoH

预储备知识: https://www.cloudflare.com/zh-cn/learning/ssl/what-is-asymmetric-encryption/

这个很新,目前貌似只有dnscrypt和cloudflare在支持

尝鲜 odoh.cloudflare-dns.com

原理就是HPKE和AEAD

8.自己的Encrypted DNS Server

Ⅰ. DNSCrypt

这个有点年头了

Ⅱ. DoH_Cloudflare_Workers

白嫖Cloudflare workers的无服务器,github: https://github.com/tina-hello/doh-cf-workers

购买自己的域名,workers.dev在某些国家是无法访问的,同时使用hexo或hugo部署一些静态页面,后者自行bing或google

最后将你的自定义域名添加到workers

dash.cloudflare.com在某些国家难以访问,请使用代理。

Ⅲ.VPS的解决方案

购买一台没有或对DNS审查污染较轻的国家的并且靠近你的VPS,例如你是韩国人(韩国具有发达国家中最严格的网路审查),可选香港、台北、东京、新加坡这些东亚、东南亚的VPS。

假设在上一步的前提下

之后请使用域名解析服务(DNSPod、Cloudflare)域名绑定到你的VPS的IP地址

我们将使用 Adguard Home + Caddy 搭建 DNS over HTTPS 伺服器

故此,我们需要两个三级域名

这里意为 若你的域名为 abc.com

都解析(绑定) a.abc.com 和 b.abc.com 到你的VPS

在添加A/AAAA记录时可以免费设置三级域名

这是DNS查询决定的(DNS Resolver 解析器的查询是迭代的)

不需要额外购买域名

A.安装AdguardHome

Adguard home非常简单易上手!

我将不会使用Docker

请访问GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server

提供了curl的安装脚本

B.安装Caddy

a.安装Go环境

访问 https://go.dev

在vps执行

1
sudo apt install wget -y && wget https://go.dev/dl/go1.25.0.linux-amd64.tar.gz

以便下载go的release

之后可以参考 https://go.dev/doc/install

或者:

1
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz
1
export PATH=$PATH:/usr/local/go/bin

验证已安装:

1
go version

b.下载并编译caddy

1
cd
1
~/go/bin/xcaddy build

可以通过 –with 参数添加插件

示例

1
~/go/bin/xcaddy build --with github.com/greenpau/caddy-git

c.申请证书

  • 问:为什么不使用caddy自己的证书申请?

  • 答:因为后面的Adguard Home也需要tls证书!

访问 https://acme.sh

或者(请把命令中的 my@example.com 换成你自己绑定了该域名的邮箱,不然后面无法申请)

1
apt install curl && curl https://get.acme.sh | sh -s email=my@example.com

之后请

1
cd ~/.acme.sh

之后我们需要配置环境变量

例如我用的是Cloudflare

就要去Cloudflare Dashboard | Manage Your Account里面点击

创建令牌 >> 编辑区域DNS >> 只修改“区域资源”的DNS一栏,选中你的域名 >> 继续 >> 创建

之后请用编辑软件保存你的API

我用Cloudflare的示例(自行替换)

1
export CF_Token="Your_DNS_API" 

还需要帐户ID和区域ID

在Cloudflare的特定域名的“概述”界面右下角可以找到

1
export CF_Zone_ID="Your_Zone_ID"
1
export CF_Account_ID="Your_ACCT_ID"

之后可以选择性更换 CA,等于更换了证书颁发机构(可选Let’s encrypt)

1
./acme.sh --set-default-ca --server letsencrypt

之后开始申请(自行替换)

cloudflare使用的是 –dns dns_cf

DNSPod使用 –dns dns_dp

其他dns,如namesilo等,请自行Bing或Google

1
./acme.sh --issue -d "*.yourdomain.com" --dns dns_cf

或者具体申请

1
./acme.sh --issue -d a.yourdomain.com -d b.yourdomain.com --dns dns_cf

之后等待输出完毕

你的证书一般就为

证书 (Certificate):~/.acme.sh/xxxx.your_domain_ecc/fullchain.cer

密钥(Private Key):~/.acme.sh/xxxx.yourdomain.com_ecc/xxx.yourdomain.com.key

当然屏幕上也会有输出结果

可以下一步了

d.基本配置Caddy

1
apt install vim -y && touch ~/Caddyfile && vim ~/Caddyfile

这时你打开了Caddyfile通过vim

贴出最基本的配置文件

1
2
3
4
5
6
7
:443, xxx.yourdomain.com {
tls /path_to_certificate /path_to_private_key
reverse_proxy http://127.0.0.1:3000
file_server {
root /var/www/html
}
}

之后可以

1
~/caddy start

之后访问 https://xxx.yourdomain.com

设置密码和管理接口,但不要为80或443,记住接口数字

然后修改Caddyfile中的 reverse_proxy 一行,修改3000为你设置的接口数字

不满意可以去 /opt/AdGuardHome/AdGuardHome.yaml 修改,然后使用systemd重启Adguardhome

之后使用

1
~/caddy reload --config=/path_to_configuration

来重载配置文件

之后在仪表盘的加密设置中,填入你的第二个域名。

填入证书(使用fullchain.cer)

配置https端口

e.再次修改Caddyfile

之后在Caddyfile中

1
2
3
4
5
6
7
8
9
10
11
12
#删除先前配置
:443, xxx.yourdomain.com {
tls /path_to_certificate /path_to_private_key
route /dns #请修改
  {
    rewrite * /dns-query #DoH标准请求为 https://dns.server/dns-query?dns=Base64URLData
reverse_proxy https://你的第二个域名:你的端口
}
file_server {
root /var/www/html
}
}

f.使用ufw(Ubuntu防火墙)

1
apt install ufw && ufw allow 22 && ufw enable

之后你会发现无法访问网站

1
ufw allow 443

就可以了

只保留443,可以防御爬虫检测端口,滥用doh服务(别人不可能用,只会有人封)

g.随便丢个静态网页上去

1
2
3
fileserver {
root /var/www/html
}

在 /var/www/html 下放一个index.html随便写写

或者反向代理其他网站都可以!

だけど

But at what costs?(While watching BBC)

哈,那当然是SNI阻断啊

参考:

https://github.com/AdguardTeam/AdGuardHome

https://github.com/tina-hello/doh-cf-workers

https://zh.wikipedia.org

Adguard Home 预编译文件 Amd64 For Linux

Go 预编译文件 Amd64 For Linux


DNS Protection
http://mathsic.org/2025/08/20/DNS_Protection/
Author
Cishtam
Posted on
August 20, 2025
Licensed under