openme vs fwknop
openme vs fwknop, fwknop alternative, single packet authentication comparison, SPA tool comparison, fwknop modern crypto, openme fwknop difference, SPA Linux firewall
openme and fwknop are both Single Packet Authentication (SPA) systems — they keep all ports hidden and temporarily open them after a valid cryptographic knock. This page explains the key differences to help you decide which tool fits your needs.
Cryptography
What crypto does each tool use?
fwknop offers two modes: - GnuPG — asymmetric encryption using RSA or DSA keys managed by your GPG keyring. - Pre-shared key (HMAC + Rijndael/AES) — symmetric encryption with a manually distributed secret.
openme uses a single, fixed, modern crypto stack:
| Step | Algorithm |
|---|---|
| Key agreement | X25519 (Curve25519) ECDH — ephemeral per knock |
| Key derivation | HKDF-SHA-256 with context string openme-v1-chacha20poly1305 |
| Encryption + authentication | ChaCha20-Poly1305 (RFC 8439) |
| Identity / replay protection | Ed25519 signature over the signed portion |
Every knock uses a fresh ephemeral key, so there is no long-term symmetric secret to manage or rotate.
Why Ed25519 signing on top of authenticated encryption?
ChaCha20-Poly1305 already provides authentication, but only to someone who knows the shared AEAD key. Ed25519 signs the packet with the client’s long-term identity key which is independent of the per-knock ECDH session. This means the server can verify which registered client sent the knock before even attempting decryption, and it binds authentication to a stable identity even when the ephemeral key material changes every knock.
Architecture & Dependencies
What does fwknop require to run?
On the server side fwknop requires:
fwknopddaemon- libpcap to sniff incoming UDP packets (since it works below the socket layer to avoid the kernel rejecting packets to closed ports)
- Separate config files:
/etc/fwknop/fwknop.confand/etc/fwknop/access.conf - Optional: a running GnuPG agent for GPG key mode
On the client side it requires the fwknop CLI binary, which has a C build toolchain dependency.
What does openme require?
- A single statically-linked Go binary — no shared libraries, no libpcap, no GPG.
- Kernel
CAP_NET_ADMINcapability (or root) on the server for firewall rule management. - nftables (≥ 0.9) or iptables on the server.
Why does openme not use libpcap?
openme uses a standard UDP socket bound to a specific port. The server port is reachable directly; the kernel delivers the packet to the process. libpcap works at a lower level to capture traffic before the kernel drops it — useful if you want the UDP port to appear truly closed even to the OS, but it adds a C library dependency and requires elevated privileges for capture.
Platform Support & Mobile
Which platforms does fwknop support?
fwknop has clients for Linux, macOS, and Windows. There are no official iOS or Android apps.
Which platforms does openme support?
| Platform | Status |
|---|---|
| Linux (server + CLI) | ✅ — primary platform |
| macOS (CLI + menu-bar app) | ✅ |
| Windows (CLI + system-tray app) | ✅ |
| iOS (SwiftUI app) | ✅ |
| Android (Kotlin app) | ✅ |
| watchOS companion | ✅ |
The iOS, macOS, Android, and watchOS apps share the same OpenMeKit Swift package and the Android openmekit library respectively, both implementing the identical 165-byte packet format.
QR Code Provisioning
Can I configure clients with a QR code?
openme has built-in QR provisioning: the server or an existing client can generate a QR code containing the connection profile (server address, public key, port). The mobile apps scan this QR code to add a new client profile in seconds.
fwknop does not have built-in QR provisioning — keys must be distributed manually.
Packet Format
Are the packet formats interoperable?
No — openme and fwknop use different packet formats. openme’s format is a fixed 165 bytes; fwknop’s format varies. The server and clients must be from the same project.
Where is openme’s packet format documented?
See Packet Format.
Migration
Can I migrate from fwknop to openme?
There is no automated migration tool. The steps are:
- Generate new keys with
openme keygen. - Deploy the openme server binary and configuration on your server.
- Distribute the new connection profile to clients (via QR or YAML export).
- Remove
fwknopdfrom your server once all clients are migrated.
Summary Comparison
| Feature | openme | fwknop |
|---|---|---|
| Crypto stack | Curve25519 + ChaCha20-Poly1305 + Ed25519 | RSA/DSA (GPG) or AES + HMAC (PSK) |
| Pre-shared key mode | No | Yes |
| libpcap dependency | No | Yes (server) |
| Single static binary | Yes | No |
| iOS / Android apps | Yes | No |
| QR provisioning | Yes | No |
| macOS / Windows client | Yes | Yes |
| Packet size | Fixed 165 bytes | Variable |
| Config file count | 1 YAML | 2 (fwknop.conf + access.conf) |
| Language | Go | C |
| License | MIT | GPL v2 |