VyOS Home Router — Configuration Documentation
Hostname: vyos-fw
Domain: home.lab
Timezone: Europe/Berlin
VyOS Release: 2025.11
Table of Contents
- Network Overview
- Physical Interfaces
- VLANs & Bridge Interfaces
- IP Addressing & Subnets
- DHCP Server
- DNS Forwarding
- Static Host Mappings
- Firewall — Groups
- Firewall — Zone Policy
- Firewall — Named Rules
- NAT
- VPN — IPsec Site-to-Site
- Services
- System
Network Overview
Internet
│
│ eth1 (WAN) — 192.168.178.11/24
│ GW: 192.168.178.1 (Speedport)
┌───┴─────────────────────────────────────────────────┐
│ vyos-fw │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐ │
│ │ eth0 │ │ eth2 │ │ eth3 │ │ eth4 │ │
│ │ Trunk │ │ Trunk │ │Proxmox │ │ AppleTV │ │
│ │ Switch │ │ AP │ │Internal│ │ │ │
│ └────────┘ └────────┘ └────────┘ └──────────┘ │
│ │
│ vti0 (10.255.255.2/30) — IPsec to VPS │
└─────────────────────────────────────────────────────┘
The router separates the home network into 8 security zones using VLANs and bridges, with a zone-based stateful firewall enforcing traffic policy between them. A site-to-site IPsec VPN connects to a remote VPS.
A secondary LTE uplink (Teltonika RUT240) is integrated via VLAN 99 on the eth0 trunk for automatic WAN failover — see LTE Failover (RUT240).
Physical Interfaces
| Interface | MAC | Description | Address |
|---|---|---|---|
eth0 | bc:24:11:4b:f2:93 | TRUNK to Switch | DHCP (WAN-facing trunk, carrier only) |
eth1 | bc:24:11:d1:b1:14 | WAN — Speedport | 192.168.178.11/24 |
eth2 | bc:24:11:cd:af:6b | TRUNK to AP | — (trunk only) |
eth3 | bc:24:11:6c:81:0e | Proxmox Internal | member of br10 |
eth4 | — | AppleTV | member of br40 |
lo | — | Loopback | — |
eth0 and eth2 have hardware offloads enabled: GRO, GSO, Scatter-Gather, TSO.
VLANs & Bridge Interfaces
| Zone | VLAN ID | Bridge | Members | Description |
|---|---|---|---|---|
| MGMT | 10 | br10 | eth0.10, eth2, eth3 | Management network |
| SERVERS | 20 | eth0.20 | — | Server network (no bridge) |
| HOMELAB | 30 | br30 | eth0.30, eth2.30 | Home Assistant / Homelab |
| TRUSTED | 40 | br40 | eth0.40, eth2.40, eth4 | Trusted devices + AppleTV |
| IOT | 50 | br50 | eth0.50, eth2.50 | IoT devices |
| GUEST | 60 | br60 | eth0.60, eth2.60 | Guest WiFi |
| DMZ | 70 | eth0.70 | — | Public-facing services (no bridge) |
| VPN | — | vti0 | — | IPsec tunnel to VPS |
| WAN | — | eth1 | — | Primary uplink (Speedport DSL) |
| WAN-LTE | 99 | eth0.99 | — | Failover uplink (RUT240 LTE) — see LTE Failover |
Notes:
br10,br40,br50,br60have STP enabled.eth2(untagged) is a direct member ofbr10— the AP's management interface lands on MGMT.- SERVERS and DMZ use the VLAN sub-interface directly (no bridge needed).
IP Addressing & Subnets
| Zone | IPv4 Subnet | Gateway | IPv6 Prefix | IPv6 Gateway |
|---|---|---|---|---|
| MGMT | 10.69.10.0/24 | 10.69.10.1 (br10) | — | — |
| SERVERS | 10.69.20.0/24 | 10.69.20.1 (eth0.20) | — | — |
| HOMELAB | 10.69.30.0/24 | 10.69.30.1 (br30) | fd00:69:30::/64 | fd00:69:30::1 |
| TRUSTED | 10.69.40.0/24 | 10.69.40.1 (br40) | fd00:69:40::/64 | fd00:69:40::1 |
| IOT | 10.69.50.0/24 | 10.69.50.1 (br50) | — | — |
| GUEST | 10.69.60.0/24 | 10.69.60.1 (br60) | — | — |
| DMZ | 10.69.70.0/24 | 10.69.70.1 (eth0.70) | — | — |
| VPN tunnel | 10.255.255.0/30 | — | — | — |
| VPN local end | 10.255.255.2 | — | — | — |
IPv6 Router Advertisements are sent on br40 (TRUSTED) and eth0.30 (HOMELAB).
br30 also has IPv6 autoconf enabled.
DHCP Server
All zones use domain-name home.lab. Dynamic pools are .100–.200 unless noted.
| Zone | Subnet | Range | Lease | Notes |
|---|---|---|---|---|
| MGMT | 10.69.10.0/24 | .100–.200 | 24h | 2 static mappings |
| SERVERS | 10.69.20.0/24 | .100–.200 | 24h | — |
| HOMELAB | 10.69.30.0/24 | .100–.200 | 24h | 2 static mappings |
| TRUSTED | 10.69.40.0/24 | .100–.200 | 24h | — |
| IOT | 10.69.50.0/24 | .100–.200 | 24h | — |
| GUEST | 10.69.60.0/24 | .100–.200 | 1h | Shorter lease |
| DMZ | 10.69.70.0/24 | .100–.200 | 24h | — |
Static DHCP Mappings
| Host | MAC | IP |
|---|---|---|
unifi-bridge | bc:24:11:df:17:98 | 10.69.10.15 |
unifi-U6 | d8:b3:70:d8:2b:cc | 10.69.10.16 |
HomeAssistant | d8:5e:d3:6f:cb:b7 | 10.69.30.100 |
slzb-mr3u | 82:b5:4e:57:7f:f0 | 10.69.30.50 |
brother-ads2400n | b4:22:00:22:b8:fe | 10.69.50.10 |
DNS Forwarding
- Upstream resolver:
10.69.20.53(Technitium LXC — forwards over DoT to Quad9dns.quad9.net/9.9.9.9:853+149.112.112.112:853, IPv4 only, with DNSSEC validation) - DNSSEC:
set service dns forwarding dnssec validate— the router validates and propagates thead(authenticated-data) flag to clients. Withoutvalidatethe forwarder passes traffic but stripsad; validation still happens at Technitium either way (bogus names SERVFAIL end-to-end). - Cache size: 10,000 entries (router-side; Technitium has its own cache in addition)
- Allowed clients:
10.69.0.0/16(all internal zones) - Listen addresses: All zone gateways (
.10.1,.20.1,.30.1,.40.1,.50.1,.60.1,.70.1)
Each zone's DHCP server points clients to the router's own IP as their DNS resolver. The router forwards to Technitium, which forwards encrypted to Quad9. Static host mappings (below) are resolved locally by the router before forwarding.
Router's own system name-server remains 1.1.1.1, 9.9.9.9 as a plain-DNS fallback for early-boot resolution (apt/NTP bootstrap) when the forwarder service is not yet running.
Static Host Mappings
The router resolves the following hostnames locally, overriding external DNS. Two patterns coexist:
- Shortnames → host IP — for direct SSH access (e.g.
ssh podmanfrom the laptop). Managed by Ansible from the homelab inventory; see Ansible — VyOS DNS sync. - Service FQDNs (
*.home.helix9.org) → Traefik (10.69.20.40) — internal split-horizon routing for HTTPS service URLs. Currently hand-curated; can be migrated host-by-host into Ansible via thetraefik_subdomainshost_var.
Ansible-managed shortnames (one entry per managed LXC/VM)
Generated automatically by playbooks/vyos_dns.yml from inventory/hosts.yml. Each managed host gets <inventory_hostname> → <ansible_host>.
| Group | Hosts (shortname → IP) |
|---|---|
| Proxmox | pve02 → 10.69.10.20 |
| MGMT | pbs01 → 10.69.10.25, unifi → 10.69.10.15 |
| Servers | podman → 10.69.20.10, copyparty → 10.69.20.20, traefik → 10.69.20.40, technitium → 10.69.20.53, pulse → 10.69.20.60, authentik → 10.69.20.68, paperless → 10.69.20.72, uptime-kuma → 10.69.20.75, onedev → 10.69.20.76, docusaurus → 10.69.20.77, metrics → 10.69.20.78 |
| DMZ | mumble → 10.69.70.10, minecraft → 10.69.70.20, synapse → 10.69.70.30, matrixrtc → 10.69.70.31, hookshot → 10.69.70.40, openclaw → 10.69.70.50 |
Service FQDNs → Traefik (hand-curated)
| Hostname | IP | Notes |
|---|---|---|
openclaw.helix9.org | 10.69.20.40 | via Traefik (split-horizon — external IP is 152.53.173.192) |
traefik.home.helix9.org | 10.69.20.40 | Traefik reverse proxy |
auth.home.helix9.org | 10.69.20.40 | via Traefik (Authentik) |
dns.home.helix9.org | 10.69.20.40 | via Traefik → Technitium web UI |
jellyfin.home.helix9.org | 10.69.20.40 | via Traefik |
seerr.home.helix9.org | 10.69.20.40 | via Traefik |
radarr.home.helix9.org | 10.69.20.40 | via Traefik |
sonarr.home.helix9.org | 10.69.20.40 | via Traefik |
sabnzbd.home.helix9.org | 10.69.20.40 | via Traefik |
paperless.home.helix9.org | 10.69.20.40 | via Traefik |
copyparty.home.helix9.org | 10.69.20.40 | via Traefik |
pulse.home.helix9.org | 10.69.20.40 | via Traefik |
pbs01.home.helix9.org | 10.69.20.40 | via Traefik |
pve01.home.helix9.org / pve02.home.helix9.org | 10.69.20.40 | via Traefik |
onedev.home.helix9.org | 10.69.20.40 | via Traefik |
Legacy / manual (not Ansible-managed)
| Hostname | IP | Notes |
|---|---|---|
paperless.home.lab, pulse.home.lab, technitium.home.lab, podman.home.lab, pbs01.home.lab, pve01.home.lab, pve02.home.lab, onedev.home.lab | direct host IP | Older home.lab aliases — superseded by Ansible-managed shortnames; safe to remove later |
pve01 | 10.69.10.5 | Currently commented in inventory — re-enable once added |
netbox / netbox.home.lab | 10.69.20.70 | NetBox IPAM (not in Ansible inventory) |
vyos-edge / vyos-edge.home.lab | 159.195.87.143 | VPS / remote VyOS |
Firewall — Groups
Address Groups
| Group | Address | Purpose |
|---|---|---|
NETBOX | 10.69.20.10 | NetBox IPAM scanner |
TRAEFIK | 10.69.20.40 | Traefik reverse proxy |
PULSE | 10.69.20.60 | Pulse Proxmox monitoring |
UPTIME-KUMA | 10.69.20.75 | Uptime-Kuma monitoring |
Network Groups
| Group | Networks | Purpose |
|---|---|---|
BLOCKLIST | 192.0.2.1/32 (placeholder) | Aggregated IP blocklist (auto-updated daily) |
NET-MGMT | 10.69.10.0/24 | MGMT zone |
NET-SERVERS | 10.69.20.0/24 | SERVERS zone |
NET-HOMELAB | 10.69.30.0/24 | HOMELAB zone |
NET-TRUSTED | 10.69.40.0/24 | TRUSTED zone |
NET-IOT | 10.69.50.0/24 | IOT zone |
NET-GUEST | 10.69.60.0/24 | GUEST zone |
NET-DMZ | 10.69.70.0/24 | DMZ zone |
RFC1918 | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | All private ranges |
Port Groups
| Group | Ports | Service |
|---|---|---|
SERVICES-DHCP | 67-68 | DHCP |
SERVICES-DNS | 53 | DNS |
SERVICES-MDNS | 5353 | mDNS |
SERVICES-NTP | 123 | NTP |
Firewall — Zone Policy
The firewall uses a zone-based model. Every interface belongs to exactly one zone. Traffic between zones is evaluated against the named firewall policy for that direction.
Zone Members
| Zone | Interface(s) |
|---|---|
| LOCAL | Router itself (local-zone) |
| WAN | eth1, eth0.99 |
| MGMT | br10 |
| SERVERS | eth0.20 |
| HOMELAB | br30 |
| TRUSTED | br40 |
| IOT | br50 |
| GUEST | br60 |
| DMZ | eth0.70 |
| VPN | vti0 |
Zone-to-Zone Policy Matrix
The table shows which firewall policy applies for traffic from (row) to (column). All zones have default-action drop.
| FROM \ TO | LOCAL | WAN | MGMT | SERVERS | HOMELAB | TRUSTED | IOT | GUEST | DMZ | VPN |
|---|---|---|---|---|---|---|---|---|---|---|
| LOCAL | — | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL |
| WAN | WAN-LOCAL | — | ALLOW-EST | ALLOW-EST | ALLOW-EST | ALLOW-EST | ALLOW-EST | ALLOW-EST | WAN-DMZ | — |
| MGMT | MGMT-LOCAL | ALLOW-ALL | — | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | — |
| SERVERS | SERVERS-LOCAL | ALLOW-INTERNET | — | — | ALLOW-EST | SERVERS-MGMT | ALLOW-EST | SERVERS-SCAN | SERVERS-SCAN | SERVERS-VPN |
| HOMELAB | HOMELAB-LOCAL | ALLOW-INTERNET | ALLOW-EST | ALLOW-EST | — | HOMELAB-TRUSTED | ALLOW-EST | ALLOW-EST | ALLOW-EST | — |
| TRUSTED | TRUSTED-LOCAL | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | TRUSTED-HOMELAB | — | ALLOW-ALL | ALLOW-ALL | ALLOW-ALL | — |
| IOT | IOT-LOCAL | ALLOW-INTERNET | ALLOW-EST | IOT-SERVERS | ALLOW-EST | ALLOW-EST | — | ALLOW-EST | ALLOW-EST | — |
| GUEST | GUEST-LOCAL | ALLOW-INTERNET | ALLOW-EST | GUEST-SERVERS | ALLOW-EST | ALLOW-EST | ALLOW-EST | — | ALLOW-EST | — |
| DMZ | DMZ-LOCAL | ALLOW-INTERNET | ALLOW-EST | ALLOW-EST | ALLOW-EST | ALLOW-EST | ALLOW-EST | ALLOW-EST | — | DMZ-VPN |
| VPN | VPN-LOCAL | — | — | VPN-SERVERS | — | — | — | — | VPN-DMZ | — |
ALLOW-EST = ALLOW-ESTABLISHED (only return traffic, default drop)
Firewall — Named Rules
Generic Policies
ALLOW-ALL — default accept
- Rule 10: accept established/related
- Rule 20: drop invalid
- Default: accept
ALLOW-ESTABLISHED — default drop
- Rule 10: accept established/related
- Rule 20: drop invalid
- Default: drop
ALLOW-INTERNET — default accept (with RFC1918 block)
- Rule 10: accept established/related
- Rule 20: drop invalid
- Rule 25: drop source
10.69.50.10(brother-ads2400n — no internet access) - Rule 30: drop destinations matching
RFC1918(prevents cross-zone pivot via internet policy) - Default: accept
DROP-ALL — default drop
- Rule 10: accept established/related
- Rule 20: drop invalid
- Default: drop
Zone-to-LOCAL Policies
These control what internal zones can access on the router itself.
MGMT-LOCAL — default accept
Full access. MGMT is fully trusted for router management.
TRUSTED-LOCAL — default accept
Full access. TRUSTED devices can reach all router services.
SERVERS-LOCAL — default drop
| Rule | Action | Description |
|---|---|---|
| 10 | accept | Established/related |
| 20 | drop | Invalid |
| 100 | accept | DNS (TCP/UDP 53) |
| 110 | accept | DHCP (UDP 67–68) |
| 120 | accept | NTP (UDP 123) |
HOMELAB-LOCAL — default drop
| Rule | Action | Description |
|---|---|---|
| 10 | accept | Established/related |
| 20 | drop | Invalid |
| 100 | accept | DNS |
| 110 | accept | DHCP |
| 120 | accept | NTP |
| 130 | accept | mDNS (UDP 5353) |
IOT-LOCAL — default drop
Same as SERVERS-LOCAL (DNS, DHCP, NTP only).
GUEST-LOCAL — default drop
Same as SERVERS-LOCAL (DNS, DHCP, NTP only).
DMZ-LOCAL — default drop
Same as SERVERS-LOCAL (DNS, DHCP, NTP only).
VPN-LOCAL — default drop
| Rule | Action | Description |
|---|---|---|
| 10 | accept | Established/related |
| 20 | accept | ICMP (ping) |
| 30 | accept | All traffic from VPN tunnel |
Full access from VPN — the remote VPS side is fully trusted for router access.
WAN-LOCAL — default drop
| Rule | Action | Description |
|---|---|---|
| 10 | accept | Established/related |
| 20 | drop | Invalid |
No unsolicited inbound from WAN.
Cross-Zone Specific Policies
SERVERS-MGMT — default drop
Allows Traefik (10.69.20.40) and Pulse (10.69.20.60) to access management UIs:
| Rule | Action | Source | Destination | Port | Description |
|---|---|---|---|---|---|
| 10 | accept | — | — | — | Established/related |
| 20 | drop | — | — | — | Invalid |
| 100 | accept | TRAEFIK | — | 8006/TCP | Traefik → Proxmox Web UI |
| 110 | accept | TRAEFIK | — | 443/TCP | Traefik → MGMT HTTPS |
| 120 | accept | TRAEFIK | — | 8007/TCP | Traefik → PBS Web UI |
| 130 | accept | PULSE | 10.69.10.20 | 8006/TCP | Pulse → pve02 API |
| 140 | accept | PULSE | 10.69.10.25 | 8007/TCP | Pulse → pbs01 API |
| 150 | accept | PULSE | 10.69.10.5 | 8006/TCP | Pulse → pve01 API |
SERVERS-SCAN — default drop
Allows NetBox (10.69.20.10) to scan/poll other zones, and Pulse to send webhooks to DMZ:
| Rule | Action | Source | Destination | Port | Description |
|---|---|---|---|---|---|
| 100 | accept | NETBOX | — | — | NetBox ICMP (ping scanning) |
| 110 | accept | NETBOX | — | 161/UDP | NetBox SNMP polling |
| 120 | accept | NETBOX | — | 22/TCP | NetBox SSH |
| 130 | accept | NETBOX | — | 443/TCP | NetBox HTTPS |
| 140 | accept | NETBOX | — | 80/TCP | NetBox HTTP |
| 150 | accept | PULSE | 10.69.70.40 | 9000/TCP | Pulse webhook → hookshot |
| 155 | accept | UPTIME-KUMA | 10.69.70.40 | 9000/TCP | Uptime-Kuma webhook → hookshot |
| 160 | accept | TRAEFIK | 10.69.70.50 | 18789/TCP | Traefik → openclaw gateway |
| 170 | accept | UPTIME-KUMA | 10.69.70.10 | 64738/TCP+UDP | Uptime-Kuma → mumble (gamedig queries over UDP) |
| 180 | accept | UPTIME-KUMA | 10.69.70.20 | 25565/TCP | Uptime-Kuma → minecraft |
| 190 | accept | UPTIME-KUMA | 10.69.70.30 | 443,8448/TCP | Uptime-Kuma → synapse |
| 195 | accept | UPTIME-KUMA | — | ICMP | Uptime-Kuma ICMP scan DMZ |
| 200 | accept | 10.69.20.78 (metrics) | — | 9100/TCP | Prometheus node_exporter scrape |
| 210 | accept | 10.69.20.78 (metrics) | 10.69.70.40 | 9000/TCP | Alertmanager → hookshot |
| 250 | accept | TRAEFIK | 10.69.70.30 | 8008,8088/TCP | Traefik → synapse + element-web |
| 260 | accept | TRAEFIK | 10.69.70.31 | 8080,7880/TCP | Traefik → matrixrtc (lk-jwt + livekit) |
SERVERS-VPN — default drop
| Rule | Action | Description |
|---|---|---|
| 20 | accept | SERVERS (10.69.20.0/24) → VPN tunnel (10.255.255.0/30) |
VPN-SERVERS — default drop
| Rule | Action | Description |
|---|---|---|
| 20 | accept | HTTP/HTTPS (TCP 80,443) to Traefik |
| 30 | accept | VPS → Traefik 10.69.20.40 TCP 443,8448 (matrix client + federation) |
VPN-DMZ — default drop
Specific services reachable from VPS via VPN:
| Rule | Action | Destination | Port | Service |
|---|---|---|---|---|
| 100 | accept | 10.69.70.10 | 64738 TCP/UDP | Mumble |
| 110 | accept | 10.69.70.20 | 25565 TCP | Minecraft |
Matrix traffic (formerly rules 120/130/140 → 10.69.70.30) now enters Traefik via VPN-SERVERS rule 30. See Matrix Homeserver.
GUEST-SERVERS — default drop
Allows guest clients to reach the Technitium block page when DNS blocking is active:
| Rule | Action | Source | Destination | Port | Description |
|---|---|---|---|---|---|
| 10 | accept | — | — | — | Established/related |
| 20 | drop | — | — | — | Invalid |
| 100 | accept | — | 10.69.20.53 | 80,443/TCP | Technitium block page |
IOT-SERVERS — default drop
Replaces ALLOW-EST for IOT→SERVERS to permit scanner access to copyparty:
| Rule | Action | Source | Destination | Port | Description |
|---|---|---|---|---|---|
| 10 | accept | — | — | — | Established/related |
| 20 | drop | — | — | — | Invalid |
| 100 | accept | 10.69.50.10 | 10.69.20.72 | 22/TCP | Scanner SFTP to paperless |
DMZ-VPN — default drop
Only established/related traffic from DMZ back into VPN.
WAN-DMZ — default drop
| Rule | Action | Destination | Port | Description |
|---|---|---|---|---|
| 10 | accept | — | — | Established/related |
| 20 | drop | — | — | Invalid |
| 200 | accept | 10.69.70.31 | 50000-60000/UDP | LiveKit media → matrixrtc |
| 210 | accept | 10.69.70.31 | 7881/TCP | LiveKit ICE/TCP fallback → matrixrtc |
Unsolicited inbound from WAN to DMZ is otherwise dropped. Rules 200/210 are the only
home-line ingress on the box — they pair with the pppoe0 destination NAT (see NAT)
to deliver Element Call media directly over the home line (79.246.151.97), bypassing the
VPS. See MatrixRTC backend.
TRUSTED-HOMELAB — default accept
Full access from TRUSTED into HOMELAB.
HOMELAB-TRUSTED — default drop
| Rule | Action | Description |
|---|---|---|
| 10 | accept | Established/related |
| 100 | accept | mDNS to 224.0.0.251:5353 (UDP) |
HOMELAB can only reply and send mDNS multicast into TRUSTED.
Global Forward/Input Filter
Applied to all forwarded and router-destined traffic before zone rules:
- Forward rule 5: Drop sources matching
BLOCKLIST - Forward rule 15: MSS clamp TCP SYN packets going out
vti0to 1360 bytes (VPN MTU compensation) - Forward rule 100/110: Accept all traffic in/out of
vti0 - Input rule 5: Drop sources matching
BLOCKLIST
NAT
Source NAT (masquerade)
Single masquerade rule for all outbound traffic:
| Rule | Source | Interface | Translation |
|---|---|---|---|
| 100 | 10.69.0.0/16 | eth1 (WAN) | masquerade |
All internal subnets share the WAN IP for internet access.
Destination NAT (pppoe0 inbound)
The home line normally has no inbound DNAT (all ingress goes via the VPS). The sole exception is Element Call media, forwarded directly over the home line for call quality:
| Rule | Proto | Dest port | Translation | Description |
|---|---|---|---|---|
| 200 | UDP | 50000-60000 | 10.69.70.31 | LiveKit media → matrixrtc |
| 210 | TCP | 7881 | 10.69.70.31 | LiveKit ICE/TCP fallback → matrixrtc |
Paired with WAN-DMZ rules 200/210. See MatrixRTC backend.
VPN — IPsec Site-to-Site
Connects home router (vyos-fw) to the VPS (vyos-edge) over IKEv2.
| Parameter | Home | VPS |
|---|---|---|
| Local ID | home.helix9.org | vps.helix9.org |
| Public IP | 192.168.178.11 (behind NAT) | 159.195.87.143 |
| Tunnel IP | 10.255.255.2/30 | 10.255.255.1/30 |
| Interface | eth1 | — |
| VTI | vti0 | — |
IKE Profile (IKE-VPS)
| Setting | Value |
|---|---|
| Version | IKEv2 |
| Encryption | AES-256 |
| Hash | SHA-256 |
| DH Group | 14 (2048-bit MODP) |
| Lifetime | 28800s (8h) |
| DPD action | restart |
| DPD interval | 30s / timeout 120s |
| Close action | none |
ESP Profile (ESP-VPS)
| Setting | Value |
|---|---|
| Encryption | AES-256 |
| Hash | SHA-256 |
| PFS | DH Group 14 |
| Lifetime | 3600s (1h) |
Authentication: Pre-shared key (PSK ID: helix9).
Connection type: initiate — home router always initiates.
MTU on vti0: 1400 bytes (with MSS clamp to 1360 in forward firewall).
Services
SSH
- Listen:
10.69.10.1(MGMT),10.69.40.1(TRUSTED) only - Port: 22
- Password auth: disabled
- Auth method: Public key only
- Key:
sk-ssh-ed25519@openssh.com(YubiKey hardware-backed)
mDNS Repeater
Bridges mDNS between br30 (HOMELAB) and br40 (TRUSTED), allowing service discovery between Home Assistant devices and trusted clients.
NTP
Clients allowed: All RFC1918 ranges + 10.69.0.0/16.
Upstream servers:
time.cloudflare.comtime1.vyos.net,time2.vyos.net,time3.vyos.net
Blocklist Auto-Update
A scheduled task runs daily to update the BLOCKLIST network group:
- Script:
/opt/vyos-blocklist/update-blocklists.sh - Interval: 1 day
- Effect: Dropped at forward and input filter before zone rules are evaluated
System
| Setting | Value |
|---|---|
| Hostname | vyos-fw |
| Domain | home.lab |
| Timezone | Europe/Berlin |
| Console | ttyS0 at 115200 baud |
| Config revisions kept | 100 |
| Reboot on upgrade failure | after 5 minutes |
| Upstream DNS (system) | 1.1.1.1, 9.9.9.9 |
| Syslog | local, all facilities at info; local7 at debug |
Login
Two users:
vyos— primary admin- Password authentication (encrypted, stored)
- YubiKey SSH public key (
sk-ssh-ed25519@openssh.com) - Password login over SSH disabled (key-only)
ansible— automation user used by thevyos_dnsAnsible role- SSH key only (ed25519 from
pve02:/root/.ssh/id_ed25519_ansible.pub) - VyOS 1.4+ grants login users sudo +
vyattacfgautomatically (nolevel adminneeded) - Reachable from MGMT (10.69.10.0/24) → TRUSTED (10.69.40.1) per zone policy
- SSH key only (ed25519 from