# IPv6 addressing plan — vntx WISP **Status:** greenfield design. Any existing IPv6 on the routers (verona /40 PD pool, climax/culleoka /52s, scattered point-to-point /128s, etc.) is to be **deleted and replaced** with what's defined here. Don't try to migrate it. **Allocation:** `2606:1c80::/32` (already advertised to TWC AS11427 from `edge`, peer `2605:6000:0:8::f:372`). **Customer prefix:** **`/56`** per PPPoE session via DHCPv6-PD. A /56 lets customer CPE subnet into 256 /64s (LAN, guest, IoT, VPN, etc.) — the operationally sane default that matches RIPE-690 / BCOP-690 guidance. Customer CPE that only knows /64 still works fine — RouterOS hands out the /56 and the CPE configures the first /64 from it. No NAT66. --- ## Top-level carve `2606:1c80::/32` is sliced into two purposes: | Block | Size | Purpose | |-------------------------------|-------|--------------------------------------| | `2606:1c80::/48` | /48 | **Infrastructure** — loopbacks, P2P, transit | | `2606:1c80:1::/48` – `2606:1c80:FFF::/48` | (reserved) | extra infra room | | `2606:1c80:1000::/36` | /36 | **Tower allocations** — one **/44** per tower | | `2606:1c80:2000::/36` and higher | bulk | reserved (future expansion) | The tower block `2606:1c80:1000::/36` holds **256 /44s** (4 096 /44s fits in a /32 minus the infra pad). At one /44 per tower, that's 256 towers worth of allocations — far more than you'll ever build. Why /44 per tower? Each /44 = 16 /48s = **4 096 /56s**. Subtract one /48 for tower infra (mgmt, APs, etc.) and you have **3 840 /56 customers per tower**, comfortably above the ~4 000-IP v4 CGNAT capacity per tower. --- ## Infrastructure block — `2606:1c80::/48` Subdivided into /64s, indexed by purpose. Servers get the prime all-zeros /64 so their addresses are as short as the allocation allows; loopbacks and P2P links shift down to make room. | Prefix | Use | |-----------------------------------------|--------------------------------------------------| | `2606:1c80::/64` | **Core servers** — DNS, NTP, monitoring, billing, internal services (static-only, no SLAAC). Lives at 380 (core); see below. | | `2606:1c80:0:1::/64` … `:F::/64` | reserved server expansion (DMZ, hypervisor mgmt, alt server VLANs) | | `2606:1c80:0:10::/64` | **Loopbacks** — one `/128` per router | | `2606:1c80:0:11::/64` … `:1F::/64` | **Wired backbone P2P links** — one `/64` per link, both ends addressed `/64` | | `2606:1c80:0:20::/64` … `:FF::/64` | **Wireless backhaul P2P links** — one `/64` per link, both ends addressed `/64` | | `2606:1c80:0:1000::/64` | Edge↔TWC transit (already `2605:6000:…` upstream; this slot is for future v6 transit/IX) | | `2606:1c80:0:1001::/64` | Edge↔Spectrum / secondary upstream | | `2606:1c80:0:1002::/64` | Edge↔Preseem (shaper) | | `2606:1c80:0:2000::/64` … `:2FFF::/64` | OOB / mgmt-VLAN-of-routers (one /64 per site, optional) | | `2606:1c80:0:F000::/64` and up | reserved (future infra) | ### Servers — `2606:1c80::/64` The single server LAN for the entire network, located at the **380** site and hosted on the **edge** router (the server switch is plugged into edge's `sfp-sfpplus8-server-switch` port, VLAN 9, same as the existing v4 server LAN on `vlan9_sfpplus8`). Gateway: **`2606:1c80::1/64`**. RA is **disabled** — servers get static addresses, not SLAAC. Stateful DHCPv6 is optional; prefer static config for server-class hosts. Suggested numbering mirrors the v4 `204.110.191.X` last-octet so the two are easy to translate by sight: | v4 host | v6 host | Role | |---------------------|----------------------|-------------------------| | `204.110.191.20` | `2606:1c80::20` | DNS resolver (primary) | | `204.110.191.240` | `2606:1c80::240` | DNS resolver (secondary) | | `204.110.191.250` | `2606:1c80::250` | DNS resolver (tertiary) | | `204.110.191.19` | `2606:1c80::19` | NTP | `2606:1c80:0:1::/64` through `:F::/64` are reserved server expansion slots (DMZ, hypervisor mgmt, alternate server VLANs) — populate them only when there's a concrete need. ### Loopbacks (`2606:1c80:0:10::/64`) One `/128` per router, all inside `2606:1c80:0:10::/64`. To keep the v6 loopback visually parallel to the v4 loopback (`10.254.254.X`), encode the v4 last octet as the **last hextet, treated as hex** (so `:10::101` is the v6 loopback for the router whose v4 loopback is `10.254.254.101`). Visual mnemonic, not a numeric identity. | Router | v4 loopback | v6 loopback | |-----------|-----------------|--------------------------| | verona | 10.254.254.101 | `2606:1c80:0:10::101/128` | | climax | 10.254.254.102 | `2606:1c80:0:10::102/128` | | culleoka | 10.254.254.104 | `2606:1c80:0:10::104/128` | | newhope | 10.254.254.108 | `2606:1c80:0:10::108/128` | | lowry | 10.254.254.109 | `2606:1c80:0:10::109/128` | | 982 | 10.254.254.110 | `2606:1c80:0:10::110/128` | | 494 | 10.254.254.111 | `2606:1c80:0:10::111/128` | | core | 10.254.254.253 | `2606:1c80:0:10::253/128` | | edge | 10.254.254.254 | `2606:1c80:0:10::254/128` | Loopbacks announce into OSPFv3 only. ### Inter-router P2P links (`2606:1c80:0:11::/64` … `:FF::/64`) One `/64` per physical/logical link, with both ends addressed `/64` (avoid `/127` — picking `::1/127` and `::2/127` puts the two ends in *different* /127 networks since `::1` and `::2` straddle the /127 boundary; verified live 2026-05-09). The two ends. Numbering follows the existing v4 `/29` transport scheme. Wired/fiber transport uses `:11::`–`:1F::`; wireless backhaul uses `:20::`+. (`:10::/64` is the loopback /64.) | Link | v4 /29 | v6 /64 | Endpoints (`/64`) | |----------------------------|---------------------|-------------------------|---------------------------------------------| | edge ↔ core (sfpplus7) | 204.110.191.180/30 | `2606:1c80:0:11::/64` | `…:11::1` edge / `…:11::2` core | | core ↔ climax (ether5) | 10.250.1.88/29 | `2606:1c80:0:12::/64` | `…:12::1` core / `…:12::2` climax | | core ↔ newhope (ether4) | 10.250.1.56/29 | `2606:1c80:0:13::/64` | `…:13::1` core / `…:13::2` newhope | | core ↔ 982 (ether1) | 10.250.1.32/29 | `2606:1c80:0:14::/64` | `…:14::1` core / `…:14::2` 982 | | core ↔ culleoka (ether6) | 10.250.1.48/29 | `2606:1c80:0:15::/64` | `…:15::1` core / `…:15::2` culleoka | | verona ↔ climax (11 GHz) | (existing v6 in use)| `2606:1c80:0:20::/64` | `…:20::1` verona / `…:20::2` climax | | climax ↔ culleoka (11 GHz) | — | `2606:1c80:0:21::/64` | `…:21::1` climax / `…:21::2` culleoka | | climax ↔ 494 (ether5) | 10.250.1.64/29 | `2606:1c80:0:17::/64` | `…:17::1` climax / `…:17::2` 494 | | newhope ↔ lowry (ether6) | 10.250.1.104/29 | `2606:1c80:0:18::/64` | `…:18::1` newhope / `…:18::2` lowry | Pick the next free `:NN::/64` (wired in `:11::`–`:1F::`, wireless in `:20::`+) when adding a link; record it here. The existing `2606:1c80:0:1010::/64` and `2606:1c80:0:0010::/64` get **deleted** and replaced with `:20::` and `:21::` respectively (note that the new `:10::/64` slot is now the loopback /64, not a P2P link). --- ## Tower block — `2606:1c80:1000::/36` One **`/44`** per tower. The third hextet of the /44 encodes the v4 mgmt /20's third octet as `10`, so you can map between v4 and v6 by sight: | Tower | v4 mgmt | v4 third oct (hex) | v6 /44 | Inverse mnemonic | |------------|------------------|--------------------|-------------------------|------------------| | verona | 10.10.0.0/20 | 0 (`0x00`) | `2606:1c80:1000::/44` | `100` | | climax | 10.10.16.0/20 | 16 (`0x10`) | `2606:1c80:1100::/44` | `110` | | 982 | 10.10.48.0/20 | 48 (`0x30`) | `2606:1c80:1300::/44` | `130` | | core (380) | 10.10.64.0/20 | 64 (`0x40`) | `2606:1c80:1400::/44` | `140` | | altoga | 10.10.80.0/20 | 80 (`0x50`) | `2606:1c80:1500::/44` | `150` | | culleoka | 10.10.96.0/20 | 96 (`0x60`) | `2606:1c80:1600::/44` | `160` | | newhope | 10.10.128.0/20 | 128 (`0x80`) | `2606:1c80:1800::/44` | `180` | | lowry | 10.10.144.0/20 | 144 (`0x90`) | `2606:1c80:1900::/44` | `190` | | 494 | 10.10.160.0/20 | 160 (`0xA0`) | `2606:1c80:1A00::/44` | `1A0` | Slots not in the table (`2606:1c80:1010::/44`, `:1020::/44`, `:1200::/44`, …) are **reserved**. New tower at `10.10.176.0/20` (`0xB0`) takes `2606:1c80:1B00::/44`. Don't reuse out of band. Altoga is logical-satellite of verona but gets its own /44 — it serves its own customer base off `ether6-switch` on the verona router and the v4 plan already treats it as independent. Easier to operate as a peer. ### Per-tower /44 layout Each /44 = 16 /48s. The first /48 is tower infra; the other 15 carry customer /56s. | Sub-prefix | Use | |-------------------------------------------|---------------------------------------------------------| | `2606:1c80:NNN0::/48` | **Tower infrastructure** | | ↳ `2606:1c80:NNN0::/64` | Router-side mgmt LAN (RA + DHCPv6 stateless) | | ↳ `2606:1c80:NNN0:F::/64` | Access points (mirrors v4 top-`/24`-of-`/20` rule) | | ↳ `2606:1c80:NNN0:1::/64`–`:E::/64` | reserved (extra VLANs, IoT, voice, monitoring) | | ↳ `2606:1c80:NNN0:10::/64`–`:FF::/64` | reserved (sub-tower/repeater /64s) | | `2606:1c80:NNN1::/48` | **Customer PD pool slot 1** — 256 × /56 | | `2606:1c80:NNN2::/48` | Customer PD pool slot 2 — instantiate when 1 fills | | `2606:1c80:NNN3::/48` … `2606:1c80:NNNF::/48` | Customer pool slots 3–15 (instantiate as needed) | Servers are **not** allocated per-tower — there's a single dedicated core-servers /64 in the infrastructure block (see below). Towers don't host server-class hosts. Customer capacity per tower: **15 × 256 = 3 840 /56s**. The router itself uses `2606:1c80:NNN0::1/64` on the mgmt LAN (mirrors the v4 `.X.254` gateway convention but moved to `::1` for v6 since `::1` is what humans type). APs autoconfig EUI-64 inside `:NNN0:F::/64`; when you need a known address, use `:F::1` … `:F::FF`. **Operational note on pool growth.** Start each tower with one customer pool (`:NNN1::/48`, prefix-length=56 → 256 /56s). When the pool drops below ~30 free /56s, add the next one (`:NNN2::/48` → next 256 /56s) as a second pool and assign it to the same PPP profile. RouterOS will draw from any pool the profile references. Each pool drop is a `/ipv6 pool add` — no PPPoE disruption. --- ## Routing ### IGP — OSPFv3 Edge already runs OSPFv3 in area `backbone`. Every router gets: ```rsc /routing ospf-v3 instance add name=default-v3 router-id= redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface= network-type=point-to-point ``` Loopbacks and connected /64s redistribute as type-1. Customer PD allocations do **not** redistribute into OSPF — they're on-link via the PPPoE interface, and edge/core learn aggregates via iBGP. ### iBGP — `/44` aggregates → edge Each tower router peers iBGP with `edge` (and optionally `core` as a route-reflector if you want to scale; today direct works fine) over its loopback. Peer config on every tower: ```rsc /routing bgp instance set default as=393837 router-id= /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:NNN0::/44 synchronize=no ``` Edge already has `2606:1c80::/32` in its `/routing bgp network`, which covers all towers — that aggregate goes upstream to TWC. The per-tower `/44`s announced over iBGP are for **internal** longest-match so traffic returning into the network can find the right tower without flooding the default through the IGP. (If iBGP feels overkill, OSPFv3 redistribution of the per-tower /44 works too. iBGP scales better and matches your v4 structure.) ### Customer PD — DHCPv6-PD on PPPoE (/56 per session) On each tower router: ```rsc /ipv6 pool add name=-cust-pd-1 prefix=2606:1c80:NNN1::/48 prefix-length=56 /ppp profile set [find name=] \ remote-ipv6-prefix-pool=-cust-pd-1 \ dhcpv6-pd-pool=-cust-pd-1 /ipv6 dhcp-server add name=-pd interface= \ address-pool=-cust-pd-1 ``` Each PPPoE session gets a single `/56` from the pool, delegated via DHCPv6-PD. CPE configures `/64`s out of it on its LANs. ### Mgmt-LAN / wired customers (no PPPoE) For the wired mgmt LAN at each tower (`2606:1c80:NNN0::/64`), use SLAAC + RDNSS: ```rsc /ipv6 address add address=2606:1c80:NNN0::1/64 interface= advertise=yes /ipv6 nd add interface= ra-interval=3m20s-10m \ other-configuration=yes managed-address-configuration=no /ipv6 nd prefix add interface= prefix=2606:1c80:NNN0::/64 \ autonomous=yes on-link=yes /ipv6 dhcp-server add interface= name=-mgmt-stateless \ address-pool=none ``` DNS via RDNSS pointing at v6 resolvers (the v6 equivalents of `204.110.191.240` and `.20`); configure those on the resolver hosts when you v6-enable them. --- ## Firewall (every router) Mirror your v4 input chain. Minimum: ```rsc /ipv6 firewall filter add chain=input action=accept connection-state=established,related add chain=input action=accept protocol=icmpv6 add chain=input action=accept src-address=fe80::/10 add chain=input action=accept src-address=2606:1c80::/32 ;; internal add chain=input action=drop add chain=forward action=accept connection-state=established,related add chain=forward action=accept protocol=icmpv6 hop-limit=equal:1 ;; PMTUD add chain=forward action=accept protocol=icmpv6 add chain=forward action=accept src-address=2606:1c80::/32 ;; v6 outbound + transit add chain=forward action=drop ``` The `src-address=2606:1c80::/32` forward rule is **load-bearing and must match the whole /32, not a per-tower /44**. Traffic from one tower's customers transits other routers on the way to `edge`, so a router that only accepts its own `/44` blackholes every other tower's customers at its `default deny` (presents as "ICMPv6 pings work, TCP/HTTP doesn't" — the `accept protocol=icmpv6` rule lets echo through while forwarded TCP hits the drop). It also covers internal-to-internal, so no separate `src+dst=2606:1c80::/32` rule is needed. Do **not** use `in-interface-list=customer` — that list was never populated on the fleet and the rule silently matched nothing. Unsolicited inbound from the internet to customers still hits `default deny`; only `established,related` returns. Edge keeps its existing inbound BGP rules. Do **not** NAT v6 — every prefix is GUA from your /32. --- ## DNS - Forward DNS for `2606:1c80::/32`: AAAA records under `vntx.net` for router loopbacks (`verona-loopback.vntx.net AAAA 2606:1c80::101`, etc.) and customer PTR delegations. - Reverse DNS: request a `1.c.8.1.6.0.6.2.ip6.arpa` delegation from ARIN matching the /32. Then run a v6 PTR generator (mirror the v4 side). --- ## Migration notes This is a greenfield plan but the routers have *some* v6 already: - Delete on every router before applying: `/ipv6 address remove [find]`, `/ipv6 pool remove [find]`, `/ipv6 dhcp-server remove [find]`, `/ipv6 nd remove [find !default]`. - Keep edge's `/routing bgp network add 2606:1c80::/32 synchronize=no` and its TWC v6 peer. - Keep edge's `/ipv6 firewall filter` rules — extend per the template, don't replace. Apply tower-by-tower in the same order as the CGNAT renumber sequence (see `subnets.md`) so you're not running two transitions in parallel. --- ## Per-router config skeletons ### edge (loopback `:10::254`, hosts the global server /64) ```rsc /ipv6 address add address=2606:1c80:0:10::254/128 interface=lo advertise=no add address=2606:1c80:0:11::1/64 interface=sfp-sfpplus7-core-direct add address=2606:1c80:0:1002::1/64 interface=sfp-sfpplus11-preseem add address=2606:1c80::1/64 interface=vlan9_sfpplus8 ;; server LAN ;; existing TWC peering address lives outside our /32 — leave it ;; suppress RA on the servers /64 — static-only, no SLAAC /ipv6 nd add interface=vlan9_sfpplus8 disabled=no advertise=no \ managed-address-configuration=no other-configuration=no /routing bgp network add network=2606:1c80::/64 synchronize=no ;; server LAN, advertised from edge ;; existing add network=2606:1c80::/32 stays — the upstream-facing aggregate ``` ### core (loopback `:10::253`, tower /44 `1400::/44`) ```rsc /ipv6 address add address=2606:1c80:0:10::253/128 interface=lo advertise=no add address=2606:1c80:0:11::2/64 interface=ether3-edge-direct add address=2606:1c80:0:12::1/64 interface=ether5-climax add address=2606:1c80:0:13::1/64 interface=ether4-newhope add address=2606:1c80:0:14::1/64 interface=ether1-982-60ghz add address=2606:1c80:0:15::1/64 interface=ether6-culleoka-11ghz add address=2606:1c80:1400::1/64 interface=vlan10_combo1 ;; 380 mgmt LAN /ipv6 pool add name=core-cust-pd-1 prefix=2606:1c80:1401::/48 prefix-length=56 /routing bgp network add network=2606:1c80:1400::/44 synchronize=no ``` ### verona (loopback `:10::101`, towers verona `1000::/44` + altoga `1500::/44`) ```rsc /ipv6 address add address=2606:1c80:0:10::101/128 interface=lo advertise=no add address=2606:1c80:0:20::1/64 interface=ether3-climax-11ghz add address=2606:1c80:1000::1/64 interface=verona ;; verona mgmt LAN add address=2606:1c80:1500::1/64 interface=ether6-switch ;; altoga mgmt LAN /ipv6 pool add name=verona-cust-pd-1 prefix=2606:1c80:1001::/48 prefix-length=56 add name=altoga-cust-pd-1 prefix=2606:1c80:1501::/48 prefix-length=56 /ppp profile set [find name=pppoe-verona] remote-ipv6-prefix-pool=verona-cust-pd-1 \ dhcpv6-pd-pool=verona-cust-pd-1 set [find name=pppoe-altoga] remote-ipv6-prefix-pool=altoga-cust-pd-1 \ dhcpv6-pd-pool=altoga-cust-pd-1 /routing bgp network add network=2606:1c80:1000::/44 synchronize=no add network=2606:1c80:1500::/44 synchronize=no ``` ### climax (loopback `:10::102`, /44 `1100::/44`) ```rsc /ipv6 address add address=2606:1c80:0:10::102/128 interface=lo advertise=no add address=2606:1c80:0:20::2/64 interface=ether6-verona-11ghz add address=2606:1c80:0:21::1/64 interface= add address=2606:1c80:0:12::2/64 interface= add address=2606:1c80:1100::1/64 interface=climax-bridge /ipv6 pool add name=climax-cust-pd-1 prefix=2606:1c80:1101::/48 prefix-length=56 /routing bgp network add network=2606:1c80:1100::/44 synchronize=no ``` ### Other towers Same template — substitute loopback, /44, interface names from each router's `.rsc`, and the matching P2P /64: | Router | Loopback | /44 | First customer pool prefix | Mgmt LAN /64 | |-----------|-----------------------|----------------------|----------------------------|------------------------| | culleoka | `2606:1c80:0:10::104` | `2606:1c80:1600::/44`| `2606:1c80:1601::/48` | `2606:1c80:1600::1/64` | | newhope | `2606:1c80:0:10::108` | `2606:1c80:1800::/44`| `2606:1c80:1801::/48` | `2606:1c80:1800::1/64` | | lowry | `2606:1c80:0:10::109` | `2606:1c80:1900::/44`| `2606:1c80:1901::/48` | `2606:1c80:1900::1/64` | | 982 | `2606:1c80:0:10::110` | `2606:1c80:1300::/44`| `2606:1c80:1301::/48` | `2606:1c80:1300::1/64` | | 494 | `2606:1c80:0:10::111` | `2606:1c80:1A00::/44`| `2606:1c80:1A01::/48` | `2606:1c80:1A00::1/64` | --- ## Verification checklist (per router, post-apply) ```rsc :put [/ipv6 address print] :put [/ipv6 route print where active] :put [/routing ospf-v3 neighbor print] :put [/routing bgp peer print where remote-address~"2606:1c80"] /ping 2606:1c80:0:10::254 count=3 src-address=2606:1c80:0:10:: /ping 2606:4700:4700::1111 count=3 ;; Cloudflare, end-to-end ``` End-to-end CPE test: connect a known PPPoE customer, verify a `/56` is delegated, verify SLAAC inside the first `/64` of that /56 reaches `2606:4700:4700::1111`. --- ## Allocation registry (keep this updated) | Prefix | Tower / purpose | First allocated | Notes | |-------------------------|-----------------|-----------------|-----------------------------| | `2606:1c80::/64` | core servers | 2026-05-08 | global server LAN at 380 — static only, no RA | | `2606:1c80::/48` | infra | 2026-05-08 | servers/loopbacks/P2P/transit | | `2606:1c80:0:10::/64` | router loopbacks | 2026-05-08 | one /128 per router | | `2606:1c80:1000::/44` | verona | 2026-05-08 | 3 840 /56 customer capacity | | `2606:1c80:1100::/44` | climax | 2026-05-08 | | | `2606:1c80:1300::/44` | 982 | 2026-05-08 | | | `2606:1c80:1400::/44` | core (380) | 2026-05-08 | | | `2606:1c80:1500::/44` | altoga | 2026-05-08 | served from verona router | | `2606:1c80:1600::/44` | culleoka | 2026-05-08 | | | `2606:1c80:1800::/44` | newhope | 2026-05-08 | | | `2606:1c80:1900::/44` | lowry | 2026-05-08 | | | `2606:1c80:1A00::/44` | 494 | 2026-05-08 | | --- ## Per-router migration commands Two phases per router: **WIPE** (remove all stale internal v6 config — loopbacks, transit, tower LANs, OSPFv3, internal iBGP, customer pools) then **APPLY** (configure exactly per the plan above). External eBGP peerings (Charter/Spectrum, both v4 and v6) and the existing `2606:1c80::/32` aggregate on edge are preserved by filtering the wipe commands on `name=` and `network=`. **The v4 control plane is never touched.** Apply order: **edge → core → verona → climax → 494 → 982 → culleoka → newhope → lowry**. Altoga sits on the verona router so it gets configured during verona's APPLY. Bring up edge first so the iBGP target loopback exists when each tower comes online. ### WIPE (run on every router; same script everywhere) ```rsc # ---- v6 wipe — removes everything internal, leaves external peerings alone /ipv6 address remove [find !dynamic] /ipv6 nd prefix remove [find] /ipv6 nd remove [find !default] /ipv6 dhcp-server remove [find] /ipv6 dhcp-server option remove [find] /ipv6 dhcp-client remove [find] /ipv6 pool remove [find] /ipv6 route remove [find !dynamic] /ipv6 firewall filter remove [find] /ipv6 firewall mangle remove [find] /ipv6 firewall raw remove [find] /ppp profile set [find] remote-ipv6-prefix-pool="" dhcpv6-pd-pool="" /routing ospf-v3 interface remove [find] /routing ospf-v3 instance remove [find] # internal iBGP only — leave external eBGP peers (twc, twc-v6) alone /routing bgp peer remove [find name~"ibgp" and address-families~"ipv6"] # v6 BGP networks — leave the upstream-facing 2606:1c80::/32 aggregate /routing bgp network remove [find network~":" and network!="2606:1c80::/32"] ``` ### Common firewall + IGP baseline (run on every router AFTER its WIPE) ```rsc # ---- v6 firewall: input + forward minimum, mirrors v4 hygiene /ipv6 firewall filter add chain=input action=accept connection-state=established,related add chain=input action=accept protocol=icmpv6 add chain=input action=accept src-address=fe80::/10 add chain=input action=accept src-address=2606:1c80::/32 comment="internal" add chain=input action=drop comment="default deny" add chain=forward action=accept connection-state=established,related add chain=forward action=accept protocol=icmpv6 hop-limit=equal:1 comment="PMTUD" add chain=forward action=accept protocol=icmpv6 add chain=forward action=accept src-address=2606:1c80::/32 comment="v6 outbound (all vntx sources)" add chain=forward action=drop comment="default deny" # ---- OSPFv3 (router-id = v4 loopback) /routing ospf-v3 instance add name=default-v3 router-id= redistribute-connected=as-type-1 # OSPFv3 interfaces are added per-router in each APPLY block below ``` ### edge — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::254/128 interface=lo advertise=no add address=2606:1c80:0:11::1/64 interface=sfp-sfpplus7-core-direct add address=2606:1c80:0:1002::1/64 interface=sfp-sfpplus11-preseem add address=2606:1c80::1/64 interface=vlan9_sfpplus8 ;; server LAN /ipv6 nd add interface=vlan9_sfpplus8 disabled=no advertise=no \ managed-address-configuration=no other-configuration=no /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.254 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=sfp-sfpplus7-core-direct network-type=point-to-point # eBGP TWC v6 peer is preserved by the wipe — do NOT re-add it here. # /routing bgp network keeps the existing 2606:1c80::/32. Add the server /64: /routing bgp network add network=2606:1c80::/64 synchronize=no comment="server LAN, originated by edge" ``` ### core — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::253/128 interface=lo advertise=no add address=2606:1c80:0:11::2/64 interface=ether3-edge-direct add address=2606:1c80:0:12::1/64 interface=ether5-climax add address=2606:1c80:0:13::1/64 interface=ether4-newhope add address=2606:1c80:0:14::1/64 interface=ether1-982-60ghz add address=2606:1c80:0:15::1/64 interface=ether6-culleoka-11ghz add address=2606:1c80:1400::1/64 interface=vlan10_combo1 ;; 380 mgmt LAN /ipv6 pool add name=core-cust-pd-1 prefix=2606:1c80:1401::/48 prefix-length=56 /ppp profile set [find name=380] remote-ipv6-prefix-pool=core-cust-pd-1 \ dhcpv6-pd-pool=core-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.253 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether3-edge-direct network-type=point-to-point add area=backbone interface=ether5-climax network-type=point-to-point add area=backbone interface=ether4-newhope network-type=point-to-point add area=backbone interface=ether1-982-60ghz network-type=point-to-point add area=backbone interface=ether6-culleoka-11ghz network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1400::/44 synchronize=no ``` ### verona — APPLY (also configures altoga) ```rsc /ipv6 address add address=2606:1c80:0:10::101/128 interface=lo advertise=no add address=2606:1c80:0:20::1/64 interface=ether3-climax-11ghz add address=2606:1c80:1000::1/64 interface=verona ;; verona mgmt LAN add address=2606:1c80:1500::1/64 interface=ether6-switch ;; altoga mgmt LAN /ipv6 pool add name=verona-cust-pd-1 prefix=2606:1c80:1001::/48 prefix-length=56 add name=altoga-cust-pd-1 prefix=2606:1c80:1501::/48 prefix-length=56 /ppp profile set [find name=pppoe-verona] remote-ipv6-prefix-pool=verona-cust-pd-1 \ dhcpv6-pd-pool=verona-cust-pd-1 set [find name=pppoe-altoga] remote-ipv6-prefix-pool=altoga-cust-pd-1 \ dhcpv6-pd-pool=altoga-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.101 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether3-climax-11ghz network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1000::/44 synchronize=no add network=2606:1c80:1500::/44 synchronize=no ``` ### climax — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::102/128 interface=lo advertise=no add address=2606:1c80:0:12::2/64 interface=ether4-380-airfiber24 add address=2606:1c80:0:17::1/64 interface=ether5-494 add address=2606:1c80:0:20::2/64 interface=ether6-verona-11ghz add address=2606:1c80:0:21::1/64 interface=ether3-culleoka-11ghz add address=2606:1c80:1100::1/64 interface=climax-bridge /ipv6 pool add name=climax-cust-pd-1 prefix=2606:1c80:1101::/48 prefix-length=56 /ppp profile set [find name=pppoe] remote-ipv6-prefix-pool=climax-cust-pd-1 \ dhcpv6-pd-pool=climax-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.102 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether4-380-airfiber24 network-type=point-to-point add area=backbone interface=ether5-494 network-type=point-to-point add area=backbone interface=ether6-verona-11ghz network-type=point-to-point add area=backbone interface=ether3-culleoka-11ghz network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1100::/44 synchronize=no ``` ### 494 — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::111/128 interface=lo advertise=no add address=2606:1c80:0:17::2/64 interface=ether2-climax add address=2606:1c80:1A00::1/64 interface=494 ;; 494 mgmt LAN /ipv6 pool add name=494-cust-pd-1 prefix=2606:1c80:1A01::/48 prefix-length=56 /ppp profile set [find name=pppoe] remote-ipv6-prefix-pool=494-cust-pd-1 \ dhcpv6-pd-pool=494-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.111 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether2-climax network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1A00::/44 synchronize=no ``` ### 982 — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::110/128 interface=lo advertise=no add address=2606:1c80:0:14::2/64 interface=ether7-380 add address=2606:1c80:1300::1/64 interface=982 ;; 982 mgmt LAN /ipv6 pool add name=982-cust-pd-1 prefix=2606:1c80:1301::/48 prefix-length=56 /ppp profile set [find name=pppoe] remote-ipv6-prefix-pool=982-cust-pd-1 \ dhcpv6-pd-pool=982-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.110 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether7-380 network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1300::/44 synchronize=no ``` ### culleoka — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::104/128 interface=lo advertise=no add address=2606:1c80:0:15::2/64 interface=ether6-380-11ghz add address=2606:1c80:0:21::2/64 interface=ether1-climax-11ghz add address=2606:1c80:1600::1/64 interface=mgmt ;; culleoka mgmt LAN /ipv6 pool add name=culleoka-cust-pd-1 prefix=2606:1c80:1601::/48 prefix-length=56 /ppp profile set [find name=pppoe] remote-ipv6-prefix-pool=culleoka-cust-pd-1 \ dhcpv6-pd-pool=culleoka-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.104 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether6-380-11ghz network-type=point-to-point add area=backbone interface=ether1-climax-11ghz network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1600::/44 synchronize=no ``` ### newhope — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::108/128 interface=lo advertise=no add address=2606:1c80:0:13::2/64 interface=ether2-380 add address=2606:1c80:0:18::1/64 interface=ether6-lowrycrossing add address=2606:1c80:1800::1/64 interface=newhope ;; newhope mgmt LAN /ipv6 pool add name=newhope-cust-pd-1 prefix=2606:1c80:1801::/48 prefix-length=56 /ppp profile set [find name=newhope] remote-ipv6-prefix-pool=newhope-cust-pd-1 \ dhcpv6-pd-pool=newhope-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.108 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether2-380 network-type=point-to-point add area=backbone interface=ether6-lowrycrossing network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1800::/44 synchronize=no ``` ### lowry — APPLY ```rsc /ipv6 address add address=2606:1c80:0:10::109/128 interface=lo advertise=no add address=2606:1c80:0:18::2/64 interface=ether1-newhope add address=2606:1c80:1900::1/64 interface=lowrycrossing ;; lowry mgmt LAN /ipv6 pool add name=lowry-cust-pd-1 prefix=2606:1c80:1901::/48 prefix-length=56 /ppp profile set [find name=pppoe] remote-ipv6-prefix-pool=lowry-cust-pd-1 \ dhcpv6-pd-pool=lowry-cust-pd-1 /routing ospf-v3 instance add name=default-v3 router-id=10.254.254.109 redistribute-connected=as-type-1 /routing ospf-v3 interface add area=backbone interface=lo passive=yes add area=backbone interface=ether1-newhope network-type=point-to-point /routing bgp peer add address-families=ipv6 name=ibgp-edge \ remote-address=2606:1c80:0:10::254 remote-as=393837 \ update-source=lo multihop=yes /routing bgp network add network=2606:1c80:1900::/44 synchronize=no ``` ### Final verification (run from any tower after all APPLY blocks) ```rsc :put [/ipv6 address print] :put [/ipv6 route print where active] :put [/routing ospf-v3 neighbor print] :put [/routing bgp peer print where remote-address~"2606:1c80"] /ping 2606:1c80:0:10::254 count=3 ;; edge loopback (target of all iBGP) /ping 2606:1c80::20 count=3 ;; primary DNS in the new server LAN /ping 2606:4700:4700::1111 count=3 ;; Cloudflare end-to-end ```