# CGNAT /20 alignment plan ## Goal Make every router's CGNAT /20 base match its mgmt /20 base on the third octet, so `10.10.X.0/20` is paired with `100.64.X.0/20` everywhere. The **mgmt** subnets are already correctly aligned at /20. Only the **CGNAT** ranges need to move (and in three cases, widen). ## Target state | Router | Mgmt /20 | CGNAT today | CGNAT target | New gateway | |----------|------------------|--------------------|--------------------|-----------------| | verona | 10.10.0.0/20 | 100.64.0.0/22 | 100.64.0.0/20 | 100.64.3.254 (no change \*) | | altoga\* | 10.10.80.0/20 | 100.64.12.0/22 | 100.64.80.0/20 | 100.64.95.254 | | climax | 10.10.16.0/20 | 100.64.4.0/22 | 100.64.16.0/20 | 100.64.31.254 | | culleoka | 10.10.96.0/20 | 100.64.24.0/22 | 100.64.96.0/20 | 100.64.111.254 | | newhope | 10.10.128.0/20 | 100.64.16.0/22 | 100.64.128.0/20 | 100.64.143.254 | | core | 10.10.64.0/20 | 100.64.8.0/22 | 100.64.64.0/20 | 100.64.79.254 | | lowry | 10.10.144.0/20 | 100.64.144.0/20 | (already aligned) | 100.64.159.254 | | 982 | 10.10.48.0/20 | 100.64.48.0/20 | (already aligned) | 100.64.63.254 | | 494 | 10.10.160.0/20 | 100.64.160.0/20 | (already aligned) | 100.64.175.254 | \* Verona keeps its existing gateway because `100.64.3.254` is inside the new /20; the change is just the netmask. Altoga sits on the verona router (`ether6-switch` interface) and is treated as its own renumber. ## Access point IPs: no changes APs live in the top /24 of each mgmt /20. Mgmt /20s are not moving, so **no AP IPs change**. The existing values in `radios.yaml` stay correct. ## Why the order matters Three /20s currently overlap with someone else's planned target: - **`100.64.0.0/20`** (verona's target) currently also contains climax's `100.64.4.0/22`, core's `100.64.8.0/22`, and altoga's `100.64.12.0/22`. Climax, core, and altoga must all leave before verona widens. - **`100.64.16.0/20`** (climax's target) currently contains newhope's `100.64.16.0/22`. Newhope must leave before climax claims it. - **`100.64.96.0/20`** and **`100.64.128.0/20`** and **`100.64.64.0/20`** and **`100.64.80.0/20`** are all empty today — those moves are clean. That gives this order: 1. **culleoka** → `100.64.96.0/20` (clean) 2. **newhope** → `100.64.128.0/20` (clean; frees `100.64.16.0/20`) 3. **core** → `100.64.64.0/20` (clean; partly clears `100.64.0.0/20`) 4. **climax** → `100.64.16.0/20` (target free after step 2; clears more of `100.64.0.0/20`) 5. **altoga** → `100.64.80.0/20` (clean; clears the last subset of `100.64.0.0/20`) 6. **verona** widen `100.64.0.0/22` → `100.64.0.0/20` (no overlap left) Steps 1–5 are independent in pairs; the only hard precedences are 2-before-4 and 3+4+5-before-6. ## The pattern (applies to every step except verona widening) 1. Add the new pool, address, and dhcp-server-network on the existing interface. 2. Point the PPP profile at the new pool and update its `local-address`. 3. Disconnect existing PPPoE sessions (`/ppp active remove [find]`) so they reconnect into the new range. 4. After confirming clients are on the new range, remove the old pool, old `/ip address`, and old `/ip dhcp-server network`. 5. Audit the config for any lingering references to the old gateway IP (hotspot profiles, scripts, firewall rules, NAT) and update them. > Pool/profile/interface names below come from the actual `.rsc` exports. > Substitute if your live config has drifted. --- ## Step 1 — culleoka: 100.64.24.0/22 → 100.64.96.0/20 ```rsc # add new ---------------------------------------------------- /ip pool add name=culleoka-cgnat-new ranges=100.64.96.1-100.64.111.253 /ip address add address=100.64.111.254/20 interface=ether2-netonix \ comment="cgnat /20 (renumber)" /ip dhcp-server network add address=100.64.96.0/20 \ dns-server=204.110.191.240,204.110.191.20 domain=vntx.net \ gateway=100.64.111.254 ntp-server=204.110.191.19 # cut over --------------------------------------------------- /ppp profile set [find name=pppoe] \ local-address=100.64.111.253 remote-address=culleoka-cgnat-new /ppp active remove [find] # verify, then clean up old ---------------------------------- /ip dhcp-server network remove [find address=100.64.24.0/22] /ip address remove [find address=100.64.27.254/22] /ip pool remove [find name=culleoka-cgnat] /ip pool set [find name=culleoka-cgnat-new] name=culleoka-cgnat ``` ## Step 2 — newhope: 100.64.16.0/22 → 100.64.128.0/20 newhope already has two pools (`cgnat` and `cgnat-full`); both must go. ```rsc /ip pool add name=newhope-cgnat-new ranges=100.64.128.1-100.64.143.253 /ip address add address=100.64.143.254/20 interface=sfp-sfpplus1-edgepoint \ comment="cgnat /20 (renumber)" /ip dhcp-server network add address=100.64.128.0/20 \ dns-server=204.110.191.240,204.110.191.20 domain=vntx.net \ gateway=100.64.143.254 ntp-server=204.110.191.19 /ppp profile set [find name=newhope] \ local-address=100.64.143.253 remote-address=newhope-cgnat-new /ppp active remove [find] /ip dhcp-server network remove [find address=100.64.16.0/22] /ip address remove [find address=100.64.19.254/22] /ip pool remove [find name=cgnat] /ip pool remove [find name=cgnat-full] /ip pool set [find name=newhope-cgnat-new] name=newhope-cgnat ``` ## Step 3 — core: 100.64.8.0/22 → 100.64.64.0/20 ```rsc /ip pool add name=core-cgnat-new ranges=100.64.64.1-100.64.79.253 /ip address add address=100.64.79.254/20 interface=combo1-380 \ comment="cgnat /20 (renumber)" /ip dhcp-server network add address=100.64.64.0/20 \ dns-server=204.110.191.240,204.110.191.20 domain=vntx.net \ gateway=100.64.79.254 ntp-server=204.110.191.19 /ppp profile set [find name=380] \ local-address=100.64.79.253 remote-address=core-cgnat-new /ppp active remove [find] /ip dhcp-server network remove [find address=100.64.8.0/22] /ip address remove [find address=100.64.11.254/22] # (core had no named cgnat pool in the export — confirm and remove if present) /ip pool set [find name=core-cgnat-new] name=core-cgnat ``` ## Step 4 — climax: 100.64.4.0/22 → 100.64.16.0/20 > This step depends on step 2 having completed. ```rsc /ip pool add name=climax-cgnat-new ranges=100.64.16.1-100.64.31.253 /ip address add address=100.64.31.254/20 interface=climax-bridge \ comment="cgnat /20 (renumber)" /ip dhcp-server network add address=100.64.16.0/20 \ dns-server=204.110.191.240,204.110.191.20 domain=vntx.net \ gateway=100.64.31.254 ntp-server=204.110.191.19 /ppp profile set [find name=pppoe] \ local-address=100.64.31.253 remote-address=climax-cgnat-new /ppp active remove [find] /ip dhcp-server network remove [find address=100.64.4.0/22] /ip address remove [find address=100.64.7.254/22] /ip pool remove [find name=cgnat] /ip pool set [find name=climax-cgnat-new] name=climax-cgnat ``` ## Step 5 — altoga (on the verona router): 100.64.12.0/22 → 100.64.80.0/20 > Run this on the **verona** router, against the `ether6-switch` interface > and the `pppoe-altoga` profile. Do **not** touch verona-cgnat in this > step. ```rsc /ip pool add name=altoga-cgnat-new ranges=100.64.80.1-100.64.95.253 /ip address add address=100.64.95.254/20 interface=ether6-switch \ comment="altoga cgnat /20 (renumber)" /ip dhcp-server network add address=100.64.80.0/20 \ dns-server=204.110.191.240,204.110.191.20 domain=vntx.net \ gateway=100.64.95.254 ntp-server=204.110.191.19 /ppp profile set [find name=pppoe-altoga] \ local-address=100.64.95.253 remote-address=altoga-cgnat-new /ppp active remove [find name~"altoga"] # narrow to altoga sessions only /ip dhcp-server network remove [find address=100.64.12.0/22] /ip address remove [find address=100.64.15.254/22] /ip pool remove [find name=altoga-cgnat] /ip pool set [find name=altoga-cgnat-new] name=altoga-cgnat ``` ## Step 6 — verona widen: 100.64.0.0/22 → 100.64.0.0/20 > All of steps 3, 4, 5 must be complete first. After this, verona is the > sole occupant of `100.64.0.0/20` and the netmask widening is just a > bookkeeping change — the existing gateway IP `100.64.3.254` stays. ```rsc # widen the pool first so new sessions can actually use the extra space /ip pool set [find name=verona-cgnat] ranges=100.64.0.1-100.64.15.253 # widen the address (RouterOS won't change the mask in place; replace it) /ip address remove [find address=100.64.3.254/22] /ip address add address=100.64.3.254/20 interface=verona network=100.64.0.0 \ comment="cgnat /20 (widened from /22)" # widen the dhcp-server network /ip dhcp-server network remove [find address=100.64.0.0/22] /ip dhcp-server network add address=100.64.0.0/20 \ dns-server=204.110.191.240,204.110.191.20 domain=vntx.net \ gateway=100.64.3.254 ntp-server=204.110.191.19 # (PPP profile pppoe-verona already references verona-cgnat — no change.) # Cycle sessions if you want them on the wider range immediately: /ppp active remove [find name~"verona"] ``` --- ## Post-migration audit checklist Run on every renumbered router: ```rsc # any stale /22 references? :put [/ip address find where address~"/22"] :put [/ip dhcp-server network find where address~"/22"] # any references to old gateways in scripts / firewall / nat? /log print where message~"100.64." /ip firewall nat print where dst-address~"100.64." or src-address~"100.64." /ip firewall filter print where dst-address~"100.64." or src-address~"100.64." ``` Also re-pull the exports and re-run `mikrotik-tool radios` so `radios.yaml` and `subnets.yaml` reflect the new layout.