域前置

yang
16
2025-05-14

域前置(Domain Fronting)是一种利用HTTPS的CDN(内容分发网络)或其他代理服务器进行网络请求隐藏的技术,它的主要目的是绕过防火墙,隐藏真实的通信目标 ,简单来说,域前置是一种在同一HTTPS连接上使用不同域名的技术,它通过较大的平台路由流量,从而掩盖真实的目标。

以下是域前置技术的一些关键点:

工作原理:域前置通过在不同的通信层使用不同的域名来实现 ,在TLS握手期间,客户端发送的SNI字段包含一个允许通过防火墙的前置域名,使防火墙认为请求是合法的 ,CDN接收到请求后,根据HTTP请求头中的真实域名,将请求转发到目标服务器。

实现方法:选择一个支持域前置的CDN,如Cloudflare、Akamai ,配置前置域名和目标服务器的DNS解析,并在客户端和服务器端代码中处理TLS握手和HTTP头部,确保正确设置SNI和Host头 。

应用场景:

绕过防火墙:在被审查的地区使用域前置可以访问被封锁的内容。

隐蔽通信:保护隐私,隐藏真实的通信目标,防止流量分析和审查。

规避流量限制:在一些网络中,特定域名或服务可能受到限制,通过使用CDN可以绕过这些限制。

如何选择前置域名?选择受信、流量大的域名,如大型网站或服务提供商的域名, 确保前置域名在目标网络中未被屏蔽或限制,选择支持域前置的CDN提供的域名,并准备多个前置域名,避免单一域名被封锁。

域前置技术利用HTTPS连接的复杂性来模糊互联网流量的真实目的地, 此技术利用SNI和Host头可以包含不同域名的特性,从而绕过依赖于检查SNI字段的网络过滤器,通过使用托管多个域的CDN,域前置有效地掩盖了真实端点,使其成为规避审查和网络限制的强大工具, 尽管域前置可以有效地绕过审查,但如果代理检查TLS流量并执行适当的检查,则可以检测和阻止此类攻击。

D8B7AF42-68C7-489A-84F5-5403A0580FB0.png

SNI

SNI(Server Name Indication,服务器名称指示)是TLS(Transport Layer Security,传输层安全协议)的一个扩展 [。它允许客户端在发起SSL/TLS握手时,指定它想要连接的服务器的主机名。

在HTTPS协议中,TLS握手发生在数据的正式传递之前,因此其中的数据都是明文传递的。这就意味着,SNI信息可能会被网络传输中的中间人监听。中间人可以轻易地知道用户准备访问哪个网站,用户因此就会泄露隐私。中间人还可以通过识别SNI的信息,阻断一部分TLS握手的建立,这种攻击也就是SNI阻断。

23586DE8-D2C5-4EAE-B027-7800F4268AD3.png

通过curl检测SNI

curl --resolve abc123.com:443:104.18.2.8 https://abc123.com -iv

无SNI阻断响应

curl --resolve abc123.com:443:104.18.2.8 https://abc123.com -iv
* Expire in 0 ms for 6 (transfer 0x55d868a5dfb0)
* Added abc123.com:443:104.18.2.8 to DNS cache
* Hostname abc123.com was found in DNS cache
*   Trying 104.18.2.8...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55d868a5dfb0)
* Connected to abc123.com (104.18.2.8) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS alert, handshake failure (552):
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

有SNI阻断响应

curl --resolve twitter.com:443:104.18.2.88 https://twitter.com -iv
* Expire in 0 ms for 6 (transfer 0x55dea6262fb0)
* Added twitter.com:443:104.18.2.88 to DNS cache
* Hostname twitter.com was found in DNS cache
*   Trying 104.18.2.88...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55dea6262fb0)
* Connected to twitter.com (104.18.2.88) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to twitter.com:443
* Closing connection 0
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to twitter.com:443

动物装饰