Architecture
router7 is based on gokrazy: it is an appliance which gets packed into a hard disk image, containing a FAT partition with the kernel, a read-only SquashFS partition for the root file system and an ext4 partition for permanent data.
The individual services can be found in github.com/rtr7/router7/cmd
- Each service runs in a separate process.
- Services communicate with each other by persisting state files. E.g.,
cmd/dhcp4writes/perm/dhcp4/wire/lease.json. - A service notifies other services about state changes by sending them signal
SIGUSR1.
Configuration files
| File | Consumer(s) | Purpose |
|---|---|---|
/perm/interfaces.json |
netconfigd |
Set IP/MAC addresses of uplink0 and lan0 |
/perm/portforwardings.json |
netconfigd |
Configure nftables port forwarding rules |
/perm/dhcp6/duid |
dhcp6 |
Set DHCP Unique Identifier (DUID) for obtaining static leases |
State files
| File | Producer | Consumer(s) | Purpose |
|---|---|---|---|
/perm/dhcp4/wire/ack |
dhcp4 |
dhcp4 |
last DHCPACK packet for renewals across restarts |
/perm/dhcp4/wire/lease.json |
dhcp4 |
netconfigd |
Obtained DHCPv4 lease |
/perm/dhcp6/wire/lease.json |
dhcp6 |
netconfigd, radvd |
Obtained DHCPv6 lease |
/perm/dhcp4d/leases.json |
dhcp4d |
dhcp4d, dnsd |
DHCPv4 leases handed out (including hostnames) |
Available ports
| Port | Purpose |
|---|---|
<public>:8053 |
dnsd metrics (forwarded requests) |
<public>:8066 |
netconfigd metrics (nftables counters) |
<private>:80 |
gokrazy web interface |
<private>:67 |
dhcp4d |
<private>:58 |
radvd |
<private>:53 |
dnsd |
<private>:8077 |
backupd (serve backup.tar.gz) |
<private>:7733 |
diagd (perform diagnostics) |
<private>:5022 |
captured (serve captured packets) |
Here’s an example of cmd/diagd output:

Here’s an example of cmd/netconfigd metrics when scraped with Prometheus and displayed in Grafana:

© 2018 Michael Stapelberg and contributors