导入握手包 TLS协议与SNI 阻断与解决方案

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

导入握手包

名词释义:域名信息(Server Name Indication,简称SNI),传输层安全性协议(Transport Layer Security,简称TLS)。TLS是一项重要的技术,用于确保网络传输内容的完整性,防止中间人篡改。如今,越来越多的网站采用HTTPS(即基于TLS的HTTP)来保护网页内容。然而,TLS设计中存在一个缺陷,使得阻断TLS连接成为可能。在建立新的TLS连接时,客户端(如浏览器)发送的第一个握手包(称为Client Hello)中包含了要访问的域名信息(称为SNI,Server Name Indication)。某些服务器(如CDN)同时支持多个域名,为了进行加密传输,它需要知道客户端访问的是哪个域名。因此,SNI必须以明文形式传输。由于浏览器无法确定服务器是否需要SNI,它会在所有TLS握手中都加入SNI。因此,根据黑名单,某些防火墙可以精确地阻断TLS连接。

简图:客户端(如浏览器)—>第一个握手包(包含明文形式的域名信息SNI,如访问google)—>服务器—>防火墙—>阻断访问

目前,Mozilla和CloudFlare正在推动一项对SNI的改进方案,称为Encrypted SNI(ESNI,加密域名信息)。该提案目前仍处于早期讨论阶段,预计还需要两年时间才能定稿和推广。目前,只有Firefox Nightly(客户端)以及CloudFlare和Wikipedia(网站)支持ESNI的初代版本。在ESNI正式推广之前,我们仍需要其他技术来规避对TLS连接的探测。

导入握手包

目前尚未发现通用的解决方案。有一种较为通用但部署较为复杂的方案称为域名前置(Domain Fronting)。其原理简单来说是:部分服务器允许TLS连接声称自己需要域名A,但随后的HTTP协议声称自己需要域名B。或者服务器根本不关注SNI信息。在这种情况下,对于黑名单中的域名,我们可以在建立TLS时选择一个不在黑名单中的域名,绕过对TLS连接的监测。当然,它的缺点是依赖于服务器行为。换句话说,每个不同的站点可能需要不同的策略(域名)。

举两个例子:P站的服务器实际上不关注SNI。在建立TLS连接时,即使不携带SNI,也可以正常进行HTTPS访问。而zh.wikipedia.org是一个黑名单域名,但同站点的其他域名则不是。在建立TLS连接时,我们使用SNI = [其他域名],之后的HTTP请求仍然可以正常连接到zh.wikipedia.org。

域名前置实际上并不是一个合理的用法,网站完全可以拒绝这类连接,例如Google和Amazon在自己的所有服务中主动拒绝这项技术。尽管如此,域名前置仍然是在ESNI推广之前最好的规避技术。

好了,接下来介绍一下V2Ray中如何使用域名前置。作为一个复杂且功能强大的工具,如果连域名前置都不支持,那就对不起它的声誉了。

所需技能:TLS配置、dokodemo-door、freedom、路由和对MITM的初步了解。

大致的工作流程:

导入握手包

本地的V2Ray拦截浏览器的TLS连接,让浏览器以为自己已经连接到目标服务器,并读取TLS中承载的HTTP数据;
然后,自己与目标服务器建立一个新的TLS连接,将HTTP数据发送过去。换句话说,您无需代理服务器即可绕过(部分)SNI封锁。

以下步骤的细节可以不用过于关注,只需了解原理即可。

第一步,您需要一个自签名的CA证书。当然,如果您能获得由正规机构签发的CA证书,那就更好了。签发证书的过程不在此详述,可以在其他文章中找到相关信息。签发完成后,您需要将证书导入系统或浏览器,以使浏览器信任由该CA签发的网站证书。

第二步,您需要配置一个dokodemo-door来拦截TLS连接。需要启用security: “tls”,并配置签发的证书。示例配置如下:

“listen”: “0.0.0.0”,
“port”: 443, // 其他端口也可以,但443比较方便
“tag”: “df-in”,
“protocol”: “dokodemo-door”,
“settings”: {
“network”: “tcp”,
“address”: “1.1.1.1”, // 不重要,但是要写
“port”: 443,
“followRedirect”: true // 一定要写
},
“streamSettings”: {
“security”: “tls”,
“tlsSettings”: {
“alpn”: [“h2”],
“certificates”: [
{
“usage”: “issue”, // 重要
“certificateFile”: “/path/to/ca.cer”, // 刚刚签发的CA证书
“keyFile”: “/path/to/ca.key”
}
]
}

第三步,将浏览器发出的连接转发到上述dokodemo-door。您可以选择透明代理或强制hosts,都可以正常工作。

第四步,配置一个freedom,用于建立指向服务器的TLS连接。示例配置如下:

“protocol”: “freedom”,
“tag”: “no-sni-out”,
“settings”: {
“domainStrategy”: “UseIP”
},
“streamSettings”: {
“security”: “tls”,
“tlsSettings”: {
“allowInsecure”: true, // 不指定SNI,就必须打开这一项。
“alpn”: [“h2”]
}

第五步,将dokodemo-door和路由连接起来。例如:

“inboundTag”: [“df-in”],
“domain”: [“geosite:pixiv”],
“outboundTag”: “no-sni-out”,
“type”: “field”

第六步,运行V2Ray,然后进行测试:

curl –resolve :443:127.0.0.1 -I

如果配置成功,您将看到类似以下信息:

赞(0)