Roll out AT&T IPv6
Wrangling AT&T IPv6 with Mikrotik
Understanding how prefix delegation, Router Advertisements (RA), Neighbor Discovery (ND), and
stateful firewalling interact is critical for a solid IPv6 deployment.
Goal:
This post walks through an IPv6 rollout using AT&T Internet (a non-SLA service behind an AT&T RG)
routed through a MikroTik CCR2004-16G-2S+ running RouterOS v7.20.
Unlike a Spectrum deployment which hands out generous /56 prefixes. AT&T
delegates a single /64. Yep. A single measly /64. Needlessly stingy imo, but we can still work with that.
Solution:
How to set it up and secure isolated IPv6 connectivity for a single Windows "test" VM.
1. Network Topology
- ISP: AT&T Business Internet (non-SLA)
- Upstream Edge: AT&T Residential Gateway (RG)
- Core Router: MikroTik CCR2004-16G-2S+ (RouterOS 7.20)
- CCR WAN Interface: ether1_untrust
- CCR LAN Bridge: bridge_ipv6
- CCR Physical Port: ether16_ipv6
- Hypervisor: Microsoft Hyper-V host running a Windows VM
ether16_ipv6 is assigned to bridge_ipv6 and patches directly into a dedicated Hyper-V virtual switch isolated from hypervisor management.
2. Requesting the Prefix
Configure the IPv6 client to request an IPv6 prefix on the WAN interface:/ipv6 dhcp-client:
add interface=ether1_untrust \
request=prefix \
pool-name=att_pd \
pool-prefix-length=64 \
add-default-route=yes \
accept-prefix-without-address=yesIPv6 Client Breakdown
request=prefix: Requests DHCPv6 Prefix Delegation (IA_PD).pool-name=att_pd: Populates a dynamic IPv6 address pool in RouterOS namedatt_pd.pool-prefix-length=64: Controls the subnet block size RouterOS carves out of the pool for downstream interfaces (it does not control what size the ISP gives you).accept-prefix-without-address=yes: Accepts a delegated prefix even if AT&T doesn't hand out an IA_NA non-temporary address on WAN.add-default-route=yes: Installs an IPv6 default route via the DHCPv6 client mechanism.
Verifying the Binding
Run the print command to check client state:
/ipv6 dhcp-client print detailExpected bound output:
interface=ether1_untrust status=bound dhcp-server-v6=fe80::3aa0:67ff:fe81:d662
request=prefix pool-name=att_pd pool-prefix-length=64
prefix=2600:1700:1335:452f::/64Note: /64 is the smallest routable subnet. This limits our options:
- IPv6 DHCP server to dynamically distribute addresses from the att pd pool.
- IPv6 SLAAC that dynamically assign addresses based on MAC address.
- Routing outside the single /64 LAN with Unique Local Address (ULA) prefixes. It's conceptually similar to using private IPv4 ranges.
Note, ULAs are not used for this lab exercise.
3. Assign the PD to the LAN Bridge
Bind the /64 to the bridge interface:
/ipv6 address
add interface=bridge_ipv6 \
from-pool=att_pd \
advertise=yesThis process keeps service running in the even the ISP changes the dynamic prefix assignment. It does not interfere with specific LAN configuration.
Verify the binding:
/ipv6 address print2600:1700:1335:452f::/64 FROM-POOL=att_pd INTERFACE=bridge_ipv6 ADVERTISE=yesCaution: RouterOS displays the network address default (without an explicit EUI-64 or interface ID suffix) for pool assignments. If you want to ping the router's interface directly (e.g., :: 1), explicitly bind that ID to an interface:
/ipv6 address add interface=bridge-lan pool=att pd eui-64 =:: 1
It's like a dynamic and static address, all rolled into one!
4. Router Advertisements (RA) & SLAAC
Unlike IPv4, IPv6 clients can auto-configure using Stateless Address Autoconfiguration (SLAAC). The router advertises the prefix via Neighbor Discovery, and downstream endpoints build their own interface addresses.
Configure ipv6 nd for the bridge:
/ipv6 nd
add interface=bridge_ipv6 \
advertise-dns=yes \
managed-address-configuration=no \
other-configuration=noCheck your existing ND settings first (/ipv6 nd print detail). RouterOS includes a default *all entry. Always verify your effective ND configuration so you don't accidentally spit Router Advertisements back out ether1_untrust toward the AT&T RG.
DNS Advertisements (RDNSS)
Windows natively supports DNS advertisement learned from RAs. Configure RDNSS options to your preferred resolvers:
/ipv6 nd
set [find where interface=bridge_ipv6] \
dns=2001:4860:4860::8888,2001:4860:4860::8844 \
advertise-dns=yes
Note: All devices do not natively support RDNSS. For example Android or Xbox devices may require
dual-stack and use IPv4 DNS servers for their IPv6 name resolution. Plan accordingly.
5. Neighbor Discovery Mechanics: A Quick Refresher
IPv4 discover neighbors using network broadcasts (e.g., ARP). IPv6 changes the traditional model. Instead, it uses multicast and ICMPv6-based Neighbor Discovery Protocol (NDP).
+-----------------------------------------------------------------------+
| ROUTER DISCOVERY |
| |
| [ Windows VM ] --- (Type 133: Router Solicitation) ---> [ ff02::2 ] |
| [ Windows VM ] <--- (Type 134: Router Advertisement) -- [ MikroTik ]|
+-----------------------------------------------------------------------+
| ADDRESS RESOLUTION |
| |
| [ Windows VM ] --- (Type 135: Neighbor Solicitation) -> [ Sol-Node ]|
| [ Windows VM ] <--- (Type 136: Neighbor Advertisement) -- [ Target ]|
+-----------------------------------------------------------------------+- Router Discovery (Types 133 / 134): Endpoints multicast a Router Solicitation (RS) to
ff02::2(all-routers). The router replies with a Router Advertisement (RA) toff02::1(all-nodes) containing default routes, MTU, lifetimes, and prefixes. - Address Resolution (Types 135 / 136): Replaces ARP. Uses Neighbor Solicitations (NS) directed to a Solicited-Node Multicast Address (
ff02::1:ffXX:XXXX) derived from the target IP, drastically cutting broadcast noise across the switch fabric.
The CCR handles WAN-side NDP to the AT&T gateway automatically over link-local addresses (fe80 :: /10). You do not need manual static neighbor entries on WAN.
6. Hardening IPv6
IPv6 GUAs expose all devices directly to the Internet. At minimum, stateful firewall policies on the WAN interface are absolutely critical:
Input Chain (Protecting RouterOS)
/ipv6 firewall filter
add chain=input action=accept connection-state=established,related comment="Accept established/related"
add chain=input action=drop connection-state=invalid comment="Drop invalid"
add chain=input action=accept protocol=icmpv6 comment="Accept essential ICMPv6"
add chain=input action=accept in-interface=ether1_untrust protocol=udp src-port=547 dst-port=546 comment="Allow DHCPv6 reply from RG"
add chain=input action=accept in-interface-list=trust comment="Allow trusted management"
add chain=input action=drop in-interface=ether1_untrust comment="Drop all other unsolicited WAN input"Forward Chain (Protecting the LAN)
/ipv6 firewall filter
add chain=forward action=accept connection-state=established,related comment="Accept established/related"
add chain=forward action=drop connection-state=invalid comment="Drop invalid"
add chain=forward action=accept protocol=icmpv6 comment="Allow ICMPv6 pass-through"
add chain=forward action=accept in-interface=bridge_ipv6 out-interface=ether1_untrust comment="Allow test LAN outbound"
add chain=forward action=drop in-interface=ether1_untrust out-interface=bridge_ipv6 comment="Block unsolicited WAN to LAN"Note: Allow Link-Local Traffic on the WAN. It sounds risky. Consider what this RAW rule does:
# DO NOT USE THIS RULE
/ipv6 firewall raw
add chain=prerouting action=drop in-interface=ether1_untrust src-address=fe80::/10Result: Protocol collapse.
Legitimate IPv6 control traffic (e.g., RAs, Neighbor Discovery, DHCPv6-PD, etc.) relies entirely on fe80:: /10 source addresses. IPv6 traffic between the WAN interface and the upstream AT&T gateway breaks without link-local communication.
7. Validate
From the Windows test VM, confirm full auto-configuration:
ipconfig /allCheck for:
- Valid
fe80::link-local address. - Valid global IPv6 address matching the AT&T delegated
/64. - Default gateway set to the MikroTik’s link-local WAN/Bridge IPv6 address.
- RDNSS-assigned DNS resolvers.
Run diagnostics:
:: Test ICMP Reachabilityping -6 2001:4860:4860::8888:: Test DNS Resolutionnslookup google.com 2001:4860:4860::8888:: Trace Routetracert -6 2001:4860:4860::8888
9. Troubleshooting
During testing, I ran into an intermittent service disruption:
- The test VM could ping the local bridge and the internal interface of the AT&T RG.
- Outbound packets were captured exiting
ether1_untrust. - Public IPv6 traffic completely died. Replies never returned from the upstream AT&T network.
- Temporarily setting the IPv6 firewall to
action=acceptacross all chains did not resolve the issue.
The Fix
Manually renewing the DHCPv6 client in RouterOS (/ipv6 dhcp-client renew 0) immediately restored outbound connectivity. RouterOS re-bound to the exact same prefix, but the AT&T RG instantly resumed forwarding outbound/inbound traffic across its backplane.
I could not determine if the issue was hardware or software based. The short-term band-aid requires scheduling that command to run no less than every six hours. If it seems ridiculous it's because it is. That said, I could not detect any change in service from the client side, so it does seem to work. The long-term solution requires coordinating assistance with AT&T. I would recommend they swap their router at minimum.
Root Cause Analysis
This issue points to a stale routing table or NDP state inside the AT&T gateway. The gateway maintained the DHCPv6 lease, but it dropped the underlying dynamic route or neighbor entry pointing to the CCR, until a fresh DHCPv6 exchange forced its forwarding plane to update.
Advanced DHCPv6 Client Tweaks
I tested two specific client parameters under /ipv6 dhcp-client:
use-interface-duid=yes: Forces RouterOS to generate its DUID from the WAN interface's MAC address (ether1_untrust) rather than the global router-wide base DUID. This ensures identity stability if system configuration alters internal interface numbering.allow-reconfigure=yes: Allows the DHCPv6 client to accept server-initiated reconfigure requests (RFC 3315) to trigger out-of-band renewal cycles if the upstream gateway requests it.
10. Summary
Setting up IPv6 on RouterOS v7 behind AT&T Business Internet works smoothly once the core control mechanisms are dialed in:
- Prefix Delegation vs. SLAAC: DHCPv6-PD handles the macro prefix handoff from the ISP to the CCR; SLAAC handles downstream address assignment to clients via RAs.
- Firewall Order: Build explicit stateful filtering on
forwardandinputchains. Never dropfe80::/10link-local traffic on WAN. - Dual Addressing: Combine dynamic GUAs (
from-pool) with static ULAs (fdfd::/48) to maintain internal address stability across ISP rebinds. - Watch Upstream State: AT&T residential-style gateways can occasionally freeze or drop dynamic prefix routes. A targeted DHCPv6 client renewal clears the pipe.
That's all folks!










