Skip to content

Latest commit

 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Glasswing

玻璃翼蝶,在规则下透明穿行

校园网动态监测规则与受限网络环境下的自愈工具包

顺便

致敬山西某个最开放、最有魅力、最支持个人发展、最以网络和信息项目头牌自居、默认荣誉共享给校方的高校

对就是你们

你们网安写的限制规则像厕纸:)

如果能做得到的话就试着来阻止我口牙

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 全开时测,误判出「域名前置检测」;关掉后复测 否定该结论 探测前必须关代理三件套

设计要点

  1. 健康检查必须发真实请求 —— 只看「端口是否监听」识别不出「TCP 通但数据被丢」的干扰
  2. 判定要连续 N 次失败 —— 代理重启有几秒空窗,否则会误切
  3. 健康检查目标不能选被墙站点 —— 默认用 apple.com,否则会对通路进行误判
  4. 分流必做 —— 国内域名直连,否则墙内应用会被代理gank掉
  5. 探测前必须关代理 —— 要关 TUN + 系统代理 + fake-ip DNS 三件套。 本报告初版就是开着 FlClash 测的,导致 DNS 被接管、国外 IP 实际走了节点,还误判出一条并不存在的规则
  6. 同一靶机不要连续猛测 —— 会触发 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 下可读写系统代理,其它平台自动降级)


合规性与免责声明

本工具用于紧急情况下的网络诊断与自身连接可用性维护,面向被屏蔽环境下的仍必要的学习与技术研究需求。 使用者应自行遵守所在国家/地区的法律法规及所在学校的网络管理规定。 请勿用于任何未经授权的用途。 如需长期大规模零抖动通量仍需自行寻找出路。 生命会找到出路的。

License

MIT

About

A local, zero-dependency project built with Python’s standard library. It monitors campus network rules, identifies upstream blocking in restricted networks, and provides self-healing tools to keep connections alive.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages