lou 3809f76c29 worker: ctypes 手写版 ABI 错误致 verdict 发坏包瘫痪, 重写为官方 python3-netfilterqueue
根因链(2026-09-09 首跑瘫痪复盘):
1. 回调签名 3 参(实际 4 参: qh/nfmsg/nfad/data) -> nfad 拿到 nfgenmsg 指针
2. nfq_set_mode(0) = COPY_NONE 不拷包, payload 全空
3. verdict id 传 0 / 未改包路径无 verdict -> SYN 悬挂队列被内核丢弃
   -> 新 TCP 连接全断(已建连接不受影响)
对照实验: 官方 netfilterqueue 绑定 accept 正常 -> 弃 ctypes 改用它
- set_payload+accept 等价 verdict2 改包放行, 异常一律 accept
- 依赖: apt/opkg install python3-netfilterqueue(venv 已装)
- run() 循环 select 化 + SIGTERM 优雅退出
2026-09-09 15:59:45 +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%