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 |
|
你可以使用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环境
在vps执行
1 |
|
以便下载go的release
之后可以参考 https://go.dev/doc/install
或者:
1 |
|
1 |
|
验证已安装:
1 |
|
b.下载并编译caddy
1 |
|
1 |
|
可以通过 –with 参数添加插件
示例
1 |
|
c.申请证书
问:为什么不使用caddy自己的证书申请?
答:因为后面的Adguard Home也需要tls证书!
或者(请把命令中的 my@example.com 换成你自己绑定了该域名的邮箱,不然后面无法申请)
1 |
|
之后请
1 |
|
之后我们需要配置环境变量
例如我用的是Cloudflare
就要去Cloudflare Dashboard | Manage Your Account里面点击
创建令牌 >> 编辑区域DNS >> 只修改“区域资源”的DNS一栏,选中你的域名 >> 继续 >> 创建
之后请用编辑软件保存你的API
我用Cloudflare的示例(自行替换)
1 |
|
还需要帐户ID和区域ID
在Cloudflare的特定域名的“概述”界面右下角可以找到
1 |
|
1 |
|
之后可以选择性更换 CA,等于更换了证书颁发机构(可选Let’s encrypt)
1 |
|
之后开始申请(自行替换)
cloudflare使用的是 –dns dns_cf
DNSPod使用 –dns dns_dp
其他dns,如namesilo等,请自行Bing或Google
1 |
|
或者具体申请
1 |
|
之后等待输出完毕
你的证书一般就为
证书 (Certificate):~/.acme.sh/xxxx.your_domain_ecc/fullchain.cer
密钥(Private Key):~/.acme.sh/xxxx.yourdomain.com_ecc/xxx.yourdomain.com.key
当然屏幕上也会有输出结果
可以下一步了
d.基本配置Caddy
1 |
|
这时你打开了Caddyfile通过vim
贴出最基本的配置文件
1 |
|
之后可以
1 |
|
之后访问 https://xxx.yourdomain.com
设置密码和管理接口,但不要为80或443,记住接口数字
然后修改Caddyfile中的 reverse_proxy 一行,修改3000为你设置的接口数字
不满意可以去 /opt/AdGuardHome/AdGuardHome.yaml 修改,然后使用systemd重启Adguardhome
之后使用
1 |
|
来重载配置文件
之后在仪表盘的加密设置中,填入你的第二个域名。
填入证书(使用fullchain.cer)
配置https端口
e.再次修改Caddyfile
之后在Caddyfile中
1 |
|
f.使用ufw(Ubuntu防火墙)
1 |
|
之后你会发现无法访问网站
1 |
|
就可以了
只保留443,可以防御爬虫检测端口,滥用doh服务(别人不可能用,只会有人封)。
g.随便丢个静态网页上去
1 |
|
在 /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