你的网站是怎么被墙的
0.引言
某天,你打开你的网站,却看到了这样的画面

你本能地打开curl进行分析,结果终端的输出更加诡异:
1 | wdfqx@wdfqx:~/docs/img$ curl -v example.com |
没错,你的网站就这么被墙了。TCP连接已经建立,却在请求的时候被阻断。这不是一个简单的访问失败,而是防火墙和网站运营者间近30年的对抗。
为什么你的网站会被墙?网站被墙的时候,你访问这个网站的时候发生了什么?
1.网站为什么会被墙?
互联网上的内容极其丰富,存在着各种不同观点、立场的,合法或非法的内容。为了阻止国民访问不符合其价值观、违反该国法律的内容,就会对网络上的内容进行封锁,在学术上称作“互联网内容治理”或“数字边界管控”。
2.网站是怎么被墙的?
2.1 审查流量内容
在互联网建立之初(1990s-2000早期),绝大多数的网站都没有采用HTTPS来对连接进行加密,使用明文传输内容 (HTTP协议) 致使流量内容极其透明,网络链路中任何一个设备都能监听甚至篡改数据包中的内容。
这时,防火墙会给你的流量做深度包检测(Deep Pachet Inspection,DPI) ,检查数据包**载荷(Payload)**中是否存在违禁词黑名单中的词汇。
如果检测到,就会丢弃数据包或向双方发送一个伪造的TCP RST数据包切断这次连接。
如果没检测到,就会正常放行并继续监听和审查连接内容。
这种方法极其简单粗暴,但严重侵犯用户隐私且效率极低
随着互联网安全意识的普及,使用SSL/TLS加密连接的HTTPS成为主流的网页协议,传输内容变成了乱码一般的密文。防火墙再也不能进行DPI了,这种方法也就彻底失效了(别用1990年至今未更新的古董系统杠我,你杠就是你对) 。
说人话:防火墙一直在监控你的一举一动,看到有“不良内容”就直接替你扔掉
2.2 基于IP的封锁
HTTPS把流量加密之后,基于流量内容的关键词检测(对,早期审查就这样)失效后,防火墙转向对IP地址的封锁,但这个方法有诸多问题,下文细说。防火墙维护一个庞大的IP黑名单,如果用户发送的数据包的目标IP是黑名单里的IP会直接丢弃数据包或者返回一个TCP RST数据包重置连接,这就是为什么你访问一些服务会收到浏览器的”ERR_CONNECTION_RESET”报告,如果你确定服务是正常的,那就肯定是防火墙作怪了。
注:正常情况下也可能收到RST数据包,例如端口(Port)不开放或服务端(Server)刻意拒绝你的连接等。
很明显的,这种封锁方法的弊端极大,不仅不能有效封锁违法网站,还会误伤大量的合法网站。
其一,是非法网站的IP地址黑名单会不断地更新以对抗封锁,一直封IP难道还要把全世界的IP全部封完么?
其二,是封锁IP极易误伤,公共托管商的一个IP地址托管了成千上万的网站,封禁一个网站就连带封锁了其他所有网站,所以成本难以估量。
就这么的,基于IP的封锁不久之后就不再作为主要的封锁方法,只作为辅助方法。
人话:防火墙直接把目标网站IP一顿乱封,结果发现伤敌一千自损八万,就放弃了(战术摊手.webp)
2.3 基于域名的封锁
诚然,加密解决了传输安全性,也在一定程度上暂时地使得防火墙不能有效的屏蔽互联网网站,但是为了正确地交换数据包,HTTPS协议还有一个字段是明文的: SNI(Server Name Indication,服务器名称指示)。
防火墙在经历了DPI和IP封锁的失效之后,痛定思痛,进化出了SNI识别技术(其实本质还是DPI)。
这时,防火墙维护一个域名黑名单,如果用户发送的数据包中的SNI字段匹配了黑名单已有的 域名(Domain Name), 则防火墙会丢弃数据包或发送RST数据包,切断连接;如果用户发送的数据包的SNI字段没有匹配,则会放行。这样的话,你就会发现一个神奇的现象:给某个域名对应地址发送数据包,如果不带SNI,连接能通,如果带上,就阻断了,这就是域名被屏蔽而IP没有被封导致的。
这种方式从2010年代到现在一直是防火墙的主要封锁方法,针对域名的封锁可以做到更加精确,更加简单。
人话:防火墙看见你访问的域名(SNI)是“不良网站”就直接掐掉连接
2.4 基于特征的封锁
基于域名的封锁方法在技术的演进中,也显现出了部分弊端,例如对SNI的依赖导致如果客户端和服务器使用特殊的连接方法故意地抹去或者篡改SNI字段,防火墙的封锁就会失效,这种方法被称作 “域前置”(Domain Fronting)。 尽管这种方法违反RFC规范而被一般浏览器拒绝就是
天空一声巨响,DPI闪亮登场,防火墙接着进化,面对这种耍赖的行为产生新的方法应对:深度包检测(当然,这次不是1990年代那个菜鸡版本) ,会 检测数据包时序、数据包大小、数据指纹 等多种流量特征综合判断流量的类型并推测网站类型
说人话:防火墙不需要看你到底在做什么,它只需要通过数据包特征猜你在干啥就行了,你的流量在它面前约等于这个:
3.后记
3.1 建议
所以说,你的网站被墙,就这几点原因:
你网站服务器IP被防火墙封了,纯误伤,建议换一个服务商
你真违规了,网站域名被封,这个帮不了你,以后记得守法
你网站的流量特征看起来像违禁内容,这个也是误伤,以后偷感别那么强
3.2 免责声明
本文旨在进行纯粹的技术原理探讨与科普交流,所有内容均基于公开的互联网技术标准与协议(如RFC)进行解读,不涉及任何非公开信息或内部机制。文章仅讨论技术实现原理,并非对任何特定网络管理政策的解读或评论,亦不构成任何专业建议。
文中所述技术方法(如DPI、SNI过滤等)为网络安全领域的通用概念,所表达的观点均为作者基于技术事实的个人理解,与任何组织或机构无关。信息可能存在滞后或疏漏,仅供参考。
本文旨在讲解通用的互联网 访问控制(Access Control) 的合法应用,例如企业禁止员工访问恶意网站等,所有案例均为理论技术推演,不特指任何具体实体。
坚决反对任何形式的网络违法犯罪行为,请读者遵守所在地法律法规,合理使用网络技术。
3.3 注解
- DPI/深度包检测:对数据包的内容、特征等进行检查以审查互联网通信的机制|人话:防火墙检查流量用的
- SNI/服务器名称指示:TLS的一个扩展字段,用于标识访问的网站域名以快速匹配证书|人话:优化TLS握手用的
- TCP RST数据包:TCP(传输控制协议)中用于直接切断一个连接的数据包,可能会在端口不存在、不开放或服务器不想与连接对象建立连接的时候被发送|人话:掐断连接用的
- Domain Fronting/域前置:将TLS握手中的SNI字段替换为大型网站的域名用以对抗封锁的一种方式,通常配合CDN使用|人话:对抗防火墙的,好孩子不要学,而且现在绝大多数CDN服务商由于滥用问题已经禁止使用这种方法。

