# pfSense VLAN Setup ## Overview pfSense (Intel N100 mini PC at 10.0.0.1 / 10.1.0.1) handles firewall, routing, DHCP, DNS resolution, and WireGuard VPN for all 8 VLANs. See [Network](../docs/NETWORK.md) for the full VLAN map and firewall policy. See [Decisions](../docs/DECISIONS.md) D005 for the AT&T IP Passthrough rationale. ## Prerequisites - pfSense installed on Intel N100 mini PC - AT&T BGW320 in IP Passthrough mode (pfSense WAN gets public IP) - Omada managed switch connected to pfSense - Trunk port between pfSense and switch carrying all VLANs tagged ## VLAN Configuration ### 1. Create VLAN Interfaces Navigate to: **Interfaces → VLANs → Add** Create one entry per VLAN: | VLAN Tag | Parent | Description | |----------|--------|-------------| | 1000 | (WAN NIC or LAN NIC) | MGMT | | 1010 | (LAN NIC) | LAN | | 1020 | (LAN NIC) | Homelab | | 1030 | (LAN NIC) | Guests | | 1040 | (LAN NIC) | IoT | | 1050 | (LAN NIC) | WFH | | 1099 | (LAN NIC) | DMZ | ### 2. Assign VLAN Interfaces Navigate to: **Interfaces → Assignments** Add each VLAN as a new interface. Enable and configure each: | Interface | IP | Subnet | |-----------|-----|--------| | MGMT (1000) | 10.0.0.1 | /24 | | LAN (1010) | 10.1.0.1 | /24 | | Homelab (1020) | 10.2.0.1 | /24 | | Guests (1030) | 10.3.0.1 | /24 | | IoT (1040) | 10.4.0.1 | /24 | | WFH (1050) | 10.5.0.1 | /24 | | DMZ (1099) | 10.99.0.1 | /24 | ### 3. DHCP Servers Navigate to: **Services → DHCP Server** — configure one per VLAN: | VLAN | DHCP Range | DNS | |------|------------|-----| | MGMT | 10.0.0.100–150 | pfSense (10.0.0.1) | | LAN | 10.1.0.100–200 | Pi-hole (10.2.0.11) | | Homelab | 10.2.0.100–200 | Pi-hole (10.2.0.11) | | Guests | 10.3.0.100–250 | Pi-hole (10.2.0.11) | | IoT | 10.4.0.100–250 | Pi-hole (10.2.0.11) | | WFH | 10.5.0.100–200 | pfSense (10.5.0.1) — Pi-hole intentionally excluded | | DMZ | static only | pfSense (10.99.0.1) | ### 4. Firewall Rules Navigate to: **Firewall → Rules** — configure per-interface rules following the policy in [NETWORK.md](../docs/NETWORK.md#firewall-policy). Key rules: - Default deny all inter-VLAN (floating rule or per-interface block at end) - LAN → Homelab: allow (LAN users reach services) - LAN → MGMT: allow (admin access from home devices) - Homelab → internet: HTTP/S, SSH, NTP only (for updates) - Guests → internet only: block all RFC1918 - IoT → internet + Home Assistant: block everything else - WFH → internet only: block all RFC1918, pfSense DNS only - MGMT → internet: NTP + updates only; inbound from LAN + VPN only - DMZ → internet: HTTP/S + NTP; block all internal VLANs ### 5. DNS Resolver (Unbound) Navigate to: **Services → DNS Resolver** - Enable: ✓ - Listen on: all interfaces - Upstream DNS: Cloudflare 1.1.1.1 - DNSSEC: ✓ (optional) Pi-hole (10.2.0.11) uses pfSense Unbound as its upstream. WFH VLAN devices use pfSense Unbound directly — Pi-hole is unreachable from WFH by firewall rule. ### 6. Static DHCP Reservations Navigate to: **Services → DHCP Server → [interface] → DHCP Static Mappings** Add reservations for all homelab hosts from [NETWORK.md](../docs/NETWORK.md#static-ip-reservations). ## Configuration Backup Navigate to: **Diagnostics → Backup & Restore → Backup Configuration** Download `config.xml`. Store in Vaultwarden or PBS. This is the single file needed to restore pfSense from scratch. ## Verification ```bash # From a LAN device: # 1. Gets IP from DHCP in 10.1.0.100–200 range ip addr # 2. DNS resolves via Pi-hole nslookup google.com # should show answer from 10.2.0.11 # 3. Internal service resolves nslookup outline.lerkolabs.com # should return 10.2.0.20 # 4. Internet access works curl -I https://google.com ```