作者: Mingshi Wu
日期: 2025年8月20日,星期三
English Version: Analysis of the GFW's Unconditional Port 443 Block on August 20, 2025
2025 年 8 月 20 日北京时间(UTC+8)约 00:34 至 01:48 间,中国国家防火墙(GFW)出现异常行为:对所有指向 TCP 443 端口的连接无条件注入伪造的 TCP RST+ACK
包,导致连接中断。该事件引发了中国与世界其他地区之间的大规模互联网连通性故障(来源1 与 来源2)。
本报告记录了我们对这一短暂但广泛的封禁事件的测量与分析。主要发现如下:
RST+ACK
注入仅发生在 TCP 443 端口,未见于其他常见端口(如 22、80、8443)。SYN
包与服务器的 SYN+ACK
包各自触发三个 RST+ACK
包;从境外向中国境内发起的连接,只有服务器返回的 SYN+ACK
会触发 RST+ACK
,客户端发送的 SYN
不会触发注入。需注意的是,本次事件持续时间较短(约 74 分钟),对我们的测量和分析带来一定限制。我们鼓励社区成员分享各自的观测与分析,以共同完善对该事件的理解。
我们首先从中国境内(AS45090,腾讯云,北京)与多个境外测量点同时发起探测以确认封禁。
我们使用如下命令尝试与 $NON_CN_IP
建立 TCP 三次握手:
nc -vn $NON_CN_IP 443
同时使用 tcpdump
抓包:
tcpdump -n host $NON_CN_IP
观测显示:客户端发送的 SYN
包会触发三连发伪造 RST+ACK
,其相对序列号均为 0
,TCP 窗口大小递增为 1980
、1981
、1982
。服务器返回的 SYN+ACK
同样会触发三连发 RST+ACK
,其相对序列号为 1
,TCP 窗口大小递增为 3293
、3294
、3295
。
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
从境外同样可以触发 RST+ACK
注入。此处 $CN_IP
为 baidu.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
)时,无法触发封禁。
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
中国的 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 设备引起,要么是已知设备处于一种新颖或误配置的工作状态。
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 报文特征
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
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
无条件 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
我们感谢许多用户和读者向我们及时的汇报审查事件。特别是这次审查时间持续时间很短,如果没有他们的及时通知,我们不可能在短时间内进行测量。我们还感谢Eric Wustrow提供的部分由国外发往国内的测量数据。
这篇报告首发于GFW Report。我们还在net4people同步更新了这篇报告。
我们鼓励您公开地或私下地分享与报告中的发现和假设相关的问题、评论或证据。我们私下的联系方式可见GFW Report的页脚。