ai_api / src /mitm /tproxy /native /README.md
Yogesh
initial deploy
cd8bd0a
|
Raw
History Blame Contribute Delete
2.78 kB
# TPROXY transparent-socket native addon
Tiny N-API addon for Fase 3 / Epic A (TPROXY transparent capture mode). Node's
`net` module cannot `setsockopt(IP_TRANSPARENT)` before `bind()`, which TPROXY
requires (otherwise the kernel drops the redirected packets). `transparent.c`
does `socket()`+`SO_REUSEADDR`+`IP_TRANSPARENT`+`bind()`+`listen()` and returns
the raw fd; Node adopts it via `server.listen({ fd })` and reads the original
destination from `socket.localAddress`/`localPort` (TPROXY preserves it β€” no
`SO_ORIGINAL_DST`/NAT).
## Status: groundwork (opt-in, not wired into a capture mode yet)
Loaded conditionally by `../transparentSocket.ts`. A JS-only install (no
toolchain, or non-Linux) keeps working β€” the TPROXY mode is gated on the addon
being available.
**Viability proven on the VPS (kernel 6.8.0-124):** the prebuilt `.node`,
compiled under one Node version, loaded under a different one (N-API is
ABI-stable) and, as root, created the IP_TRANSPARENT socket which Node adopted
via `server.listen({ fd })`. The TPROXY iptables/ip-rule apply+revert was also
validated against the same kernel (see PR #4139).
## Build (opt-in, Linux + C toolchain)
```bash
npm run build:native:tproxy # -> build/Release/transparent.node
```
`build/` and `prebuilds/` are git-ignored β€” the binary is **built, never
committed**.
## Distribution (wired into the production build)
1. **`scripts/build/build-tproxy-native.mjs`** runs `node-gyp rebuild` during
`npm run build` (called from `build-next-isolated.mjs` before the standalone is
assembled). Linux-only; a missing toolchain is **non-fatal** (the capture mode
degrades gracefully). The Docker builder already ships `python3 make g++`.
2. **`assembleStandalone.mjs`** (`NATIVE_ASSET_ENTRIES`) copies
`build/Release/transparent.node` into the standalone bundle at the same
relative path. The source is absent on non-Linux builds β†’ the copy skips it.
3. **`transparentSocket.ts`** resolves the addon both module-relative (dev/source)
and **cwd-relative** (`<cwd>/src/mitm/tproxy/native/...`, where the standalone
server runs and step 2 placed it).
IP_TRANSPARENT is Linux-only, so only the linux-x64 path is built; everywhere else
the loader returns "unavailable" and TPROXY capture mode stays disabled. (Linux
ARM64 / other arches: build on the target, or add to CI when needed.)
## Epic A status: COMPLETE (validated e2e on the VPS)
The full intercept β†’ TLS-terminate β†’ decrypt β†’ capture (`source:"tproxy"`) β†’
re-encrypted forward β†’ upstream round-trip was validated end-to-end on the VPS
(kernel 6.8.0), including the anti-loop fix (PR #4229). Wired via the capture
manager (#4208), the local-only route + CA installer (#4211), and the Traffic
Inspector toggle (#4216).