mirror of
https://github.com/jmcorgan/fips.git
synced 2026-07-22 07:48:26 +00:00
Restructures /docs/ by reader purpose (tutorials, how-to, reference, design), adds the new-user-progression and operator-recipe content the prior layout lacked, runs an accuracy pass against current source across the pre-existing design docs, and rewrites the gateway feature-set documentation end-to-end around its actual operational profile (a niche feature designed for systems already serving DHCP/DNS to a LAN, with two independent halves — outbound LAN→mesh, inbound mesh→LAN — sharing one nftables table, one binary, and one control socket). Top-level README and getting-started rewritten around two equally-weighted deployment modes (overlay on existing IP networks; ground-up over non-IP transports). ## Additions - 11 new tutorials in docs/tutorials/: an 8-step new-user progression from single-daemon test-mesh peering through to a ground-up two-device mesh, an IPv6-adapter side-trip walkthrough, an Advanced Tutorials index, and a hand-held OpenWrt walk-through for fips-gateway deployment that exercises both halves of the feature. - 12 new how-tos in docs/how-to/: firewall activation, Nostr discovery (resolve / advertise / open across five scenarios), Tor onion (directory + control_port modes), UDP buffer tuning, unprivileged-user setup, persistent identity, host aliases, Bluetooth LE peering, MTU diagnostics, manual Linux-host gateway deployment (covers both halves), gateway troubleshooting (organised by half), and a section index. - 9 new reference docs in docs/reference/: configuration, wire formats, control-socket protocol, four CLI references (fips, fipsctl, fipstop, fips-gateway), security posture matrix, and Nostr events catalog. Configuration and wire-formats are renamed-and-extended from prior design/ versions; the other seven are net-new. - 6 new design docs: fips-concepts, fips-architecture, and fips-prior-work split out of the deleted fips-intro.md; consolidated fips-mmp and fips-mtu aggregations; and a new generic port-advertisement-and-nat-traversal doc (Nostr-signaled port advertisement plus UDP NAT-traversal protocol, FIPS as an example implementation, suitable for eventual NIP submission). - Top-level docs/getting-started.md walking through the binary-installer-only Install story. - packaging/common/hosts pre-populated with the eight public test-mesh nodes so shortnames resolve out of the box on every fresh install. ## Changes - 23 wire-format diagrams relocated to reference/diagrams/ alongside the wire-formats move. - 4 design diagrams corrected against source code (fips-protocol-stack, fips-identity-derivation, fips-coordinate-discovery, fips-routing-decision). - 10 pre-existing design docs reconciled with current source. Numeric corrections: stale link-MMP report bounds (now [1s, 5s] with 200 ms cold-start floor); UDP default MTU (now 1280, IPv6 minimum); node_addr formula (SHA-256(pubkey)[..16]); Noise patterns (IK at link, XK at session); peer-ACL semantics (strict allowlist requires ALL in peers.deny); daemon DNS upstream ([::1]:5354); on-the-wire bloom-filter size (1,071 bytes); obsolete Cargo-feature references (PR #79 dropped them) removed. - Transport framing tightened across the docs: TCP is for UDP-filtered networks (not NAT traversal); Tor is a deployment mode (not failover); WebSocket dropped (not a shipped FIPS transport); WiFi promoted to Implemented via Ethernet in infrastructure mode; classic-Bluetooth row removed (BLE is the only Bluetooth-mode transport). - docs/design/fips-gateway.md rewritten end-to-end to lead with the niche-feature framing and the two-halves structure. Title moved from "FIPS Outbound LAN Gateway" to "FIPS Gateway"; architecture section describes the common machinery (the fips-gateway service, the nftables table, the control socket) before splitting into separate "Outbound Half" and "Inbound Half" sections of equal weight; security considerations split per-half; no Future Work section (speculative directions live in the project tracker, not in protocol design docs). Inbound port forwarding is a first-class half rather than a buried "Implemented Extensions" subsection. - Gateway terminology unified across all gateway docs as a separate Linux service running alongside the fips daemon (its own systemd unit / OpenWrt init script). Container- pattern terms (sidecar) are reserved for the Docker/Kubernetes sidecar deployment examples — the testing/sidecar/ tree, examples/k8s-sidecar/, examples/sidecar-nostr-relay/, examples/wireguard-sidecar-macos/, and the related CHANGELOG / top-level README entries — where the term carries its standard container meaning. - Net-new design body content: rekey section in fips-mesh-layer (Noise IK msg1/msg2 over the established link, K-bit cutover, drain window, smaller-NodeAddr-wins tie-breaker on dual-init); Mesh Size Estimation and Antipoison FPR Cap sections in fips-bloom-filters; Mesh-Interface Query Filter subsection in fips-ipv6-adapter; failure-suppression knobs and clock- skew tolerance in fips-nostr-discovery; loop-rejection and mid-chain ancestor swap added to spanning-tree propagation / stability rules; Priority Chain in fips-mesh-operation renumbered to match the routing-decision diagram. - Top-level README: dropped the stale nostr-discovery cargo-feature parenthetical. docs/README.md and the four section READMEs (tutorials, how-to, reference, design) refreshed for the new structure; index rows reflect both halves of the gateway feature and the new fips-gateway CLI reference. - Cargo.toml [package.metadata.deb] assets path updated for the fips-security.md move; .gitignore /reference/ rule anchored to repo root so docs/reference/ is trackable. - packaging/openwrt-ipk/files/etc/fips/fips.yaml configuration-doc URL updated to the new docs/reference/configuration.md location. ## Deletions - docs/design/fips-intro.md (split into the three new intro design docs). - docs/design/document-relationships.svg (orphan, no longer referenced). - docs/proposals/ tree removed; the only proposal it contained (the Nostr UDP hole-punch protocol) was rewritten as the new generic design/port-advertisement-and-nat-traversal.md.
126 lines
5.2 KiB
Markdown
126 lines
5.2 KiB
Markdown
# `fips-gateway`
|
|
|
|
Long-running service that bridges a LAN segment into the FIPS mesh.
|
|
|
|
## Synopsis
|
|
|
|
```text
|
|
fips-gateway [-c FILE] [-l LEVEL]
|
|
```
|
|
|
|
## Description
|
|
|
|
`fips-gateway` runs alongside `fips` on the same host, reads the same
|
|
`fips.yaml`, and exposes two complementary functions to the LAN it
|
|
fronts:
|
|
|
|
- **Outbound (LAN -> mesh).** Allocates a virtual IPv6 from a managed
|
|
pool when a LAN client resolves `<npub>.fips`, installs nftables
|
|
DNAT/SNAT/masquerade rules so the client's traffic is rewritten and
|
|
carried into the mesh through the daemon's `fips0` adapter.
|
|
- **Inbound (mesh -> LAN).** Installs nftables DNAT and LAN-side
|
|
masquerade rules so mesh-side traffic arriving on `fips0` for the
|
|
configured listen ports is rewritten to a LAN `host:port`, per the
|
|
`gateway.port_forwards[]` block.
|
|
|
|
The service runs alongside `fips`, not as a replacement for it:
|
|
the daemon must be running on the same host with the TUN adapter
|
|
and DNS resolver enabled. The gateway is read-only with respect to the
|
|
daemon's state, and connects to the daemon's resolver only — it is
|
|
not a peer. For the architecture, see
|
|
[../design/fips-gateway.md](../design/fips-gateway.md).
|
|
|
|
`fips-gateway` is **Linux-only**. The binary errors out and exits with
|
|
status `1` on any other platform, since the NAT pipeline is built on
|
|
nftables and proxy NDP. See
|
|
[Configuration](#configuration) for the platform notes that follow
|
|
from this.
|
|
|
|
## Options
|
|
|
|
| Flag | Argument | Default | Description |
|
|
| ---- | -------- | ------- | ----------- |
|
|
| `-c`, `--config` | `FILE` | *(default search paths)* | Use `FILE` as the configuration. Skips the default search paths. |
|
|
| `-l`, `--log-level` | `LEVEL` | `info` | Tracing level: `trace`, `debug`, `info`, `warn`, `error`. Overridden by `RUST_LOG` if set (see [Environment](#environment)). |
|
|
| `-V` | — | — | Print the short version. |
|
|
| `--version` | — | — | Print the long version (short version plus build target triple). |
|
|
| `-h`, `--help` | — | — | Print usage and exit. |
|
|
|
|
## Configuration
|
|
|
|
`fips-gateway` reads the same `fips.yaml` as `fips`; the gateway is
|
|
configured under the top-level `gateway:` block. The block must
|
|
include at minimum `enabled: true`, `pool`, and `lan_interface`. For
|
|
each field — pool, LAN interface, DNS listener, conntrack overrides,
|
|
and inbound `port_forwards[]` — see the
|
|
[Gateway section](configuration.md#gateway-gateway) of the
|
|
configuration reference.
|
|
|
|
The same default search paths apply as for `fips`
|
|
(see [`fips`](cli-fips.md#files)); `-c FILE` overrides the search.
|
|
The gateway must be able to read the same configuration file the
|
|
daemon is reading, or the two will disagree about pool, DNS port,
|
|
and LAN interface.
|
|
|
|
For deployment recipes, see
|
|
[../how-to/deploy-gateway.md](../how-to/deploy-gateway.md) (manual
|
|
Linux host) and
|
|
[../tutorials/deploy-fips-gateway.md](../tutorials/deploy-fips-gateway.md)
|
|
(OpenWrt walk-through).
|
|
|
|
## Exit Codes
|
|
|
|
| Code | Meaning |
|
|
| ---- | ------- |
|
|
| `0` | Clean shutdown after `SIGINT` / `SIGTERM`. |
|
|
| `1` | Non-Linux platform, configuration load failure, missing or invalid `gateway:` block, NAT/network setup failure, or control-socket bind failure. The reason is printed to stderr or the log before exit. |
|
|
|
|
## Environment
|
|
|
|
| Variable | Description |
|
|
| -------- | ----------- |
|
|
| `RUST_LOG` | Tracing filter directive. Takes precedence over `--log-level`. Examples: `info`, `debug`, `fips=trace,fips::gateway=debug`. |
|
|
|
|
## Files
|
|
|
|
| Path | Purpose |
|
|
| ---- | ------- |
|
|
| `/etc/fips/fips.yaml` | Gateway configuration (top-level `gateway:` block). Same file the daemon reads. |
|
|
| `/run/fips/gateway.sock` | Gateway control socket. Hardcoded path; chowned to group `fips` (mode `0770`) at startup so members of that group can query without sudo. |
|
|
| `inet fips_gateway` (nftables) | NAT table the gateway installs and tears down. View with `nft list table inet fips_gateway`. |
|
|
|
|
The gateway also adds and removes a `local <pool-cidr> dev lo` route
|
|
in the local routing table so the kernel accepts pool addresses as
|
|
locally-owned.
|
|
|
|
## Control Socket
|
|
|
|
`fips-gateway` exposes a JSON line-protocol control socket separate
|
|
from the daemon's. The command set (`show_gateway`, `show_mappings`)
|
|
and JSON shapes are documented in the
|
|
[Gateway Command Catalog](control-socket.md#gateway-command-catalog).
|
|
|
|
There is no `fipsctl` subcommand for the gateway — query the socket
|
|
directly with `nc -U`, or watch the **Gateway** tab in
|
|
[`fipstop`](cli-fipstop.md), which polls the gateway socket
|
|
automatically.
|
|
|
|
## See also
|
|
|
|
- [`fips`](cli-fips.md) — the daemon. Required to be running on the
|
|
same host.
|
|
- [`fipstop`](cli-fipstop.md) — the live-status TUI; its Gateway tab
|
|
polls the gateway control socket.
|
|
- [configuration.md § Gateway](configuration.md#gateway-gateway) —
|
|
full `gateway.*` block reference.
|
|
- [control-socket.md § Gateway Command Catalog](control-socket.md#gateway-command-catalog)
|
|
— wire protocol for the gateway socket.
|
|
- [../design/fips-gateway.md](../design/fips-gateway.md) — design,
|
|
NAT pipeline, virtual IP pool lifecycle.
|
|
- [../how-to/deploy-gateway.md](../how-to/deploy-gateway.md) — manual
|
|
Linux deployment.
|
|
- [../how-to/troubleshoot-gateway.md](../how-to/troubleshoot-gateway.md)
|
|
— diagnostic recipes.
|
|
- [../tutorials/deploy-fips-gateway.md](../tutorials/deploy-fips-gateway.md)
|
|
— OpenWrt walk-through.
|