<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Network Segmentation on Deevnet Infrastructure Platform</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/</link><description>Recent content in Network Segmentation on Deevnet Infrastructure Platform</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/index.xml" rel="self" type="application/rss+xml"/><item><title>Prerequisites &amp; Preflight</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/prerequisites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/prerequisites/</guid><description>&lt;h1 id="prerequisites--preflight">
 Prerequisites &amp;amp; Preflight
 &lt;a class="anchor" href="#prerequisites--preflight">#&lt;/a>
&lt;/h1>
&lt;h2 id="vault">
 Vault
 &lt;a class="anchor" href="#vault">#&lt;/a>
&lt;/h2>
&lt;p>All secrets are encrypted with Ansible Vault in the inventory. Decrypt before starting the migration and re-encrypt when done:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-inventory-deevnet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make unvault &lt;span style="color:#75715e"># decrypt — run once before starting&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ... run migration steps ...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make vault &lt;span style="color:#75715e"># re-encrypt when migration is complete&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="migration-artifact-capture">
 Migration Artifact Capture
 &lt;a class="anchor" href="#migration-artifact-capture">#&lt;/a>
&lt;/h2>
&lt;p>Migration logs (preflight, each migration step, postcheck) are automatically captured in &lt;code>ansible-collection-deevnet.net/migration-logs/&lt;/code> with timestamps. Each &lt;code>make&lt;/code> target produces a log file named &lt;code>YYYYMMDD-HHMMSS-&amp;lt;target&amp;gt;.log&lt;/code>. No additional setup is required.&lt;/p></description></item><item><title>VLAN Foundation</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/vlan-foundation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/vlan-foundation/</guid><description>&lt;h1 id="vlan-foundation">
 VLAN Foundation
 &lt;a class="anchor" href="#vlan-foundation">#&lt;/a>
&lt;/h1>
&lt;p>Create the VLAN infrastructure on the router and switch. All steps in this phase are non-disruptive — no existing traffic is affected.&lt;/p>
&lt;hr>
&lt;h2 id="step-2-opnsense-vlan-interfaces">
 Step 2: OPNsense VLAN Interfaces
 &lt;a class="anchor" href="#step-2-opnsense-vlan-interfaces">#&lt;/a>
&lt;/h2>
&lt;p>Create VLAN sub-interfaces on OPNsense. This step is non-disruptive — it only adds new interfaces without affecting existing traffic.&lt;/p>
&lt;p>&lt;strong>Run:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-collection-deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make migration-opnsense-vlans
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Verify:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>OPNsense GUI -&amp;gt; Interfaces -&amp;gt; Devices -&amp;gt; VLAN&lt;/li>
&lt;li>Confirm 11 VLANs created on the correct parent interface&lt;/li>
&lt;li>Each VLAN shows the correct tag (10, 20, 25, 30, 31, 35, 40, 50, 51, 52, 99)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Rollback:&lt;/strong>
Delete VLAN interfaces via OPNsense GUI -&amp;gt; Interfaces -&amp;gt; Devices -&amp;gt; VLAN -&amp;gt; delete each entry.&lt;/p></description></item><item><title>Builder Cutover</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/builder-cutover/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/builder-cutover/</guid><description>&lt;h1 id="builder-cutover-to-management-vlan">
 Builder Cutover to Management VLAN
 &lt;a class="anchor" href="#builder-cutover-to-management-vlan">#&lt;/a>
&lt;/h1>
&lt;p>Move the builder (&lt;code>provisioner-ph01&lt;/code>) from the flat network to VLAN 99 with a static IP. This eliminates the DHCP dependency — the builder&amp;rsquo;s eth0 is configured with a static address before its port moves to the new VLAN. After this step, the builder has routed access to all VLANs for the rest of the migration.&lt;/p>
&lt;p>&lt;strong>Prerequisites:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="../vlan-foundation/#step-4-trunk-uplink-tagged-vlans">Step 4&lt;/a> complete (trunk uplink carrying tagged VLANs)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="5a--assign-and-configure-opnsense-vlan-interfaces">
 5a — Assign and configure OPNsense VLAN interfaces
 &lt;a class="anchor" href="#5a--assign-and-configure-opnsense-vlan-interfaces">#&lt;/a>
&lt;/h2>
&lt;p>Assign all VLAN devices to OPNsense interface slots and configure gateway IPs. The OPNsense API does not support interface assignment (&lt;a href="https://github.com/opnsense/core/issues/7324">GitHub #7324&lt;/a>), so the playbook will pause and prompt you to complete a manual GUI step before continuing with automated IP configuration.&lt;/p></description></item><item><title>Services &amp; Routing</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/services-and-routing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/services-and-routing/</guid><description>&lt;h1 id="services--routing">
 Services &amp;amp; Routing
 &lt;a class="anchor" href="#services--routing">#&lt;/a>
&lt;/h1>
&lt;p>Configure DHCP, interface IPs, firewall rules, and trunk PVID. After this phase, all VLANs are fully routed and served.&lt;/p>
&lt;blockquote class="book-hint info">
 
**Post-cutover inventory:** All `make` targets from this point forward automatically use the `dvntm-new` inventory (target IPs on the new VLAN subnets). The builder is on VLAN 99 and can only reach devices at their new addresses. No manual `-i` overrides are needed.

&lt;/blockquote>

&lt;hr>
&lt;h2 id="step-6-test-second-port">
 Step 6: Test Second Port
 &lt;a class="anchor" href="#step-6-test-second-port">#&lt;/a>
&lt;/h2>
&lt;p>Test a non-builder port on a different VLAN to validate the trunk + VLAN path end-to-end.&lt;/p></description></item><item><title>Port Migration &amp; Wireless</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/port-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/port-migration/</guid><description>&lt;h1 id="port-migration--wireless">
 Port Migration &amp;amp; Wireless
 &lt;a class="anchor" href="#port-migration--wireless">#&lt;/a>
&lt;/h1>
&lt;p>Move remaining switch ports to their assigned VLANs, perform the management cutover, adopt devices in Omada, and configure AP SSIDs.&lt;/p>
&lt;hr>
&lt;h2 id="step-10-migrate-remaining-access-ports">
 Step 10: Migrate Remaining Access Ports
 &lt;a class="anchor" href="#step-10-migrate-remaining-access-ports">#&lt;/a>
&lt;/h2>
&lt;p>Move all remaining switch ports to their assigned VLANs as defined in &lt;code>host_vars/access-sw01.yml&lt;/code>.&lt;/p>
&lt;blockquote class="book-hint info">
 
**DNS:** New 10.20.x.x addresses will not resolve via DNS until post-migration ([Step 11](#step-11-management-cutover) / [Post-Migration](../post-migration/)). This is expected — Ansible uses inventory IPs directly. Use IP addresses for any manual verification during this step.

&lt;/blockquote>

&lt;blockquote class="book-hint warning">
 
**Wireless clients:** AP SSID-to-VLAN mappings are not reconfigured in this step. When the AP's port moves to its target VLAN, wireless clients may lose connectivity. SSID configuration is handled in [Step 13](#step-13-ap-ssid-configuration) after Omada adoption ([Step 12](#step-12-omada-device-adoption)).

&lt;/blockquote>

&lt;p>&lt;strong>Run:&lt;/strong>&lt;/p></description></item><item><title>Post-Migration</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/post-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/post-migration/</guid><description>&lt;h1 id="post-migration">
 Post-Migration
 &lt;a class="anchor" href="#post-migration">#&lt;/a>
&lt;/h1>
&lt;p>After all steps complete and connectivity is verified:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Run automated post-migration validation:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-collection-deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make postcheck
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Validates OPNsense VLANs, switch database/trunk, device reachability, gateway IPs, and builder state. All checks should show &lt;code>[PASS]&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Run DNS and DHCP roles&lt;/strong> (must run before vault encryption):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-collection-deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make dns
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make dhcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Re-encrypt vault files:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-inventory-deevnet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make vault
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Remove old network config:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Delete old 192.168.10.0/23 Kea DHCP subnet (if not already removed)&lt;/li>
&lt;li>Remove temp VLAN 99 DHCP pool (if not already removed)&lt;/li>
&lt;li>Remove old 192.168.10.0 LAN interface from OPNsense (Interfaces → LAN → clear IP or reassign)&lt;/li>
&lt;li>Remove any old static routes referencing 192.168.10.x&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Ongoing switch management&lt;/strong> — use the &lt;code>switch&lt;/code> target for day-2 operations:&lt;/p></description></item><item><title>Troubleshooting</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/troubleshooting/</guid><description>&lt;h1 id="troubleshooting--known-issues">
 Troubleshooting &amp;amp; Known Issues
 &lt;a class="anchor" href="#troubleshooting--known-issues">#&lt;/a>
&lt;/h1>
&lt;h2 id="lost-switch-access-after-trunk-configuration">
 Lost switch access after trunk configuration
 &lt;a class="anchor" href="#lost-switch-access-after-trunk-configuration">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Connect via console cable&lt;/li>
&lt;li>Check &lt;code>show interface switchport gigabitEthernet 1/0/1&lt;/code> for native VLAN mismatch&lt;/li>
&lt;li>Revert to access mode on uplink if needed&lt;/li>
&lt;/ul>
&lt;h2 id="device-not-getting-dhcp-lease">
 Device not getting DHCP lease
 &lt;a class="anchor" href="#device-not-getting-dhcp-lease">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Kea not listening on VLAN interfaces:&lt;/strong> Check OPNsense GUI → Services → Kea DHCP → Settings → Interfaces. All VLAN interfaces must be selected. By default, Kea only listens on LAN (re0). The &lt;code>opnsense_dhcp&lt;/code> role automates this, but verify with: &lt;code>ssh root@10.20.99.1 'cat /usr/local/etc/kea/kea-dhcp4.conf'&lt;/code> and check the &lt;code>interfaces-config&lt;/code> section.&lt;/li>
&lt;li>Verify port VLAN assignment: &lt;code>show vlan brief&lt;/code>&lt;/li>
&lt;li>Verify DHCP subnet exists in OPNsense for that VLAN&lt;/li>
&lt;li>Check OPNsense firewall rules allow DHCP on VLAN interface&lt;/li>
&lt;li>Check &lt;code>show mac address-table&lt;/code> to confirm device is on expected port&lt;/li>
&lt;/ul>
&lt;h2 id="ap-not-discoverable-or-adoption-fails-in-omada">
 AP not discoverable or adoption fails in Omada
 &lt;a class="anchor" href="#ap-not-discoverable-or-adoption-fails-in-omada">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Factory reset AP&lt;/strong> uses static fallback IP &lt;code>192.168.0.254&lt;/code>, not DHCP. Add temp IP on builder (&lt;code>sudo ip addr add 192.168.0.1/24 dev enp4s0&lt;/code>) and access AP web UI at &lt;code>http://192.168.0.254&lt;/code> (admin/admin) to set inform URL.&lt;/li>
&lt;li>&lt;strong>Adoption timeout (errorCode -39002):&lt;/strong> AP can&amp;rsquo;t reach controller on required ports. Check &lt;code>ss -tlnp | grep 29814&lt;/code> — Omada must listen on &lt;strong>TCP&lt;/strong> 29814 (not just UDP). Newer AP firmware (EAP650-Outdoor) requires TCP 29814 for v2 adoption.&lt;/li>
&lt;li>&lt;strong>Omada controller version mismatch:&lt;/strong> Controller 5.12.7 does not listen on TCP 29814. Update the controller to a version that supports v2 adoption protocol.&lt;/li>
&lt;li>&lt;strong>Firewalld missing ports:&lt;/strong> Verify &lt;code>sudo firewall-cmd --list-ports&lt;/code> includes &lt;code>29810-29814/udp&lt;/code> AND &lt;code>29811-29814/tcp&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="builder-lost-connectivity-during-step-5">
 Builder lost connectivity during Step 5
 &lt;a class="anchor" href="#builder-lost-connectivity-during-step-5">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Verify ethernet cable is connected to &lt;code>gi1/0/16&lt;/code> — do not rely on WiFi for substrate access&lt;/li>
&lt;li>Check port VLAN assignment: &lt;code>show interface switchport gigabitEthernet 1/0/16&lt;/code>&lt;/li>
&lt;li>Verify VLAN 99 interface is enabled with IP &lt;code>10.20.99.1&lt;/code> in OPNsense&lt;/li>
&lt;li>If the builder has the wrong static IP config, revert the port to VLAN 1 and re-run the builder playbook with the dvntm inventory&lt;/li>
&lt;li>If the builder is unreachable, Omada adoption (&lt;a href="../port-migration/#step-12-omada-device-adoption">Step 12&lt;/a>) cannot proceed — but the switch and AP continue to function independently&lt;/li>
&lt;li>Last resort: revert the builder port to VLAN 1 via console:
&lt;pre tabindex="0">&lt;code>configure
interface gigabitEthernet 1/0/16
 switchport access vlan 1
end
copy running-config startup-config
&lt;/code>&lt;/pre>&lt;/li>
&lt;/ul>
&lt;h2 id="inter-vlan-routing-not-working">
 Inter-VLAN routing not working
 &lt;a class="anchor" href="#inter-vlan-routing-not-working">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Check default gateway on target device:&lt;/strong> Devices on VLAN 99 (management) need &lt;code>ip route 0.0.0.0 0.0.0.0 10.20.99.1&lt;/code> to route responses back to other VLANs. Without this, the device receives cross-VLAN traffic but replies are silently dropped (no return route). This was the root cause of the &amp;ldquo;builder can&amp;rsquo;t ping cross-VLAN gateways&amp;rdquo; issue — the switch had no default gateway.&lt;/li>
&lt;li>Verify VLAN interfaces have IP addresses assigned in OPNsense&lt;/li>
&lt;li>Check OPNsense firewall rules for inter-VLAN traffic&lt;/li>
&lt;li>Verify routing table: OPNsense GUI -&amp;gt; System -&amp;gt; Routes&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="to-do">
 To Do
 &lt;a class="anchor" href="#to-do">#&lt;/a>
&lt;/h2>
&lt;p>Automation gaps and improvements identified during the initial migration run.&lt;/p></description></item></channel></rss>