Skip to content

Tunnel configuration

Each enabled tunnel gets an isolated namespace. Provider files are loaded from source, described under Subscriptions; routes, DNS, and probes are separate policy fields.

tunnels[].id

Type
string
Required
Yes
Default
None
Validation
Unique, at most 12 characters, lowercase alphanumeric with internal hyphens; direct is reserved.
Secret classification
No; identifier metadata.
Side effects
Names namespaces, interfaces, transient units, nftables sets, and state files.
Minimal example
edge-wg

tunnels[].type

Type
enum
Required
Yes
Default
None
Validation
One of wireguard, amneziawg, xray, or openvpn.
Secret classification
No.
Side effects
Selects the provider parser, interface, and egress driver.
Minimal example
wireguard

tunnels[].role

Type
enum
Required
Yes
Default
None
Validation
One of egress or private-network.
Secret classification
No.
Side effects
Egress is selected per device; private-network is selected by route or private DNS answer.
Minimal example
egress

tunnels[].enabled

Type
nullable boolean
Required
No
Default
true when absent
Validation
Cannot be false while an enrolled device selects this tunnel as egress.
Secret classification
No.
Side effects
A disabled tunnel is omitted from desired state and removed instead of being built idle.
Minimal example
enabled: false

tunnels[].allowed_devices[]

Type
array of device IDs
Required
No
Default
Empty, meaning all enrolled devices
Validation
Every ID must name an existing device.
Secret classification
No; access-policy metadata.
Side effects
Limits default egress, private-network access, and the tunnel's SOCKS endpoint.
Minimal example
allowed_devices: [laptop]
tunnels:
- id: edge-wg
type: wireguard
role: egress
source:
kind: config
value: secrets/edge-wg.conf
allowed_devices: [laptop]

Move assigned devices before disabling an egress; validation refuses silent failover.

Next: choose WireGuard, AmneziaWG, Xray/VLESS, or OpenVPN.