玻璃翼蝶,在规则下透明穿行
校园网动态监测规则与受限网络环境下的自愈工具包
顺便
致敬山西某个最开放、最有魅力、最支持个人发展、最以网络和信息项目头牌自居、默认荣誉共享给校方的高校
对就是你们
你们网安写的限制规则像厕纸:)
如果能做得到的话就试着来阻止我口牙
Glasswing 用 Python 标准库写成,用于在被观测、被限制的网络环境里, 摸清上游阻断方式,并让链接存活。
此项目名取自 Greta oto(玻璃翼蝶),即翅膀透明的蝴蝶,传说能在死神的注视之下飞过而不被发现。
python -m glasswing probe # 四类探测:DNS 劫持 / SNI 黑名单 / 端口策略 / 代理数据面
python -m glasswing rules # 依据探测结果输出规则推测
python -m glasswing report # 生成 Markdown 报告(含原始数据)
python -m glasswing guard # 常驻守护:通道失效时自动切换
python -m glasswing gen-config # 生成带分流的代理配置(国内直连 + 境外代理)
python -m glasswing proxy # 查看 / 设置 / 关闭系统代理常用参数:
python -m glasswing probe --ports 7890,7891 --json out/probe.json
python -m glasswing guard --ports 7890,7891,7892 --interval 10 --threshold 2
python -m glasswing guard --once --dry-run # 只检查一次,不改系统代理
python -m glasswing gen-config -i nodes.yaml -o out/config.yaml
python -m glasswing proxy --set 127.0.0.1:7890
probe会主动检测本机代理是否在干扰探测(系统代理 / TUN / fake-ip), 想要准确的上游结论,请先关闭代理再测。
| 层面 | 现象 | 判定 |
|---|---|---|
| DNS | 自设 223.5.5.5 仍返回假地址(google.com → 127.0.0.1),DoH(443) 可用 |
53/UDP 被劫持,换 DNS 无效 |
| 端口 | 443/80 及 8080/8443/2053/2096 均可连,22 可连,仅 53 受限 | 无端口封锁,隧道端口自由 |
| IP | 境外 IP 普遍可 TCP 连通 | 并非锁死境外链接 |
| SNI | google/chatgpt/ao3/dlsite/pixiv/reddit/microsoft.com 稳定超时;github/cloudflare 针对性banIP 露头就秒;apple/bing 正常 |
选择性 + 动态 SNI 黑名单 |
| 代理流量 | 小请求 71 分钟无异常、750MB动态下载无异常;实际使用(多域名 + 多连接 + 长会话)3~20 分钟内被检测到 | 识别代理会话后施加间歇性数据干扰 |
| 失效特征 | TCP 握手 OK 但数据传输全丢;节点约 13~16 分钟后自行恢复 |
干扰型,短期封禁数分钟至数十分钟,非永久封 IP |
| SNI 解耦 | 同一国外 IP 换 SNI:chatgpt/youtube 被 RST 注入(34ms),python.org/qq.com/taobao.com 全放行;同一被封 SNI 打国内 CDN IP 也放行 |
只看 SNI 在不在黑名单,不查 SNI↔IP 归属;拦的是国际出口 |
| RST 注入位置 | 封禁 23~35ms 就返回,真实服务器要 84~101ms | 重置包来自链路中段,不是两端 |
| 分片绕过 | ClientHello 拆 1 / 5 字节发送,照旧被 RST | 设备做 TCP 流重组,客户端 fragment 类参数无效 |
| IP 级惩罚 | 被密集探测的国外 IP 整体 TCP 不通,次日复查已自动恢复 | 行为触发 + 状态化 + 带 TTL 的惩罚名单 |
| IP 级封锁 | Google 真实 IP(DoH 取得)TCP 握手就失败 | 与 SNI 黑名单是两套机制:一类 RST,一类压根不通 |
| 黑名单画像 | 实测命中 17 个:youtube / x / facebook / instagram / wikipedia / nytimes / bbc / chatgpt / openai / claude / gemini / ao3 / pixiv / reddit / discord / github / raw.githubusercontent | 是当代 GFW 清单的样子,不是校园分类库 |
| 设备判定 | 无阻断页、无 302、不拦国内站;手法是中段注入 RST | 国家级 / 省级有状态 DPI,非校园自购行为管理设备 |
| 探测污染 | 初版在 FlClash 全开时测,误判出「域名前置检测」;关掉后复测 否定该结论 | 探测前必须关代理三件套 |
- 健康检查必须发真实请求 —— 只看「端口是否监听」识别不出「TCP 通但数据被丢」的干扰
- 判定要连续 N 次失败 —— 代理重启有几秒空窗,否则会误切
- 健康检查目标不能选被墙站点 —— 默认用
apple.com,否则会对通路进行误判 - 分流必做 —— 国内域名直连,否则墙内应用会被代理gank掉
- 探测前必须关代理 —— 要关 TUN + 系统代理 + fake-ip DNS 三件套。 本报告初版就是开着 FlClash 测的,导致 DNS 被接管、国外 IP 实际走了节点,还误判出一条并不存在的规则
- 同一靶机不要连续猛测 —— 会触发 IP 级惩罚,之后测到的只是「惩罚状态」,不是规则本身
| 文档 | 内容 |
|---|---|
RULES-REPORT.md |
上游阻断规则画像(DNS / SNI / 分片 / IP 惩罚的完整实测数据、复测修正记录与判定) |
SELFHOST.md |
自建节点方案(协议对照、部署与接入流程、验证方法、安全红线) |
GUARD-OPS.md |
守护系统运维手册(巡检、故障处理、补节点、绝对红线) |
scripts/probe_tls.py |
TLS/SNI 探测工具(中性靶机法,判定 RST 注入与放行) |
scripts/reality-server.sh |
VLESS+REALITY 服务端一键部署脚本(密钥运行时生成,不写死) |
- 工具本身不含任何凭据,也不读取订阅链接;
- 节点配置与输出目录已在
.gitignore中排除(config.yaml/nodes//out//.env/ 日志); - 需要密钥时一律走环境变量。
git check-ignore config.yaml .env out/ -v # 提交前自检Python 3.9+ / Windows / macOS / Linux(Windows 下可读写系统代理,其它平台自动降级)
本工具用于紧急情况下的网络诊断与自身连接可用性维护,面向被屏蔽环境下的仍必要的学习与技术研究需求。 使用者应自行遵守所在国家/地区的法律法规及所在学校的网络管理规定。 请勿用于任何未经授权的用途。 如需长期大规模零抖动通量仍需自行寻找出路。 生命会找到出路的。
MIT