mirror of
https://github.com/jmcorgan/fips.git
synced 2026-10-05 19:18:25 +00:00
Move the staged changelog entries under a 0.5.2 heading dated 2026-09-28 and leave an empty Unreleased section above it. The date is provisional: a comment beside the heading says so, and the two release-notes files carry the same date with the same marker, so the check at the version bump finds all three. Add the release notes and mirror them byte for byte to RELEASE-NOTES.md. Every link is absolute so the Release body resolves them, and each paragraph and list item is on one line, because the Release page shows every newline inside a paragraph as a line break; the file exempts itself from the line-length lint rule. The notes lead with who should upgrade and with the three defaults that changed: the gateway's DNS port, the Windows config directory, and an ephemeral node no longer writing its key file. They say what was measured and what was not, including the mixed-version interop run against v0.5.1 and v0.5.0, the Windows installer checks on Windows Server under Windows PowerShell 5.1 and PowerShell 7, and the checks still outstanding. They state that a link to a v0.5.0 or v0.5.1 node can still drop after a lost rekey reply until that node is upgraded, since the fix is on the answering side. The Windows upgrade notes say to stop the service before every run of the installer, and to move fips.yaml and fips.key from \etc\fips into C:\ProgramData\fips before upgrading a service that was set up by hand to read its config from \etc\fips, which otherwise comes up under a new identity with no warning. The README's status badge, release-notes link and status paragraph follow the release. Correct documentation that no longer matches the gateway, tree, Windows and packaging behavior: - The gateway design document, how-to, OpenWrt tutorial and the configuration reference describe the NAT rebuild as one transaction, the 1000-mapping ceiling and the new-name rate limit in place of the pool size as a hard cap, and which DNS queries allocate a mapping. - The spanning-tree documents describe the periodic re-broadcast and the resend of an unconfirmed announce, and the bloom filter update triggers include a parent switch and a child joining or leaving. - The fips, fipsctl and security references cover the restricted C:\ProgramData\fips on Windows, the ACL and key paths on macOS, FreeBSD and Windows, the legacy peer ACL fallback in \etc\fips, and the Debian fips.yaml's actual mode and conffile status. - The packaging guides no longer list MIPS as supported, the arm64 .deb leg is described as also purging the package, and the OpenWrt SDK-feed README says a package built from its Makefile carries none of the released packages' maintainer scripts. - The testing README gains a section for the OpenWrt maintainer-script suite and says the ACL allowlist suite runs by hand only, and the interop README lists the mesh-size check as its eighth phase. The upgrade notes were then corrected where following them as written would have left a node worse off: - Gateway DNS port: a fips.yaml that sets gateway.dns.listen keeps its port through the upgrade, and the v0.5.1 example config and deployment guide set it to [::1]:5353, so the resolver instruction depends on whether the config sets it. - OpenWrt: an operator who had the gateway disabled must stop it and then disable it after the first opkg upgrade. - FreeBSD: an upgrade step that restarts fips and fips_dns; the command comes from pkg's source and is listed as not measured. - Debian: the upgrade re-enables and starts fips-dns every time; `systemctl mask fips-dns` keeps it off. The .deb start bound is 90 seconds for fips-gateway. - Arch and the systemd tarball: what to restart or start after the upgrade, and that only a .deb upgrade reloads the firewall. - Ephemeral nodes: set persistent before upgrading to keep a key. - Windows: one ordered sequence in an elevated PowerShell, with the installer run under -ExecutionPolicy Bypass. - Building from source on glibc Linux also needs libdbus-1-dev and pkg-config. README, getting-started and the packaging README install the .deb with apt install ./ and point to the packaging README for per-format install commands. The notes record an OpenWrt 24 router test of the gateway DNS port, and that a gateway that fails to start leaves dnsmasq forwarding .fips to its port, with how to hand .fips back to the daemon. Drop the test-us03-next alias from the shipped hosts file and from the roster in the host-aliases how-to.
325 lines
11 KiB
Markdown
325 lines
11 KiB
Markdown
# FIPS Packaging
|
|
|
|
This directory contains packaging for all supported target platforms.
|
|
Most build outputs go to `deploy/` at the project root; `make ipk`
|
|
and `make apk` write to `dist/` instead.
|
|
|
|
## Quick Start
|
|
|
|
```sh
|
|
make deb # Debian/Ubuntu .deb (built in the pinned container)
|
|
make tarball # systemd install tarball
|
|
make ipk # OpenWrt .ipk (opkg, OpenWrt 24.x and earlier)
|
|
make apk # OpenWrt .apk (apk-tools, mandatory on OpenWrt 25+)
|
|
make aur # Arch Linux AUR package (fips-git, local build + namcap)
|
|
make pkg # macOS .pkg installer
|
|
make freebsd # FreeBSD .pkg package (on FreeBSD; use gmake)
|
|
make zip # Windows .zip package
|
|
make all # deb + tarball (default)
|
|
```
|
|
|
|
## The two Debian build paths
|
|
|
|
`make deb` builds in a container pinned to the oldest supported
|
|
distribution, named with the glibc floor in
|
|
[build-floor.env](build-floor.env), and checks the package it produced
|
|
against that floor before handing it back. Its only host prerequisite is
|
|
docker: the toolchain and the build dependencies live in the image. This
|
|
is the path the release workflow, the integration suite and the internal
|
|
builder all take, so a package that passes locally is built the way the
|
|
shipped one is.
|
|
|
|
`make deb-host` is the old path. It builds on the host, at whatever glibc
|
|
the host has, and it is checked against nothing. Use it for local
|
|
iteration only. A package built on a current distribution records a
|
|
version dependency that the loader refuses on Debian 12 and Ubuntu 22.04,
|
|
which is what shipped in every Linux artifact from v0.3.0 through v0.5.0,
|
|
so it must not produce anything anyone else installs.
|
|
|
|
## Build Prerequisites
|
|
|
|
The prerequisites below apply to the host-build targets. `make deb` needs
|
|
docker and nothing else.
|
|
|
|
These targets build FIPS from source, so the host needs a build
|
|
environment in addition to a Rust toolchain (the version pinned in
|
|
`rust-toolchain.toml` is auto-installed by rustup).
|
|
|
|
On Linux, `libclang` is **required**: the LAN gateway's nftables
|
|
bindings are generated by `bindgen` at build time, which needs
|
|
`libclang.so` on the build host. Without it the build fails inside the
|
|
`rustables` crate with an "Unable to find libclang" error.
|
|
|
|
```sh
|
|
sudo apt install libclang-dev # Debian / Ubuntu
|
|
```
|
|
|
|
This is a build-time prerequisite only — it is not a runtime
|
|
dependency, so hosts installing a pre-built `.deb` do not need it.
|
|
|
|
BLE is not optional, and it is not universal either. `build.rs` sets
|
|
`ble_available` for glibc Linux or Android, which is the set of
|
|
platforms with a concrete backend: the transport is absent from musl
|
|
Linux, macOS, FreeBSD and Windows builds entirely. On glibc Linux
|
|
`libdbus-1-dev` and `pkg-config` are hard build prerequisites: there is
|
|
no probe that skips BLE when they are missing. The BlueZ daemon is a
|
|
runtime dependency and is not needed to build.
|
|
|
|
## Directory Structure
|
|
|
|
```text
|
|
packaging/
|
|
aur/ Arch Linux AUR packaging (PKGBUILD, supporting files)
|
|
common/ Shared assets (default config, hosts file)
|
|
debian/ Debian/Ubuntu .deb packaging via cargo-deb
|
|
freebsd/ FreeBSD .pkg packaging via pkg-create(8)
|
|
macos/ macOS .pkg installer via pkgbuild
|
|
nixos/ NixOS flake module (services.fips.*)
|
|
systemd/ Generic Linux systemd tarball packaging
|
|
openwrt-ipk/ OpenWrt .ipk packaging via cargo-zigbuild (opkg)
|
|
openwrt-apk/ OpenWrt .apk packaging via cargo-zigbuild + apk mkpkg
|
|
windows/ Windows .zip package with service scripts
|
|
```
|
|
|
|
## Formats
|
|
|
|
### Debian/Ubuntu (`.deb`)
|
|
|
|
Built with [cargo-deb](https://github.com/kornelski/cargo-deb). Installs
|
|
`fips`, `fipsctl`, `fipstop`, and `fips-gateway` to `/usr/bin/`, ships
|
|
the `fips`, `fips-dns`, `fips-firewall`, and `fips-gateway` systemd
|
|
units, and enables the `fips` and `fips-dns` services.
|
|
|
|
The default configuration ships as an example at
|
|
`/usr/share/fips/fips.yaml.example` and is **not** a dpkg conf-file.
|
|
(It is deliberately **not** under `/usr/share/doc`, which minimal and
|
|
container installs path-exclude, since the postinst reads it at install
|
|
time.)
|
|
On install, `postinst` seeds `/etc/fips/fips.yaml` (mode 600) from the
|
|
example **only if it does not already exist**, so a configuration that
|
|
was rendered by configuration management or edited by an operator is
|
|
never prompted for or clobbered on upgrade. To reset to defaults, remove
|
|
`/etc/fips/fips.yaml` and reinstall, or copy the example back manually.
|
|
|
|
```sh
|
|
# Build
|
|
make deb
|
|
|
|
# Install
|
|
sudo apt install ./deploy/fips_<version>_<arch>.deb
|
|
|
|
# Remove (preserves config and keys)
|
|
sudo dpkg -r fips
|
|
|
|
# Purge (removes config and identity keys)
|
|
sudo dpkg -P fips
|
|
```
|
|
|
|
### systemd Tarball
|
|
|
|
A self-contained tarball with binaries and an `install.sh` script for
|
|
any systemd-based Linux distribution.
|
|
|
|
```sh
|
|
# Build
|
|
make tarball
|
|
|
|
# Install (on target host)
|
|
tar -xzf deploy/fips-<version>-linux-<arch>.tar.gz
|
|
sudo ./fips-<version>-linux-<arch>/install.sh
|
|
```
|
|
|
|
See [systemd/README.install.md](systemd/README.install.md) for full
|
|
installation and configuration instructions.
|
|
|
|
### OpenWrt (`.ipk`, opkg — OpenWrt 24.x and earlier)
|
|
|
|
Cross-compiled with cargo-zigbuild and assembled as a standard `.ipk`
|
|
archive. The build script accepts aarch64, mipsel, mips, arm and
|
|
x86\_64; releases publish aarch64 and x86\_64. The MIPS targets are
|
|
not built: 32-bit MIPS has no 64-bit atomics, which fips and
|
|
`nostr-relay-pool` both use (see the comment in
|
|
`.github/workflows/package-openwrt.yml`).
|
|
|
|
```sh
|
|
# Build (default: aarch64)
|
|
make ipk
|
|
|
|
# Build for a specific architecture
|
|
bash packaging/openwrt-ipk/build-ipk.sh --arch x86_64
|
|
```
|
|
|
|
See [openwrt-ipk/README.md](openwrt-ipk/README.md) for router-specific
|
|
installation instructions.
|
|
|
|
### OpenWrt (`.apk`, apk-tools — mandatory on OpenWrt 25+)
|
|
|
|
OpenWrt 25 makes apk-tools the mandatory package manager (it is opt-in on
|
|
24.10). Same SDK-free approach
|
|
(cargo-zigbuild), but the `.apk` container is assembled by `apk mkpkg`
|
|
rather than hand-rolled, so the build additionally needs an apk-tools v3
|
|
`apk` binary built from source. The installed-filesystem payload is shared
|
|
with the `.ipk` package.
|
|
|
|
```sh
|
|
# Build (default: aarch64; also x86_64)
|
|
make apk
|
|
|
|
# Build for a specific architecture
|
|
bash packaging/openwrt-apk/build-apk.sh --arch x86_64
|
|
```
|
|
|
|
Packages are unsigned; install with `apk add --allow-untrusted`. See
|
|
[openwrt-apk/README.md](openwrt-apk/README.md) for building apk-tools and
|
|
router-specific installation.
|
|
|
|
### macOS (`.pkg`)
|
|
|
|
Built with `pkgbuild` (included with Xcode command-line tools). Installs
|
|
binaries to `/usr/local/bin/`, config to `/usr/local/etc/fips/`, sets up
|
|
the `/etc/resolver/fips` DNS resolver for `.fips` domains, and loads a
|
|
launchd daemon. The TUN device is named `utun<N>` (kernel-assigned)
|
|
rather than `fips0`.
|
|
|
|
```sh
|
|
# Build
|
|
make pkg
|
|
|
|
# Install
|
|
sudo installer -pkg deploy/fips-<version>-macos-<arch>.pkg -target /
|
|
|
|
# Remove
|
|
sudo packaging/macos/uninstall.sh
|
|
```
|
|
|
|
### FreeBSD (`.pkg`)
|
|
|
|
Built natively on a FreeBSD host with `pkg create`. Ships `fips`,
|
|
`fipsctl`, and `fipstop` (`fips-gateway` is excluded — its NAT backend
|
|
is nftables, Linux-only), rc.d services, and `.fips` DNS integration
|
|
for `local_unbound`, `unbound`, or `dnsmasq`. Config installs
|
|
sample-style under `/usr/local/etc/fips/` (edits survive upgrades).
|
|
|
|
```sh
|
|
# Build (on FreeBSD; this Makefile needs GNU make — pkg install gmake)
|
|
gmake freebsd
|
|
# or directly, no gmake needed:
|
|
./packaging/freebsd/build-pkg.sh
|
|
|
|
# Install
|
|
pkg add ./deploy/fips-<version>-freebsd-<arch>.pkg
|
|
sysrc fips_enable=YES fips_dns_enable=YES
|
|
service fips start
|
|
service fips_dns start
|
|
```
|
|
|
|
See [freebsd/README.md](freebsd/README.md) for host resolver setup and
|
|
field-tested caveats.
|
|
|
|
### Windows (`.zip`)
|
|
|
|
A ZIP archive containing binaries, default config, and PowerShell
|
|
service helper scripts. Requires the [wintun](https://www.wintun.net/)
|
|
driver for TUN support.
|
|
|
|
```powershell
|
|
# Build
|
|
make zip
|
|
|
|
# Or directly
|
|
powershell -File packaging/windows/build-zip.ps1
|
|
|
|
# Extract and install as service (requires Administrator)
|
|
Expand-Archive deploy\fips-<version>-windows-x86_64.zip -DestinationPath fips
|
|
cd fips
|
|
powershell -ExecutionPolicy Bypass -File install-service.ps1
|
|
|
|
# Uninstall (preserves config)
|
|
powershell -ExecutionPolicy Bypass -File uninstall-service.ps1
|
|
|
|
# Uninstall and remove config
|
|
powershell -ExecutionPolicy Bypass -File uninstall-service.ps1 -RemoveAll
|
|
```
|
|
|
|
### Arch Linux (AUR)
|
|
|
|
Two AUR packages are maintained: `fips` (release, builds from tagged
|
|
tarball) and `fips-git` (development, builds from latest git master).
|
|
|
|
```sh
|
|
# Build and validate locally (git variant)
|
|
make aur
|
|
|
|
# Install from AUR
|
|
yay -S fips-git # development build from master
|
|
yay -S fips # release build from latest tag
|
|
```
|
|
|
|
See [aur/README.md](aur/README.md) for AUR publication instructions
|
|
and maintainer guide.
|
|
|
|
### Nix / NixOS (flake)
|
|
|
|
A [flake](../flake.nix) at the project root builds all four binaries
|
|
(`fips`, `fipsctl`, `fips-gateway`, `fipstop`) from source. It pins the
|
|
exact toolchain from `rust-toolchain.toml` via
|
|
[fenix](https://github.com/nix-community/fenix) and wires up the
|
|
build-time native dependencies (`libclang` for `bindgen`, plus `dbus`
|
|
and `pkg-config` for BLE), so it needs no system setup beyond Nix with
|
|
flakes enabled.
|
|
|
|
```sh
|
|
nix build .#fips # build the package (all four binaries)
|
|
nix run .#fips -- --help # run a binary directly
|
|
nix run .#fipsctl -- show status
|
|
nix develop # dev shell with the pinned toolchain + cargo-edit
|
|
nix flake check # build + validate the flake
|
|
```
|
|
|
|
The flake also exposes:
|
|
|
|
- `overlays.default` — adds `pkgs.fips` to nixpkgs
|
|
- `nixosModules.default` — a NixOS module (`packaging/nixos/`) that provides
|
|
`services.fips.enable` and runs the daemon as a systemd service
|
|
|
|
**As a package only** (no service management):
|
|
|
|
```nix
|
|
environment.systemPackages = [ fips.packages.${system}.default ];
|
|
```
|
|
|
|
**As a managed NixOS service** (recommended — starts on boot, journalctl logs):
|
|
|
|
```nix
|
|
# flake.nix
|
|
{
|
|
inputs.fips = {
|
|
url = "github:jmcorgan/fips";
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
};
|
|
|
|
outputs = { self, nixpkgs, fips, ... }@inputs: {
|
|
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
|
|
system = "x86_64-linux";
|
|
specialArgs = { inherit inputs; };
|
|
modules = [
|
|
./configuration.nix
|
|
fips.nixosModules.default
|
|
{ services.fips.enable = true; }
|
|
];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
See [`packaging/nixos/README.md`](nixos/README.md) for the full option
|
|
reference (`services.fips.enable`, `.package`, `.configFile`,
|
|
`.openFirewall`).
|
|
|
|
## Shared Assets
|
|
|
|
`common/` contains assets used across packaging formats:
|
|
|
|
- `fips.yaml` — default configuration (ephemeral identity, UDP/TCP/TUN/DNS)
|
|
- `hosts` — static hostname-to-npub mappings for `.fips` DNS resolution
|