lou af43b07dc0 fix: 清 Pylance 类型检查提示(老板标注)
- client.py: 删未使用导入 TYPE_AUTH_OK/TYPE_DNS_RESP/TYPE_HTTP_RESP
- dnsmsg.py: flags 解包后未用 -> 补 QR=1 响应拒绝(符合'非 query 返回 None'语义)
- httpmsg.py: headers default_factory=list 推断 Unknown -> lambda: [] 显式类型
- smoke_channel.py: 删未使用导入 json/os/socket/FrameReader/pack_frame; cfg 显式 dict[str, object]
- analyze_capture.py: proto Counter() 无类型参数 -> Counter[int]
2026-09-09 16:32:31 +08:00
2026-09-09 14:04:45 +08:00

vpn回环防火墙及系统伪装

内网多设备(NAT 共享一个校园网账号)出网流量特征归一化: 让检测方(深信服 AC / 防共享检测)看到的是一台 Windows 设备, 而不是 NAT 后面一堆 Linux/Android 设备。

架构(设计定案 2026-09-09, 详见 network-circumvention 技能

references/device-fingerprint-unification.md)

内网设备 -> 软路由:
  L1 伪装器(masquerader/): nftables + NFQUEUE
     TTL 全协议统一 128(TCP/UDP/ICMP)
     SYN 重写为 Windows 10 布局(window 64240 / wscale 8 / MSS 1460,
     剥 TS option - 协商级移除, 多设备时钟分离信号失效)
  L2 分流器(channel/proxy_*.py):
     HTTPS -> 直连(大头)
     HTTP 明文(80) -> 透明代理 -> 云通道(deploy/hook.sh REDIRECT)
     DNS -> smartdns 上游指向 127.0.0.1#8053, 按域名分流:
       内网/学校域(.internal.example)-> 本地学校 DNS(192.0.2.53)
       公网域 -> 云通道递归
  L3 云服务器(channel/server.py, 203.0.113.10):
     TLS 监听 + AUTH token; HTTP -> 统一 UA 的 HTTPS 重新发起;
     DNS -> 223.5.5.5 递归

过 AC 的流量 = HTTPS 直连 + 一条云通道(外观 = 普通 HTTPS 访问云服务器), HTTP 明文/DNS 查询零暴露。学校管控动机: UDP 53 重定向劫持(域名级审计)与 UDP 封锁 -> DoH 套壳走 TCP 443 绕开, DoH 不能直连(学校封已知 DoH 服务器), 必须套在自己云服务器的通道里。

L1 伪装器(masquerader/)

  • rewrite.py: 纯函数核心, 输入原始 IPv4 TCP SYN, 输出 Windows 布局包; 非 SYN/非 IPv4/畸形一律 None(放行)
  • worker.py: NFQUEUE worker(ctypes), 部署软路由 OpenWrt x86_64
  • 铁律(9-06 zapret 断网复盘): 改包后原包 ACCEPT, 绝不走 desync 重发; 异常一律放行(宁可不伪装, 不能断网)

L2/L3 通道(channel/)

  • proto.py: 帧协议 [1B type][4B req_id][4B len][payload], req_id 多路复用
  • client.py: L2 通道客户端(TLS 长连 + AUTH + 断线重连, 全标准库)
  • proxy_http.py: 本地 HTTP 透明代理(REDIRECT 进来的明文 80 请求走通道)
  • proxy_dns.py: 本地 DNS 分流代理(内网域本地 / 公网域走通道, query 原样透传)
  • server.py: L3 云端(套壳转发 + DNS 递归 + AUTH)
  • scripts/smoke_channel.py: 本机端到端冒烟(自签证书起真 server+client)

部署注意:

  • 云端 TLS 证书: openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365; config/channel.json 两端 token 必须一致且改掉默认
  • 指纹边界: 标准库 TLS 的 JA3 不是 Chrome, 但"统一"目标已达成(检测方要的是 多设备多指纹, 不是精确 OS); 完美 JA3 需 Go uTLS 重写, 留后续
  • 云服务器批量外连有阿里云黑洞前科: deny_suffixes 拉黑国外/高风险目标

测试

.venv/bin/python -m unittest discover -s tests -t . -v   # 40 个单测
PYTHONPATH=. .venv/bin/python scripts/smoke_channel.py   # 端到端冒烟

落地顺序

  1. L1 伪装器(masquerader/, 完成, 独立可验)
  2. L2/L3 通道(channel/, 完成, 本机冒烟通过)
  3. 部署: 软路由侦察 -> 云端起 server + 软路由起代理 -> hook.sh + smartdns 上游
  4. 分流表细化(流媒体/大下载域名回本地解析等)

待办侦察(老板回寝室网后): 软路由 zapret 残留规则/mangle 现状/nfqws 自编译产物; 当前 HTTP 明文流量摸底。

S
Description
内网出口流量伪装系统: NAT 多设备出口统一为单一 Windows 指纹 (SYN 重写 + HTTP/DNS 加密套壳通道)
Readme MIT 104 KiB
Languages
Python 82.8%
Shell 17.2%