I wanted a network where I could add services, experiment, and make mistakes without giving every new device the same access to the rest of the lab. Before deploying more applications, I worked on the router, switch, and wireless access point that everything would depend on.
The work replaced a MikroTik hEX with a hAP ax S, hardened a CRS326 switch, and migrated a GL-MT6000 running OpenWrt. Both the router’s radios and the separate AP now provide home, IoT, and guest Wi-Fi. The HP server running Proxmox remained a downstream dependency; deploying its applications was outside this phase.
This walkthrough follows the implemented configuration and saved checks through October 5, 2026. Role names replace real VLAN numbers, addresses, SSIDs, account names, and port assignments. The configuration maps are explanatory pseudocode, not device exports or commands to paste into a router. I separate configured controls from behavior that was actually tested.
1. Assign roles before configuring VLANs
I kept the ISP router upstream and accepted double NAT and maintenance downtime. Public applications and remote administration were outside the migration. The hAP became the routing and firewall boundary; the CRS and OpenWrt AP remained Layer 2 devices with IP forwarding disabled.
The first useful distinction was between management and administration. Management is where the infrastructure has its endpoints. Administration is where the operator connects from. Keeping them separate makes access an explicit router policy instead of a property every ordinary client inherits.
| Role | What belongs there | Configuration intent |
|---|---|---|
| Management | Network-device and server management endpoints | Reachable through specific administration permissions |
| Administration | Operator devices used to manage the lab | Selected infrastructure services, including router SSH/Winbox |
| Home | Everyday clients | Internet access and service-specific local permissions |
| IoT | Devices needing the compatibility Wi-Fi profile | Local connectivity with no general internet permission |
| Guest | Visitor devices | Internet access without general device-administration access |
| Physical recovery | A direct maintenance connection on each device | Separate from production management and ordinary clients |
Other roles had gateway/DHCP configuration or future reservations. That did not mean services were running in them. I treated a reserved network, a working transport path, and an accepted application as separate milestones.
Logical topology: ISP router → hAP router → CRS switch → OpenWrt AP and server management. The hAP also provides Wi-Fi. Each network device has a separate physical recovery path.
The diagram focuses on the network foundation. It omits physical port numbers, addressing, recovery subnets, and later workload-specific changes. The server link is shown for its management role.
2. Build only the trunks that are needed
A trunk needs an explicit list of the VLANs it carries. On the CRS, I enabled VLAN filtering and kept the AP trunk limited to management plus its three wireless client roles. The server’s four-link LACP bond initially carried management only, because there were no running workloads to connect.
This is the configuration shape, with operational identifiers removed:
CRS bridge
VLAN filtering: enabled
IP forwarding: disabled
AP trunk
tagged roles: MANAGEMENT, HOME, IOT, GUEST
Server bond — foundation stage
mode: LACP
members: four physical links
tagged role: MANAGEMENT
Unused switch ports
administrative state: disabled
production bridge membership: none
I initially wanted permanent debugging ports for every VLAN, then withdrew that request. A temporary access port can be created for a specific test. Keeping unused ports disabled and outside the production bridge makes the normal state easier to inspect.
The switch also has DHCP snooping enabled, with the router uplink trusted, and BPDU guard on the remaining ordinary access port. Its own IP input and output policies end in default deny. Those settings are implemented; the rogue-DHCP, wrong-tag, and BPDU fault tests remain open.
Three configuration layers need to agree: bridge VLAN membership carries the traffic, a router VLAN interface provides a routed endpoint, and firewall rules decide which routed conversations are permitted. Creating one of those does not complete the other two.
3. Separate router services from forwarded traffic
I kept traffic to the router separate from traffic through the router. DNS or an administrative SSH session to the hAP belongs to the input policy. A client reaching the internet or a different VLAN belongs to the forward policy. Both finish with default deny, after established-connection handling and explicit exceptions.
The configuration work can be read as two related checklists:
| Policy area | What I configured |
|---|---|
| Router input | Initial DHCP acquisition, permitted router services, constrained administration and recovery access, source validation, final deny |
| Forwarded traffic | Source-prefix checks tied to the ingress VLAN, specific inter-role permissions, selected internet access, final deny |
| WAN restrictions | Earlier rules restricting private destinations through the WAN and ordinary external DNS/NTP transports |
Rule ordering mattered during DHCP acquisition. A client requesting its first address must reach that exception before input source validation rejects it. Once addressing exists, the ingress VLAN and expected source prefix are part of the checks. Prefix validation is useful, but it does not authenticate an individual device.
The following map summarizes intent rather than reproducing the complete rule order or every exception:
TO ROUTER
Handle existing connections and explicit service exceptions.
Permit initial DHCP acquisition before input source validation.
Constrain administration and physical recovery by source and service.
Deny anything not explicitly permitted.
THROUGH ROUTER
Validate source prefixes against their ingress VLAN.
Apply existing-connection handling and named exceptions.
Permit selected administration and client traffic.
Apply WAN destination and ordinary DNS/NTP restrictions.
Deny anything not explicitly permitted.
Home and guest clients have general internet permission; IoT does not. These are routed-policy choices. They do not establish complete isolation between peers sharing a VLAN, since that traffic does not have to pass through the router.
Policy examples: home-to-internet is permitted; guest-to-management and IoT-to-internet are denied; administration reaches specific management services. These examples describe configuration intent, not new live tests.
4. Make addressing, DNS, and time part of the baseline
I wanted everyday network use eventually to survive the HP server being off. For the current baseline, DHCP advertises each VLAN’s router gateway as DNS and the router as NTP. The switch also uses router DNS and time.
On the hAP, DNS uses certificate-verified DNS over HTTPS with a static bootstrap record. The router’s own plaintext DNS fallback is blocked. Its NTP client and server functions are enabled, with an IP bootstrap and named upstreams.
Client lease
DNS: router gateway for that VLAN
NTP: router
Router resolver
upstream: DNS over HTTPS
certificate verification: enabled
bootstrap: static record
plaintext fallback: blocked
Router time
NTP client: enabled
NTP server: enabled
Saved cutover checks cover DNS over both UDP and TCP and served NTP. A later review recorded synchronized router and switch time. These results do not establish every client’s time configuration or prove all DNS behavior during a server outage.
A separate network is reserved for a future low-power services fleet. Its gateway remains disabled, with no DHCP scope or commissioned host. Independent hardware would address the HP dependency; a distinct VLAN would give those services their own routed policy boundary. The router and switch would remain shared dependencies. A controlled HP-off test, private DNS equivalence, and independent alert delivery are still pending.
5. Map wireless profiles to the same network roles
The hAP radios and OpenWrt AP use matching home, IoT, and guest roles. OpenWrt bridges the client VLANs over wired backhaul, with production management separate from its physical recovery connection. It does not take over routing.
The radio profiles make the compatibility exception visible:
| Role | Authentication | Protected management frames | Bands |
|---|---|---|---|
| Home | WPA3-SAE | Required | 2.4 and 5 GHz |
| IoT | WPA2-PSK with CCMP | Optional | 2.4 GHz |
| Guest | WPA3-SAE | Required | 2.4 and 5 GHz |
WPS and fast transition are disabled. Guest and IoT profiles include client-isolation settings, but complete peer isolation across both APs still needs testing. Matching network names alone also does not prove good roaming.
The starting radio plan uses 20 MHz channels on 2.4 GHz and separate 40 MHz blocks on 5 GHz. I deferred the 40/80 MHz comparison until the AP’s final placement. There is no measurement establishing 40 MHz as optimal, and it was not a security requirement.
The most useful fault was physical. Guest connectivity worked, but home and IoT clients failed to obtain addresses. An intermediate TL-SG108E, absent from the assumed topology, was then found in the AP’s cable path. After bypassing it with a direct CRS connection, all three roles passed the recorded checks, including acceptance after reboot.
That result supports the topology change. It does not identify a particular setting or hardware defect on the intermediate switch. My first step next time would be to inventory every device in the cable path before changing more rules.
6. Change one stage at a time, with a recovery path
The work progressed from router bench preparation to cutover, AP migration, switch hardening, and account separation. The old router stayed available during bench work. Once the AP and switch had changed, reconnecting it was no longer a complete rollback for the network.
Each network device has its own dedicated physical recovery interface on a separate subnet. Alongside that access, I used the following mechanisms:
| Device | Change protection | Recorded exercise |
|---|---|---|
| hAP router | Interactive Safe Mode | Rollbacks during cutover; final activation explicitly released Safe Mode and checked the export |
| CRS switch | Native rollback scheduler | A harmless comment change was restored in a recorded test |
| OpenWrt AP | Configuration rollback timer | Timer exercised during migration; recovery and post-reboot client checks accepted |
Change cycle: capture the baseline and verify recovery access, arm the device's rollback mechanism, make a bounded change and test fresh connections, then accept it or recover. Safe Mode and timed rollback use different triggers.
The rollback cases were real: one Safe Mode holder closed early, and another change failed short-run validation. The final activation released Safe Mode explicitly. The saved batches are dated, state-dependent changes; they are not an unattended installer to replay against any starting configuration.
I also separated daily key-based router administration from an emergency account restricted to physical recovery. Account source restrictions and IP service/firewall restrictions were configured, and the original administrator was retired after fresh daily-account checks.
The new emergency login remains an open test. An earlier report said it had passed, but later review found insufficient corroboration. I could not repeat the physical test then and chose to proceed. Earlier recovery access does not prove that the new account works.
MikroTik binary backups were encrypted; the OpenWrt configuration archive was not. Full restoration remains untested. A saved backup and a successful restore are different checkpoints.
7. Test the client path and record the gaps
For each stage, I wanted evidence beyond a management page loading. The saved checks cover concrete client behavior, with these limits:
| Checkpoint | Recorded result | Still to verify |
|---|---|---|
| Router cutover | Home/guest addressing and HTTPS; DNS over UDP/TCP; served NTP; selected WAN denial probes | Complete isolation matrix and controlled HP-off acceptance |
| OpenWrt migration | Home/guest DHCP and HTTPS; IoT DHCP with internet denial; recovery and post-reboot acceptance | Cross-AP peer isolation, final-placement throughput and roaming |
| Switch hardening | Physical recovery, post-reboot management, client DHCP, four active server bond members | Rogue DHCP, wrong tags, BPDU faults, authenticated server inspection |
| Account separation | Fresh daily key login and selected denial checks | New physical emergency-account login |
| Backups | Saved device backups and exercised configuration rollback mechanisms | Full device restoration |
Server management reachability is a narrower result than server or workload acceptance. The recorded SSH banner and HTTPS response establish connectivity; the HTTPS probe did not validate the certificate. No application deployment is being claimed here.
Laptop-based switch/AP observers were active at review. A permanent independent collector and confirmed notification delivery were not established. SSO, PKI, VPN, and central monitoring remain future work. Transition exceptions and temporary credentials also need deliberate retirement, and the review retained unresolved router management-service scope findings.
The useful result is a working baseline with explicit roles and a repeatable way to assess the next change: identify the required transport, define the permitted conversation, preserve recovery, and test from the actual client. The unfinished checks are part of that record.
Prepared with AI assistance from reviewed project notes and decision records. The interactive diagrams are explanatory models of the documented design. Recorded checks are historical, not live telemetry.