113 lines
6.7 KiB
Markdown
113 lines
6.7 KiB
Markdown
# HTTP and WebSocket API
|
||
|
||
The application is served below `/api`. FastAPI validates request models and
|
||
publishes the complete JSON Schema at `/api/openapi.json`; use it for exact field
|
||
types and the current response schema. This page documents semantics and all
|
||
mounted operations.
|
||
|
||
## General endpoints
|
||
|
||
| Method/path | Meaning |
|
||
| --- | --- |
|
||
| `GET /api/hello` | Simple application health response. |
|
||
| `GET /api/versions` | Returns the Python runtime version. |
|
||
|
||
## Network: `/api/network`
|
||
|
||
| Method/path | Parameters/body | Behaviour |
|
||
| --- | --- | --- |
|
||
| `GET /interfaces` | none | Lists interfaces, addresses, flags, MTU, MAC, state and Ethernet profile. |
|
||
| `GET /routes` | none | Lists kernel route entries and resolved output-interface names. |
|
||
| `GET /links` | none | Lists raw link information. |
|
||
| `GET /bridges` | none | Lists Linux bridges, STP state and current member details. |
|
||
| `GET /full-state` | none | Combines interfaces, routes, links and bridges into one snapshot. |
|
||
| `POST /interfaces/reset-defaults` | `{ interfaces: string[] }` | Resets each requested interface to MTU 1500 and attempts to restore an automatic Ethernet profile through `ethtool`. |
|
||
| `POST /bridge/create` | `{ name, interfaces }` | Creates a Linux bridge and attaches listed interfaces. |
|
||
| `POST /bridge/remove` | `{ name }` | Removes an existing bridge. |
|
||
| `GET /bridge/link-state-watchers` | none | Returns all watcher states. |
|
||
| `GET /bridge/{bridge_name}/link-state-watcher` | path name | Returns one bridge watcher state. |
|
||
| `POST /bridge/{bridge_name}/link-state-watcher/enable` | optional recovery holdoff | Enables member failure/recovery propagation. |
|
||
| `POST /bridge/{bridge_name}/link-state-watcher/disable` | path name | Stops and removes that watcher. |
|
||
| `WS /ws/state` | none | Receives full network-state update payloads after network mutations. |
|
||
|
||
An interface object includes its kernel index, name, state, MAC, MTU, decoded flags,
|
||
assigned IPv4/IPv6 addresses, and, where available, speed/duplex/autoneg data.
|
||
|
||
## Sniffer: `/api/sniffer`
|
||
|
||
| Method/path | Parameters/body | Behaviour |
|
||
| --- | --- | --- |
|
||
| `POST /start` | exactly one of `bridge` or `interface`; optional `bridge_capture_mode`, `benchmark_mode` | Creates a capture session. Bridge modes are `tc_ebpf` and `af_packet`. |
|
||
| `POST /stop` | optional session ID or bridge/interface selector | Stops an identified session, target sessions, or all sessions according to the request. |
|
||
| `GET /status` | none | Returns status keyed by captured interface: running/existing/up state, owner session, mode, and benchmark mode. |
|
||
| `GET /debug` | none | Returns internal session, buffered-record, tshark, telemetry, and tracker state. Treat as diagnostic output, not a stable client contract. |
|
||
|
||
The start endpoint rejects requests containing both a bridge and an interface, or
|
||
neither. A bridge defaults to `tc_ebpf`; an interface always captures using
|
||
AF_PACKET.
|
||
|
||
## Packets: `/api/packets`
|
||
|
||
| Method/path | Parameters/body | Behaviour |
|
||
| --- | --- | --- |
|
||
| `GET /packets?limit=100` | `limit` 1–10,000 | Fetches most-recent normalized packet rows. |
|
||
| `DELETE /packets?reset_id=true` | optional boolean | Clears packet history; can reset database identity state. |
|
||
| `WS /ws/packets` | none | Receives packet updates from the in-process broadcaster. |
|
||
|
||
REST history is authoritative. WebSocket clients must expect connection loss and
|
||
dropped messages for a slow subscriber, then refill missed state with `GET`.
|
||
|
||
## Analysis: `/api/analysis`
|
||
|
||
Every analysis endpoint accepts `since_minutes` when shown; its valid range is
|
||
1 minute to 30 days. Results are derived from the stored packet history and do not
|
||
claim ground truth about a physical topology or attack.
|
||
|
||
| Method/path | Main query controls | Result |
|
||
| --- | --- | --- |
|
||
| `GET /interface-hosts` | `since_minutes`, `limit_per_interface` | Likely hosts attached to each MITM-side interface. |
|
||
| `GET /interface-host-protocols` | plus `limit_protocols_per_host` | Attachment inference with per-host protocol evidence. |
|
||
| `GET /interface-protocol-paths` | `limit_paths` | Directional aggregated paths for a Sankey-style view. |
|
||
| `GET /conversations` | `limit` | Aggregated directional endpoint conversations. |
|
||
| `GET /conversation-flow-detail` | `flow_id` or directional endpoint/port fields; `protocol`, `limit_packets` | Ordered packets, subflows, and derived request/response events. |
|
||
| `GET /host-intelligence` | `limit_hosts` | Host-centric peers, service and hostname hints. |
|
||
| `GET /discovery` | `limit` | Discovery, naming and service-advertisement activity. |
|
||
| `GET /anomalies` | `limit` | Heuristic scan, beacon, rare service, reset-heavy and drop-heavy candidates. |
|
||
|
||
`conversation-flow-detail` requires a `flow_id` or enough directional fields to
|
||
identify a conversation. All analysis endpoints return 503 while the database is
|
||
unavailable and 500 when their underlying query fails.
|
||
|
||
## Firewall: `/api/firewall`
|
||
|
||
| Method/path | Body/query | Behaviour |
|
||
| --- | --- | --- |
|
||
| `GET /rules` | none | Lists nftables ruleset in a predictable structured representation, enriched with textual rule data where possible. |
|
||
| `DELETE /rules/{handle}` | optional family/table/chain defaults | Deletes the rule identified by its nft handle. |
|
||
| `POST /raw` | `{ cmd: string }` | Executes an arbitrary textual nft command and returns stdout/stderr/return code. |
|
||
|
||
The raw endpoint is intentionally powerful and must not be exposed to untrusted
|
||
clients. It changes the host firewall, not an application-local simulation.
|
||
|
||
## Scripts: `/api/scripts/scripts`
|
||
|
||
The doubled path is produced by the current combination of router and application
|
||
prefixes. Scripts are Python NFQUEUE workers installed under `/srv/fw-scripts` and
|
||
can have systemd units and isolated virtual environments.
|
||
|
||
| Method/path | Behaviour |
|
||
| --- | --- |
|
||
| `GET /` | Lists scripts and their unit mappings/status. |
|
||
| `POST /` | Uploads a script multipart payload; accepts a script, optional requirements file and required name form field. |
|
||
| `GET /{name}` | Downloads script source. |
|
||
| `GET /{name}/requirements` | Downloads its requirements file. |
|
||
| `PUT /{name}/requirements` | Replaces requirements and runs pip install in the script venv. |
|
||
| `DELETE /{name}/requirements` | Deletes requirements and removes the venv. |
|
||
| `POST /{name}/enable` | Creates/starts an NFQUEUE systemd service for a requested queue number. |
|
||
| `POST /{name}/disable` | Stops/disables the service for a queue number. |
|
||
| `DELETE /{name}` | Removes all, or one requested queue-number unit, then cleans script-related files as appropriate. |
|
||
|
||
Names allow letters, digits, `.`, `_`, and `-`; `.` and `..` are prohibited.
|
||
Repository example scripts are protected from API modification. Enabling/uploading
|
||
requirements has code-execution and host-service consequences.
|