# 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 `1<oct-hex>0`, 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=<v4-loopback> redistribute-connected=as-type-1

/routing ospf-v3 interface
add area=backbone interface=<each-transit-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=<v4-loopback>

/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=<tower>-cust-pd-1 prefix=2606:1c80:NNN1::/48 prefix-length=56

/ppp profile
set [find name=<pppoe-profile>] \
    remote-ipv6-prefix-pool=<tower>-cust-pd-1 \
    dhcpv6-pd-pool=<tower>-cust-pd-1

/ipv6 dhcp-server
add name=<tower>-pd interface=<tower-bridge> \
    address-pool=<tower>-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=<mgmt-bridge> advertise=yes

/ipv6 nd
add interface=<mgmt-bridge> ra-interval=3m20s-10m \
    other-configuration=yes managed-address-configuration=no
/ipv6 nd prefix
add interface=<mgmt-bridge> prefix=2606:1c80:NNN0::/64 \
    autonomous=yes on-link=yes
/ipv6 dhcp-server
add interface=<mgmt-bridge> name=<tower>-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=<climax-culleoka-11ghz>
add address=2606:1c80:0:12::2/64 interface=<climax-core-link>
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::<self-last-hextet>
/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=<v4-loopback> 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
```
