2025年8月20日中国防火长城GFW对443端口实施无条件封禁的分析


作者: Mingshi Wu

日期: 2025年8月20日,星期三

English Version: Analysis of the GFW's Unconditional Port 443 Block on August 20, 2025

1. 引言

2025 年 8 月 20 日北京时间(UTC+8)约 00:34 至 01:48 间,中国国家防火墙(GFW)出现异常行为:对所有指向 TCP 443 端口的连接无条件注入伪造的 TCP RST+ACK 包,导致连接中断。该事件引发了中国与世界其他地区之间的大规模互联网连通性故障(来源1来源2)。

本报告记录了我们对这一短暂但广泛的封禁事件的测量与分析。主要发现如下:

  1. 无条件的 RST+ACK 注入仅发生在 TCP 443 端口,未见于其他常见端口(如 22、80、8443)。
  2. 该无条件注入同时扰乱了出入境中国双方向的连接,但触发机制不对称:从中国境内向境外发起的连接,客户端的 SYN 包与服务器的 SYN+ACK 包各自触发三个 RST+ACK包;从境外向中国境内发起的连接,只有服务器返回的 SYN+ACK 会触发 RST+ACK,客户端发送的 SYN 不会触发注入。
  3. 负责注入的设备指纹与已知 GFW 设备不匹配,因此此次事件要么由新的 GFW 设备造成,要么是由已知设备以一种新的或误配置的状态运行造成的

需注意的是,本次事件持续时间较短(约 74 分钟),对我们的测量和分析带来一定限制。我们鼓励社区成员分享各自的观测与分析,以共同完善对该事件的理解。

2. 封禁的触发

我们首先从中国境内(AS45090,腾讯云,北京)与多个境外测量点同时发起探测以确认封禁。

2.1 境内发起(inside-out)

我们使用如下命令尝试与 $NON_CN_IP 建立 TCP 三次握手:

nc -vn $NON_CN_IP 443

同时使用 tcpdump 抓包:

tcpdump -n host $NON_CN_IP

观测显示:客户端发送的 SYN 包会触发三连发伪造 RST+ACK,其相对序列号均为 0,TCP 窗口大小递增为 198019811982。服务器返回的 SYN+ACK 同样会触发三连发 RST+ACK,其相对序列号为 1,TCP 窗口大小递增为 329332943295

sudo tcpdump -n host $NON_CN_IP
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
01:31:07.153262 IP $CN_IP.52596 > $NON_CN_IP.443: Flags [S], seq 3193349615, win 64240, options [mss 1460,sackOK,TS val 318868316 ecr 0,nop,wscale 7], length 0
01:31:07.159991 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [R.], seq 0, ack 3193349616, win 1980, length 0
01:31:07.159991 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [R.], seq 0, ack 1, win 1981, length 0
01:31:07.160021 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [R.], seq 0, ack 1, win 1982, length 0
01:31:07.274422 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [S.], seq 2837031664, ack 3193349616, win 65160, options [mss 1424,sackOK,TS val 80839422 ecr 318868316,nop,wscale 7], length 0
01:31:07.274442 IP $CN_IP.52596 > $NON_CN_IP.443: Flags [R], seq 3193349616, win 0, length 0
01:31:07.278233 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [R.], seq 1, ack 1, win 3295, length 0
01:31:07.278233 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [R.], seq 1, ack 1, win 3293, length 0
01:31:07.278233 IP $NON_CN_IP.443 > $CN_IP.52596: Flags [R.], seq 1, ack 1, win 3294, length 0

2.2 境外发起(outside-in)

从境外同样可以触发 RST+ACK 注入。此处 $CN_IPbaidu.com 的某个 IP:

11:44:41.194853 IP (tos 0x0, ttl 64, id 48747, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.162.34500 > $CN_IP.443: Flags [S], cksum 0x418a (incorrect -> 0x252a), seq 3455861170, win 64240, options [mss 1460,sackOK,TS val 134891089 ecr 0,nop,wscale 7], length 0
11:44:41.440817 IP (tos 0x0, ttl 46, id 48747, offset 0, flags [DF], proto TCP (6), length 60)
    $CN_IP.443 > 192.168.0.162.34500: Flags [S.], cksum 0xd4a2 (correct), seq 1580408478, ack 3455861171, win 8192, options [mss 1452,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 0
11:44:41.440817 IP (tos 0x0, ttl 96, id 40305, offset 0, flags [DF], proto TCP (6), length 40)
    $CN_IP.443 > 192.168.0.162.34500: Flags [R.], cksum 0x515b (correct), seq 1, ack 1, win 2072, length 0
11:44:41.440817 IP (tos 0x0, ttl 97, id 39808, offset 0, flags [DF], proto TCP (6), length 40)
    $CN_IP.443 > 192.168.0.162.34500: Flags [R.], cksum 0x515a (correct), seq 1, ack 1, win 2073, length 0
11:44:41.440817 IP (tos 0x0, ttl 98, id 38891, offset 0, flags [DF], proto TCP (6), length 40)
    $CN_IP.443 > 192.168.0.162.34500: Flags [R.], cksum 0x5159 (correct), seq 1, ack 1, win 2074, length 0
11:44:41.440901 IP (tos 0x0, ttl 64, id 48748, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.0.162.34500 > $CN_IP.443: Flags [.], cksum 0x4176 (incorrect -> 0x5781), seq 1, ack 1, win 502, length 0

境外客户端仅收到三份 RST+ACK(而非六份)。相对序列号为 1 表明触发源是中国侧服务器返回的 SYN+ACK,而非客户端的 SYN。事实上,当我们向与 $CN_IP 同一 /24 子网的、未开放目标端口的境内 IP 发送 SYN(因此对端不返回 SYN+ACK)时,无法触发封禁。

2.3 受影响的端口

RST+ACK 注入被确认特定于 TCP 443 端口。我们从中国境内(AS45090,腾讯云,北京)的机器对某境外 IP 进行了部分端口扫描,确认包括 1–72、22、80、444、8443 在内的其他常见端口未受影响,未收到 RST。

nping -4 -c 0 --tcp-connect $NON_CN_IP -p 1-65535

我们亦对 1–65535 端口进行了全量扫描,但当我们在 2025-08-20 01:48 CST 运行时,封禁已结束,无法再触发:

sudo nmap -sS -p- $NON_CN_IP -oN scan_results.txt -T4 --min-rate 10000 -Pn

3. 归因与设备指纹

中国的 GFW 并非单一设备,而是由多类执行审查的网络设备构成的复杂系统。既有研究指出,负责基于 HTTP Host 与 TLS SNI 的过滤组件在注入 TCP RST 时具有独特的报文级指纹。本节旨在识别本次异常行为的具体责任组件。

为指纹比对,在这起事件结束后,我们从境内测量点向曾触发无条件 RST 的目标 IP 发送探测。复用相同目的 IP 使探测报文更可能沿相同网络路径并与同一组审查中间盒交互,从而有利于一致的指纹分析。

我们的探测结果表明:无任何捕获到的报文指纹能与事件期间的特征完全吻合——尤其是那些呈现递增关系的字段

鉴于本次无条件注入的三份 RST+ACK 都带有 IP 标志 DF(Don’t Fragment,不可分片),它们与 Niere 等人识别的 MB-1(见图 4)相似,但并不相同;也与 Wu 等人识别的 GFW (II)(见表 4)相似,但并不相同

然而存在关键差异:已知的中间盒注入器会发送三份完全相同RST+ACK;而本事件中观测到的报文在若干字段上呈明显递增。这提示该事件要么由此前未被编目的 GFW 设备引起,要么是已知设备处于一种新颖或误配置的工作状态

3.1 GFW 无条件 RST+ACK 报文的指纹

该无条件 RST+ACK 以三连发形式出现,且其 IP TTL 与 TCP 窗口大小呈递增关系。受限于样本,我们未能确定其 IP ID 的稳定特征。

IP 标志 IP ID IP TTL TCP 相对序列号 TCP 标志 TCP 窗口大小
不可分片(DF) 40305 (0x9D71) 96 1 RST+ACK 2072
不可分片(DF) 39808 (0x9B80) 97 1 RST+ACK 2073
不可分片(DF) 38891 (0x97E3) 98 1 RST+ACK 2074

表 1:无条件注入的 TCP RST 报文特征

3.2 GFW 基于 HTTP Host 的审查设备之 RST 指纹

curl --resolve youtube.com:80:$NON_CN_IP http://youtube.com
sudo tcpdump -v port 80
tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
04:27:09.790274 IP (tos 0x0, ttl 64, id 12103, offset 0, flags [DF], proto TCP (6), length 60)
    $CN_IP.51506 > $NON_CN_IP.deploy.static.akamaitechnologies.com.http: Flags [S], cksum 0x630f (correct), seq 3187873750, win 64240, options [mss 1460,sackOK,TS val 329430953 ecr 0,nop,wscale 7], length 0
04:27:09.919296 IP (tos 0x68, ttl 251, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.http > $CN_IP.51506: Flags [S.], cksum 0xaf88 (correct), seq 155578285, ack 3187873751, win 65160, options [mss 1424,sackOK,TS val 2237542832 ecr 329430953,nop,wscale 7], length 0
04:27:09.919331 IP (tos 0x0, ttl 64, id 12104, offset 0, flags [DF], proto TCP (6), length 52)
    $CN_IP.51506 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.http: Flags [.], cksum 0xda42 (correct), ack 1, win 502, options [nop,nop,TS val 329431082 ecr 2237542832], length 0
04:27:09.919414 IP (tos 0x0, ttl 64, id 12105, offset 0, flags [DF], proto TCP (6), length 127)
    $CN_IP.51506 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.http: Flags [P.], cksum 0x0926 (correct), seq 1:76, ack 1, win 502, options [nop,nop,TS val 329431082 ecr 2237542832], length 75: HTTP, length: 75
        GET / HTTP/1.1
        Host: youtube.com
        User-Agent: curl/7.81.0
        Accept: */*

04:27:09.923159 IP (tos 0x68, ttl 251, id 31725, offset 0, flags [none], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.http > $CN_IP.51506: Flags [R], cksum 0xc7c6 (correct), seq 155578286, win 42571, length 0
04:27:09.924494 IP (tos 0x68, ttl 251, id 45284, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.http > $CN_IP.51506: Flags [R.], cksum 0x9162 (correct), seq 1, ack 76, win 1658, length 0
04:27:09.924494 IP (tos 0x68, ttl 251, id 45284, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.http > $CN_IP.51506: Flags [R.], cksum 0x9162 (correct), seq 1, ack 76, win 1658, length 0
04:27:09.924510 IP (tos 0x68, ttl 251, id 45284, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.http > $CN_IP.51506: Flags [R.], cksum 0x9162 (correct), seq 1, ack 76, win 1658, length 0
04:27:10.048400 IP (tos 0x68, ttl 251, id 34753, offset 0, flags [DF], proto TCP (6), length 52)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.http > $CN_IP.51506: Flags [.], cksum 0xd96f (correct), ack 76, win 509, options [nop,nop,TS val 2237542961 ecr 329431082], length 0
04:27:10.048426 IP (tos 0x68, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    $CN_IP.51506 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.http: Flags [R], cksum 0x90e0 (correct), seq 3187873826, win 0, length 0

3.3 GFW 基于 TLS SNI 的审查设备之 RST 指纹

curl --resolve youtube.com:443:$NON_CN_IP https://youtube.com
sudo tcpdump -v port 443
tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
04:25:15.234561 IP (tos 0x0, ttl 64, id 59308, offset 0, flags [DF], proto TCP (6), length 60)                                                                                    [0/966]
    $CN_IP.35816 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.https: Flags [S], cksum 0x579d (correct), seq 2971216783, win 64240, options [mss 1460,sackOK,TS val 329316397 ecr 0,nop,wscale 7], length 0
04:25:15.365226 IP (tos 0x68, ttl 251, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [S.], cksum 0x4c87 (correct), seq 2839767305, ack 2971216784, win 65160, options [mss 1424,sackOK,TS val 91287507 ecr 329316397,nop,wscale 7], length 0
04:25:15.365257 IP (tos 0x0, ttl 64, id 59309, offset 0, flags [DF], proto TCP (6), length 52)
    $CN_IP.35816 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.https: Flags [.], cksum 0x773f (correct), ack 1, win 502, options [nop,nop,TS val 329316528 ecr 91287507], length 0
04:25:15.428628 IP (tos 0x0, ttl 64, id 59310, offset 0, flags [DF], proto TCP (6), length 569)
    $CN_IP.35816 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.https: Flags [P.], cksum 0x9a41 (correct), seq 1:518, ack 1, win 502, options [nop,nop,TS val 329316591
ecr 91287507], length 517
04:25:15.433547 IP (tos 0x68, ttl 251, id 47980, offset 0, flags [none], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [R], cksum 0x7ed4 (correct), seq 2839767306, win 4547, length 0
04:25:15.434682 IP (tos 0x68, ttl 251, id 11362, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [R.], cksum 0xa0ec (correct), seq 1, ack 518, win 4332, length 0
04:25:15.434682 IP (tos 0x68, ttl 251, id 11362, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [R.], cksum 0xa0ec (correct), seq 1, ack 518, win 4332, length 0
04:25:15.434709 IP (tos 0x68, ttl 251, id 11362, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [R.], cksum 0xa0ec (correct), seq 1, ack 518, win 4332, length 0
04:25:15.435139 IP (tos 0x68, ttl 251, id 42431, offset 0, flags [DF], proto TCP (6), length 40)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [R.], cksum 0xaac5 (correct), seq 1, ack 518, win 1811, length 0
04:25:15.559257 IP (tos 0x68, ttl 251, id 29047, offset 0, flags [DF], proto TCP (6), length 52)
    a$NON_CN_IP.deploy.static.akamaitechnologies.com.https > $CN_IP.35816: Flags [.], cksum 0x7435 (correct), ack 518, win 506, options [nop,nop,TS val 91287701 ecr 3293165
91], length 0
04:25:15.559269 IP (tos 0x68, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    $CN_IP.35816 > a$NON_CN_IP.deploy.static.akamaitechnologies.com.https: Flags [R], cksum 0xc436 (correct), seq 2971217301, win 0, length 0

4. 结束时间

无条件 RST 注入在 2025-08-20 01:48(UTC+8)之前停止,事件持续约 74 分钟(00:34–01:48,UTC+8)。

sudo nmap -sS -p- $NON_CN_IP -oN scan_results.txt -T4 --min-rate 10000 -Pn
Starting Nmap 7.80 ( https://nmap.org ) at 2025-08-20 01:48 CST
Nmap scan report for $NON_CN_IP.deploy.static.akamaitechnologies.com ($NON_CN_IP)
Host is up.
All 65535 scanned ports on $NON_CN_IP.deploy.static.akamaitechnologies.com ($NON_CN_IP) are filtered

5. 感谢

我们感谢许多用户和读者向我们及时的汇报审查事件。特别是这次审查时间持续时间很短,如果没有他们的及时通知,我们不可能在短时间内进行测量。我们还感谢Eric Wustrow提供的部分由国外发往国内的测量数据。

6. 联系我们

这篇报告首发于GFW Report。我们还在net4people同步更新了这篇报告。

我们鼓励您公开地或私下地分享与报告中的发现和假设相关的问题、评论或证据。我们私下的联系方式可见GFW Report的页脚。


评论区