起因

GFW看了直呼内行😂

project.png

一直都是vless+xhttp套CDN+优选IP,直到SNI被阻断。

sni.png

于是开始使用ECH对SNI加密。

什么是ECH

ECH 含义是 Encrypted Client Hello。它是传输层安全(TLS)背景下的协议扩展。ECH加密部分握手过程,并掩盖用于协商TLS会话的服务器名称指示(SNI)。这意味着每当用户访问启用ECH的Cloudflare网站时,中介机构可以看到你正在访问Cloudflare上的网站,但无法确定是哪一个。

来自ECH协议·Cloudflare SSL/TLS 文档

简而言之就是加密后的 Client Hello

  • 未加密的Client Hello包TLS部分servername会显示建立连接的域名

hello-1-PRry.png
  • 加密后的Client Hello包TLS部分servername只显示cloudflare-ech.com

hellow-e.png

ECH使用条件:

  1. TLS 1.3

  2. DOH(支持https解析)

  3. CDN (支持ECH)

教程

这里以Cloudflare为例,不建议滥用,仅提供学习和交流。

Cloudflare开启ECH

cf官方文档中提到了开启ECH的方法,但是事实却是没有这个按钮

open-ech.png

问题不大,这里可以使用API开启Cloudflare ECH的方法(针对单个域名区域)

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/域名区域ID/settings/ech" \
     -H "X-Auth-Email: 你的注册邮箱" \
     -H "X-Auth-Key: 你的Global_API_Key" \
     -H "Content-Type: application/json" \
     --data '{"value": "on"}'

返回 success后为开启成功。

验证ECH是否开启

使用在线dig工具验证:工具

输入套CDN的IP域名使用https解析,查看下发是否存在ech公钥字段,存在ech为开启成功

ech-test.png

开启TLS1.3

Cloudflare 域名页面下 SSL/TLS 中的 边缘证书 开启TLS 1.3

tls-ssl.png

客户端配置

客户端这里以mihomo内核的Clash Verge为例

在mihomo官方文档中介绍了,ech-opts 字段

上述已经开启了https的解析,并且公钥在解析中,这里ech-opts字段只需要enable: true即可,其他的字段可以不写

ech-conf.png

DOH服务器选择

DOH服务器是必须的,否则无法获取公钥对Client Hello包中的ServerName字段进行加密。

推荐自建更安全,如果为方便使用,阿里云和腾讯云的DOH即可,前提是该DOH必须支持https解析

# 腾讯云
https://doh.pub/dns-query

#阿里云
https://dns.alidns.com/dns-query

如何检测DOH服务器是否支持https解析

#安装工具
apt install dnsutils -y

#验证域名
dig @223.5.5.5 域名 https

上述223.5.5.5为public1.alidns.com的解析结果

存在ech返回,即为DOH支持https解析。

ech-doh-test.png

clash verge DOH配置

过于基础不再解释

clash.png

验证

配置完成后使用套了CDN并且开启了ECH的节点,使用wireshark抓包查看client hello包的tls包头下的servername字段是否为cloudflare-ech.com即可

hellow-e.png