Network Engineering

IPv6-Only Network with NAT64/464XLAT

Running an IPv6-only local network while maintaining IPv4 internet connectivity

Laurent Goudet · February 3, 2026 · 3 min read

IPv4 addresses are running out. ARIN exhausted its free pool in September 2015. RIPE followed in November 2019. The remaining addresses are either hoarded by large organizations or traded on a secondary market at $30-50 per address. Meanwhile, mobile carriers — facing explosive device growth — needed a path forward that didn’t depend on buying more IPv4 space.

The answer was IPv6-only networks with NAT64 as the bridge. Instead of running dual-stack (maintaining both IPv4 and IPv6 in parallel, with all the operational complexity that entails), carriers like T-Mobile, Reliance Jio, and SK Telecom went IPv6-only internally and used NAT64 to translate when talking to the IPv4 internet. The internal network simplifies dramatically: one address family, one set of firewall rules, one routing table.

But IPv6-only breaks things. Legacy apps with hardcoded IPv4 addresses, protocols that embed IPs in payloads, VPN clients that assume IPv4 — all of these fail. 464XLAT solves the last mile by adding CLAT (Customer-side translator) on the device itself. This is how it all fits together.

464XLAT Architecture

IPv4 app → CLAT (IPv6) → Network → NAT64 → IPv4 Internet
📱
Legacy AppUses IPv4-only APIs
IPv4
🔄
CLATOn-device translator (eBPF)
IPv6
📡
IPv6 NetworkNo IPv4 addresses
IPv6
🌐
NAT64Router translator
IPv4
☁️
IPv4 ServerLegacy destination
IPv4 traffic
IPv6 traffic
CLAT (client-side)
NAT64 (network-side)

NAT64 Address Translation

IPv4 addresses are embedded in a special IPv6 prefix
Well-Known NAT64 Prefix: 64:ff9b::/96
8.8.8.8
64:ff9b::8.8.8.8
1.1.1.1
64:ff9b::1.1.1.1
93.184.216.34
64:ff9b::5db8:d822

The /96 prefix leaves exactly 32 bits for the IPv4 address to be embedded

DNS64: Transparent Address Synthesis

How DNS makes NAT64 work transparently for IPv6-native apps
1
Client queriesexample.com AAAA
2
DNS64 server checks: does example.com have a real AAAA record?
3
If no AAAA exists, query forexample.com A → gets 93.184.216.34
4
Synthesize AAAA by prepending NAT64 prefix →64:ff9b::5db8:d822
5
Client connects to synthesized IPv6 address; NAT64 router translates to IPv4

What Breaks on IPv6-Only

NAT64 with DNS64 handles the common case — apps that resolve hostnames via DNS. But several categories of traffic break on an IPv6-only network, and understanding them explains why CLAT exists.

Hardcoded IPv4 literals. Any app that connects directly to an IP address (not a hostname) bypasses DNS64 entirely. Game clients, IoT firmware, and legacy enterprise software are common offenders. CLAT intercepts these IPv4 packets at the device level and translates them to IPv6 before they hit the network.

Protocols that embed addresses in payloads. SIP (VoIP) and FTP active mode put IP addresses inside the application-layer data. A NAT64 gateway translates packet headers but not payloads, so these protocols see stale IPv4 addresses and fail. Application-level gateways (ALGs) can help, but they add complexity and often lag behind protocol updates.

VPNs and peer-to-peer. IPsec and WireGuard tunnels typically expect an IPv4 inner address. Peer-to-peer apps that exchange IP addresses out-of-band (WebRTC ICE candidates, BitTorrent) also struggle. The CLAT’s virtual IPv4 interface solves most VPN scenarios; P2P generally requires dual-stack or protocol-level IPv6 support.

Where Translation Happens

CLAT handles legacy apps, DNS64/NAT64 handles everything else

NAT64 + DNS64 (Network-side)

  • Runs on the router/gateway
  • Works for all IPv6-capable apps
  • Requires DNS64 for transparent operation
  • One translator serves entire network
  • Apps using DNS work automatically

CLAT (Client-side)

  • Runs on the end device
  • Handles apps using hardcoded IPv4
  • Creates a virtual IPv4 interface
  • Uses eBPF for efficient packet rewriting
  • Recently added to NetworkManager (Linux)

Practical Deployment

Home lab and small networks. Tayga and Jool are the two main open-source NAT64 implementations for Linux. Tayga is simpler (userspace, TUN-based); Jool is faster (kernel module, supports stateful and stateless modes). Pair either with a DNS64-capable resolver like BIND or Unbound, and you have a working IPv6-only network with IPv4 internet access.

Mobile carriers at scale. T-Mobile’s IPv6-only deployment covers hundreds of millions of devices. Android has included CLAT since version 4.3 (2013), and iOS uses its own implementation transparently. The network-side NAT64 runs on carrier-grade hardware with stateful tracking of millions of simultaneous translations.

Enterprise. Organizations with large IPv4 allocations face increasing costs as addresses appreciate. Migrating internal networks to IPv6-only with NAT64 at the edge eliminates the need for internal IPv4 addressing. The operational savings — one address plan, one set of ACLs, no NAT44 — often justify the migration effort within a year.

464XLAT is widely deployed by mobile carriers (T-Mobile, etc.) to conserve IPv4 addresses.


Android has supported CLAT since Android 4.3. Linux NetworkManager support landed in 2024.

Frequently Asked Questions

Why run IPv6-only instead of dual-stack?

Dual-stack doubles your operational surface: two sets of firewall rules, two address plans, two failure modes. IPv6-only with NAT64 eliminates IPv4 from the internal network entirely, simplifying management. Carriers like T-Mobile and Reliance Jio moved to IPv6-only because it also conserves scarce IPv4 addresses — ARIN exhausted its free pool in 2015, RIPE in 2019.

What breaks when you remove IPv4, and how does 464XLAT fix it?

Apps with hardcoded IPv4 literals (socket calls to 10.0.0.1), protocols that embed IP addresses in payloads (SIP, FTP active mode), and VPN clients expecting IPv4 interfaces all break on IPv6-only networks. 464XLAT solves this by running CLAT on the device, which creates a virtual IPv4 interface — legacy apps see IPv4 while the network runs pure IPv6.

How does DNS64 make NAT64 transparent to applications?

When an app queries a hostname and the target only has an A record (IPv4), DNS64 synthesizes a fake AAAA record by embedding the IPv4 address in the NAT64 prefix (64:ff9b::/96). The app connects to this synthetic IPv6 address, and the NAT64 gateway translates back to IPv4 on the wire. The app never knows IPv4 was involved.

Who uses NAT64 in production?

Mobile carriers like T-Mobile deploy NAT64/464XLAT at scale. Android has supported CLAT since Android 4.3, and Linux NetworkManager added support in 2024.

Laurent Goudet

CTO at Freelancer.com

AI agents, networking, and infrastructure at scale

Other deep-dives

© 2026 Laurent Goudet · Bordeaux, France · lepro.dev

vd9714f4