🖧 The Promised LAN
The Promised LAN is a closed, membership only network of friends that operate a 24/7 always-on LAN party, running since 2021. The vast majority of documentation is maintained on the LAN, but this website serves to give interested folks, prospective members or friends an idea of what the Promised LAN is, and how it works.
A Manifesto for The Promised LAN
For background on why we started the lan, what we hope to achieve, and how we approach the social-technical dynamics, we have posted a Manifesto to encourage more similarly structured LANs. It is worth reading this before moving on. The social and technical aspects are intertwined here.
Backbone Network
Each Promised LAN segment connects to the Backbone network, since each LAN connecting to every other LAN quickly becomes unmaintainable, even with a small number of segments -- individual dynamic IPs change, keying material exchanges, negotiating a cipher suite; it gets hard! As a result, we have all LANs connect to the closest backbone node, and traffic is routed through the backbone network.
The network is made up of independently operated and heterogeneous nodes
(currently three nodes, a mix of Debian using strongSwan
and
OpenBSD using iked
), which peer over IPSec links. We've decided on
a set of common algorithms which appear to be the best tradeoff of speed,
security and support for our existing backbone nodes.
Algorithms | |
---|---|
IKE SA Auth | HMAC SHA2 512 |
IKE SA Encryption | AES 256 |
IKE SA DH | Curve25519 |
Child SA Encryption | ChaCha20 Poly1305 |
Child SA DH | Curve25519 |
The Backbone network operates in a dedicated /24 allocation, where individual
backbones are issued an IP based on its "Node ID". Each backbone is only
hardcoded with the routes for each directly connected backbone via its IPSec
connection. This network of nodes operates as The Promised LAN's
Default Free Zone (DFZ).
Once the IP links are established, backbones communicate using BGP (currently
bird on Debian and bgpd
on OpenBSD) in order to advertise directly connected user LANs to the rest of
the backbone network.
DNS
We're using our own non-standard and possibly ill-advised TLD, which is
.tpl
— short for The Promised LAN. Each LAN gets a domain
automatically when it joins the LAN — and folks can request new domains
for whatever they want after joining. There are a set of root DNS servers
(ns1.tpl
, ns2.tpl
, ns3.tpl
) which are
hosted on three different LANs which are each connected to a different backbone
node, in the event of network outages. We strive to keep core services
running, even if a node is completely disconnected from all others. Each
authoritative nameserver
is running an nsd
, with a config replicated by pulling a central
git
repo on a cron.
By convention (mostly to avoid managing a bunch of
glue records),
we expect that each LAN runs their own authoritative nameserver at the fixed
IP of x.x.x.254
. This allows us to automate and template the
configurations when LANs join, at a pretty minor cost.
Since each LAN doesn't really need to know all the roots themselves (unless
they want), we run a
recursive resolver
on an
anycasted IP block (x.0.0.1),
running local on the backbones themselves. This is generally running
unbound
.
PKI
Even though everything here is already secure enough for us, deploying services
that use TLS
makes using existing/modern tools a lot easier. On
the whole PKI is way more work than it's worth here, but we decided to engineer
this properly.
We operate a set of root x509 Certificate Authorities, each with a three year lifetime. The first year allows us to distribute the roots across the LAN and let the roots update along with the cadence of routine system maintaince. The second year is that root's "operational" year, where all x509 certificates are issued by that root, and finally, the last year is the transition year to allow issued certs to expire naturally without the CA being invalid.
Currently, we issue roots using the ECDSA P-384
key type,
with SHA384
signatures. Additionally, each CA contains
X509v3 Name Constraints
(marked critical
) which
limit validity to DNS:.tpl
and email:.tpl
.
Finally, we figured we'd use our existing DNS for managing
our x509 certificate issance — so we don't have to send CSR
s
around and wait for human action. Deploying something like ACME
is overkill (for now) and a maintaince nightmare. We wrote something fairly
basic instead, since we can easily constrain our problem space and rules.
Every LAN may set DNS TXT
records named _pki
for a given domain, which contains an OpenSSH public key. Signing a new
certificate is done over SSH -- where a CSR is signed by checking the requested
SAN is against the key used to autheticate to the CA against the PKI DNS records
to make an issuance decision.