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/dhcp4 writes /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:

diagd output

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

metrics in grafana


© 2018 Michael Stapelberg and contributors