mirror of
https://github.com/jmcorgan/fips.git
synced 2026-07-30 19:46:15 +00:00
Operator-facing IPs in user-visible configs/docs (examples, tutorials, packaging, sidecar templates) are now the resolvable hostnames of the public test fleet (test-us01.fips.network, etc.) so they keep working without baking specific addresses into examples. Doc-comment and test fixtures in src/config/transport.rs use RFC 5737 TEST-NET-2 (198.51.100.1) so they cannot accidentally point at a real host. Also resyncs the openwrt-ipk fips.yaml with the common reference (merge from master) and applies the same DNS-name swap there.
252 lines
6.8 KiB
Markdown
252 lines
6.8 KiB
Markdown
# FIPS Installation Guide
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
tar xzf fips-*-linux-*.tar.gz
|
|
cd fips-*-linux-*/
|
|
sudo ./install.sh
|
|
```
|
|
|
|
## What Gets Installed
|
|
|
|
| File | Location |
|
|
|------|----------|
|
|
| fips (daemon) | /usr/local/bin/fips |
|
|
| fipsctl (CLI) | /usr/local/bin/fipsctl |
|
|
| fipstop (TUI) | /usr/local/bin/fipstop |
|
|
| fips-gateway (LAN bridge) | /usr/local/bin/fips-gateway |
|
|
| Configuration | /etc/fips/fips.yaml |
|
|
| Identity key | /etc/fips/fips.key (auto-generated) |
|
|
| Public key | /etc/fips/fips.pub (auto-generated) |
|
|
| Hosts file | /etc/fips/hosts |
|
|
| Firewall baseline | /etc/fips/fips.nft |
|
|
| Firewall drop-in directory | /etc/fips/fips.d/ |
|
|
| Daemon unit | /etc/systemd/system/fips.service (enabled) |
|
|
| DNS routing unit | /etc/systemd/system/fips-dns.service (enabled) |
|
|
| Gateway unit | /etc/systemd/system/fips-gateway.service (NOT enabled) |
|
|
| Firewall unit | /etc/systemd/system/fips-firewall.service (NOT enabled) |
|
|
| DNS helpers | /usr/lib/fips/fips-dns-{setup,teardown} |
|
|
|
|
A system group `fips` is created for control socket access. By
|
|
default, only `fips.service` and `fips-dns.service` are enabled at
|
|
install time. `fips-gateway.service` and `fips-firewall.service`
|
|
are installed but require explicit operator opt-in (see the
|
|
sections below).
|
|
|
|
## Post-Install Configuration
|
|
|
|
Edit `/etc/fips/fips.yaml` before starting the service.
|
|
|
|
### 1. Identity
|
|
|
|
By default, the node generates a new ephemeral identity on each start
|
|
for privacy. If the node's npub will be published for others to use as a
|
|
static peer, enable a stable identity by uncommenting `persistent: true`
|
|
in the identity section:
|
|
|
|
```yaml
|
|
node:
|
|
identity:
|
|
persistent: true
|
|
```
|
|
|
|
On first start with persistence enabled, a keypair is auto-generated and saved:
|
|
|
|
- `/etc/fips/fips.key` (mode 0600) — secret key
|
|
- `/etc/fips/fips.pub` (mode 0644) — public key (npub)
|
|
|
|
The same identity is reused on subsequent starts. Alternatively, set
|
|
`node.identity.nsec` to use a specific key.
|
|
|
|
### 2. Ethernet Transport
|
|
|
|
If using Ethernet for local mesh discovery, uncomment the ethernet section
|
|
and set the interface name:
|
|
|
|
```yaml
|
|
transports:
|
|
ethernet:
|
|
interface: "eth0"
|
|
discovery: true
|
|
announce: true
|
|
auto_connect: true
|
|
accept_connections: true
|
|
```
|
|
|
|
### 3. Bluetooth Transport
|
|
|
|
If using BLE for local mesh discovery, the FIPS binary must be built with
|
|
the `ble` feature (enabled by default). BlueZ must be installed and running:
|
|
|
|
```bash
|
|
sudo apt install bluez
|
|
sudo systemctl enable --now bluetooth
|
|
```
|
|
|
|
Add your service user to the `bluetooth` group, or run with
|
|
`CAP_NET_ADMIN` + `CAP_NET_RAW` capabilities.
|
|
|
|
Configure BLE in the transports section:
|
|
|
|
```yaml
|
|
transports:
|
|
ble:
|
|
adapter: "hci0"
|
|
advertise: true
|
|
scan: true
|
|
auto_connect: true
|
|
accept_connections: true
|
|
```
|
|
|
|
### 4. Static Peers
|
|
|
|
For bootstrapping over UDP or TCP, add known peers:
|
|
|
|
```yaml
|
|
peers:
|
|
- npub: "npub1..."
|
|
alias: "gateway"
|
|
addresses:
|
|
- transport: udp
|
|
addr: "test-us01.fips.network:2121" # IP or hostname (e.g., "peer.example.com:2121")
|
|
connect_policy: auto_connect
|
|
```
|
|
|
|
### 5. DNS Resolver
|
|
|
|
FIPS includes a DNS responder for `.fips` domain names that listens on
|
|
`fips0` and on `[::1]:5354`. The `fips-dns.service` helper detects the
|
|
host's DNS routing system and configures it to forward `.fips` queries
|
|
to the responder. Backends tried in order:
|
|
|
|
1. systemd `dns-delegate` drop-in (systemd >= 258, declarative)
|
|
2. `systemd-resolved` global drop-in via `/etc/systemd/resolved.conf.d/`
|
|
3. `systemd-resolved` per-link `resolvectl` (legacy fallback)
|
|
4. `dnsmasq` (standalone, drops a config in `/etc/dnsmasq.d/`)
|
|
5. NetworkManager with the `dnsmasq` plugin
|
|
|
|
If none of the supported backends is detected, `fips-dns-setup` logs a
|
|
warning with manual instructions and exits cleanly. The daemon itself
|
|
keeps working; only the host's `.fips` resolution is left unwired.
|
|
|
|
The installer enables `fips-dns.service` automatically. To disable
|
|
or re-enable later:
|
|
|
|
```bash
|
|
sudo systemctl disable --now fips-dns.service # disable
|
|
sudo systemctl enable --now fips-dns.service # re-enable
|
|
```
|
|
|
|
### 6. Mesh-interface firewall baseline (optional)
|
|
|
|
`fips.nft` is a default-deny baseline for inbound traffic on the
|
|
`fips0` mesh interface. It is shipped as `/etc/fips/fips.nft` (not
|
|
loaded by default) along with a disabled `fips-firewall.service`
|
|
unit. Enable it explicitly:
|
|
|
|
```bash
|
|
sudo systemctl enable --now fips-firewall.service
|
|
```
|
|
|
|
The baseline polices only `fips0`, leaving Docker, Tor, the host
|
|
firewall, and other interfaces untouched. Outbound from `fips0` is
|
|
unrestricted; inbound is dropped except for replies to outbound
|
|
flows, ICMPv6 echo-request, and any operator drop-ins under
|
|
`/etc/fips/fips.d/*.nft`. Read the comments at the top of
|
|
`/etc/fips/fips.nft` for the full policy and how to add per-service
|
|
allow rules.
|
|
|
|
### 7. Outbound LAN gateway (optional)
|
|
|
|
`fips-gateway` bridges unmodified LAN hosts to `.fips` destinations
|
|
through a DNS-allocated virtual IPv6 pool and kernel nftables NAT.
|
|
The binary is installed at `/usr/local/bin/fips-gateway` and a
|
|
`fips-gateway.service` unit ships disabled by default.
|
|
|
|
To enable it, configure the gateway block in `/etc/fips/fips.yaml`,
|
|
then:
|
|
|
|
```bash
|
|
sudo systemctl enable --now fips-gateway.service
|
|
```
|
|
|
|
The unit `Requires=fips.service`, waits up to 30 seconds for `fips0`
|
|
to come up, and runs `fips-gateway --config /etc/fips/fips.yaml`.
|
|
Inbound port-forward rules can be added in the same `gateway:`
|
|
block.
|
|
|
|
## Firewall Ports
|
|
|
|
| Port | Protocol | Purpose |
|
|
|------|----------|---------|
|
|
| 2121 | UDP | Peer-to-peer mesh traffic |
|
|
| 8443 | TCP | Inbound peer connections |
|
|
|
|
## Service Management
|
|
|
|
The install ships four units. `fips.service` and `fips-dns.service`
|
|
are enabled at install time. `fips-gateway.service` and
|
|
`fips-firewall.service` are installed but disabled until the
|
|
operator opts in.
|
|
|
|
```bash
|
|
# Daemon
|
|
sudo systemctl start fips
|
|
sudo systemctl stop fips
|
|
sudo systemctl restart fips
|
|
|
|
# DNS routing helper
|
|
sudo systemctl restart fips-dns
|
|
|
|
# Optional services (opt-in)
|
|
sudo systemctl enable --now fips-firewall # mesh-interface nftables baseline
|
|
sudo systemctl enable --now fips-gateway # outbound LAN gateway
|
|
|
|
# View logs (any of the units above)
|
|
sudo journalctl -u fips -f
|
|
sudo journalctl -u fips-gateway -f
|
|
sudo journalctl -u fips-firewall -f
|
|
|
|
# Switch to debug logging
|
|
sudo systemctl set-environment RUST_LOG=debug
|
|
sudo systemctl restart fips
|
|
```
|
|
|
|
## Monitoring
|
|
|
|
```bash
|
|
# Quick status
|
|
fipsctl show status
|
|
|
|
# Interactive dashboard
|
|
fipstop
|
|
|
|
# Other queries
|
|
fipsctl show peers
|
|
fipsctl show links
|
|
fipsctl show sessions
|
|
fipsctl show routing
|
|
fipsctl show transports
|
|
```
|
|
|
|
## Non-Root Access to fipsctl/fipstop
|
|
|
|
Add your user to the `fips` group:
|
|
|
|
```bash
|
|
sudo usermod -aG fips $USER
|
|
```
|
|
|
|
Log out and back in for the group change to take effect.
|
|
|
|
## Uninstall
|
|
|
|
```bash
|
|
# Remove binaries and service, keep configuration
|
|
sudo ./uninstall.sh
|
|
|
|
# Remove everything including /etc/fips/ and the fips group
|
|
sudo ./uninstall.sh --purge
|
|
```
|