Network and Access Topology
- Type: Reference
- Status: Current
- Scope: Fleet network paths, naming, listeners, and access boundaries
- Canonical sources:
modules/networking/nebula.nix,modules/services/newt.nix, host firewall declarations, service listener options, and container network declarations- Last verified: Source commit
556df88494686003b1c4f20c8e0b99b5afc16a6e(2026-09-12)- Review triggers: Nebula address or lighthouse changes, DNS changes, listener/firewall changes, Pangolin/Newt routing changes, Docker-network changes, VPN changes, or service moves
This page describes how traffic crosses the fleet. The Service Catalogue owns individual endpoints and authentication; this page owns the route classes and their trust boundaries.
Topology at a glance
Public clients
|
| HTTPS / public DNS
v
Pangolin (external) <---- outbound Newt tunnels ---- Vega / Lyra / Chaos
| |
| `-- loopback, host,
`-- selected public routes or Docker targets
Paseo clients ---- TLS to code.nimmog.uk:443 ---- public relay route
|-- Chaos relay target
`-- Vega fallback relay
|
`-- registered daemons
public VPS
Nebula lighthouse + relay
|
encrypted 10.10.0.0/16 overlay
+----------+------+--------+----------+
| | | |
laptops Vega resolver/ Lyra Cosmos/Chaos
IPv4 exit node
|
`-- NAS and other mesh members
Pangolin, the public VPS, public DNS, the NAS, and Proxmox are external dependencies. This repository configures the fleet side of their relationships but cannot prove the external side from Nix evaluation alone.
Nebula mesh
All registered hosts join the mesh Nebula network. The repository also
reserves names for external or staged members.
| Name | Overlay address | Repository status or role |
|---|---|---|
pangolin-vps |
10.10.0.1 |
External public lighthouse and relay |
vega |
10.10.0.2 |
Managed client, CoreDNS resolver, IPv4 exit node |
lyra |
10.10.0.3 |
Managed GPU/media server |
nova |
10.10.0.4 |
Staged NixOS target; currently external to the managed NixOS fleet |
mass-storage |
10.10.0.5 |
External NAS dependency |
media1 |
10.10.0.6 |
Legacy external/reserved member |
nimmog-de |
10.10.0.7 |
External member |
cosmos |
10.10.0.8 |
Managed database VM |
chaos |
10.10.0.9 |
Managed container VM |
electra |
10.10.0.20 |
Managed laptop |
lena |
10.10.0.21 |
Managed laptop |
The public VPS at 10.10.0.1 is the sole configured lighthouse. Ordinary
clients bootstrap through its public UDP endpoint and use it as their relay
when direct NAT traversal fails. Vega is explicitly configured as neither a
lighthouse nor a relay; older two-lighthouse descriptions are stale. The
module retains a Vega entry in its lighthouse map for lighthouse-to-lighthouse
logic, but no current managed host enables that role.
Nebula has its own encrypted overlay firewall and the NixOS host firewall adds a second layer:
- Nebula outbound and inbound policy is presently permissive within the mesh. Tightening this with group rules remains planned work.
- Services intended only for the mesh normally bind to an overlay address and
open their port only on
nebula.meshin the NixOS firewall. - Binding to
0.0.0.0and usingnetworking.firewall.allowedTCPPortsis a broader exposure class: it permits the port on physical/LAN interfaces too. - A listener on loopback or a private Docker bridge is not reachable merely because the mesh firewall is permissive.
Host Nebula private keys are delivered from host-scoped SOPS files. The CA and host certificates are repository inputs; key material is not stored in the wiki.
Mesh naming and DNS
NixOS mesh members receive static /etc/hosts entries for both bare names and
name.mesh. This makes managed-host lookup independent of a live DNS server.
Vega additionally runs CoreDNS on 10.10.0.2:53 for non-NixOS clients and the
phone full-tunnel path. Static name.mesh zones come from the same host map.
Other .mesh queries forward to the public lighthouse's Nebula serve_dns on
port 5300; ordinary DNS forwards to public recursive resolvers. Port 53 is
opened only on Vega's nebula.mesh interface.
Public application names such as wiki.nimmog.uk and code.nimmog.uk are a
separate DNS and ingress plane. The repository records the names applications
expect, but public DNS records and Pangolin route definitions live outside it.
Public ingress through Pangolin and Newt
Vega, Lyra, and Chaos run native Newt clients. Each makes an outbound connection
to https://pangolin.nimmog.uk using a host-scoped SOPS environment. Public
HTTPS terminates in the external Pangolin plane and is forwarded through the
corresponding tunnel to a configured upstream.
The upstream can have one of three shapes:
| Target class | Example | Consequence |
|---|---|---|
| Host loopback | BookStack 127.0.0.1:80, Paperless 127.0.0.1:28981 |
Service is reachable locally and through its tunnel, not directly from LAN or mesh |
| Dedicated Docker bridge gateway | FreshRSS on Vega's newt_default gateway 172.18.0.1:8082 |
Newt's container network can reach the host without a LAN-wide listener |
| Container name/private network | Vega's fallback Paseo relay on newt_default |
Traffic stays inside the selected Docker network |
The repository declares the Newt clients and many expected application URLs, but the Pangolin-side target list is external state. A working NixOS service therefore does not by itself prove that its public route is correct.
Lyra's retained SWAG boundary
Lyra still has a mutable Docker/SWAG estate under /srv/stacks. Native Jellyfin
and Immich deliberately expose host ports so that the retained proxy can reach
them through the Docker host gateway. Other firewall entries on Lyra support
retained containers and local services.
The Nix repository can verify host listeners, firewall openings, mounts, and native services. It cannot fully inventory SWAG routes or container-network membership because their definitions are not stored here. Treat claims about a specific public SWAG route as requiring inspection of the live stack.
Docker network boundaries
- Vega's
newt_defaultbridge uses host gateway172.18.0.1for selected Newt-to-host traffic. A separate172.22.0.0/16Whisparr bridge may reach Vega PostgreSQL at gateway172.22.0.1. - Chaos assigns Docker networks from
172.30.0.0/16in/24blocks to avoid overlap with the Nebula10.10.0.0/16range. - Chaos's
slskd-netis a private application network. SynthSeek reaches slskd and Plexdrome by container alias; Plexdrome publishes no host port. - Docker group membership is treated as root-equivalent access and is an accepted convenience on these personal machines.
Docker networking is not a security boundary against a user with Docker daemon access. Service isolation still depends on listener choices, host firewall rules, application authentication, and the external ingress policy.
Administrative and client access
| Path | Scope |
|---|---|
| SSH on Electra and Lena | Port 22 opened only on nebula.mesh; password and root login disabled |
| SSH and Mosh on server hosts | Enabled by the server profile with host-wide firewall openings; SSH password and root login disabled |
| Laptop WireGuard profile | Electra and Lena have a manually activated NetworkManager full-tunnel profile; this is independent of Nebula |
| Vega exit node | Provides IPv4 NAT for Nebula unsafe-route clients through enp86s0; IPv6 forwarding is deliberately disabled |
| Service administration | Prefer the narrowest applicable path: local socket/loopback, then Nebula, then authenticated public ingress |
Declared exposure findings
These are configuration facts to feed the later Security Baseline, not claims of active compromise:
- The Nebula overlay policy currently accepts any inbound mesh traffic; NixOS interface firewall rules provide the service-by-service restriction.
- Engram Cloud, Lyra's Ollama and Wyoming services, and several retained media service ports use all-interface listeners or global firewall openings.
- Paseo daemons currently bind their hosts' Nebula addresses and open port
6767onnebula.mesh; their TLS relay registration is a separate path. - Server-profile SSH and Mosh openings are host-wide, whereas laptop SSH is mesh-only.
- Pangolin routes and Lyra's SWAG definitions are operational dependencies not reviewable from this repository.
The Storage and Data Map documents how local, NAS, database, and backup traffic relate. Operational changes belong in Operations and Runbooks, and accepted trust-boundary choices are recorded in ADR-003. Return to the System Atlas.