Internet-Draft deploying-ipv6-data-center September 2026
Martin & Tiesel Expires 28 March 2027 [Page]
Workgroup:
IPv6 Operations
Internet-Draft:
draft-martin-deploying-ipv6-data-center-04
Published:
Intended Status:
Informational
Expires:
Authors:
F. Martin
Peachymango.org
P.S. Tiesel
SAP SE

Deploying IPv6 in Data Centers

Abstract

Data center operators are moving toward IPv6-only operation to simplify addressing, restore end-to-end connectivity, and meet operator and government timelines. Much published IPv6 guidance targets network engineers; this document instead addresses Site Reliability Engineers (SREs) and Software Engineers (SWEs) who deploy, operate, and debug services in operator-owned data centers. It is organized in four parts --- migration strategies, building the data center, tools and best practices, and pitfalls --- with IPv6 fundamentals as an appendix. It documents common software and infrastructure gaps and offers practical deployment patterns aligned with the IPv6 Operations (v6ops) working group charter.

About This Document

This note is to be removed before publishing as an RFC.

The latest revision of this draft can be found at https://github.com/franckhlmartin/ietf-draft-deploying-ipv6-data-center/. An HTML editor's copy is at https://franckhlmartin.github.io/ietf-draft-deploying-ipv6-data-center/draft-martin-deploying-ipv6-data-center.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-martin-deploying-ipv6-data-center/.

Discussion of this document takes place on the v6ops Working Group mailing list (mailto:v6ops@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/v6ops/. Subscribe at https://www.ietf.org/mailman/listinfo/v6ops/.

Source for this draft and an issue tracker can be found at https://github.com/franckhlmartin/ietf-draft-deploying-ipv6-data-center.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."

This Internet-Draft will expire on 28 March 2027.

▲

Table of Contents

1. Introduction

1.1. Audience and Purpose

This document is written for Site Reliability Engineers (SREs) and Software Engineers (SWEs) who run services in data centers --- not primarily for network engineers designing routing policy. Network teams still own prefixes, routing, and firewalls, but IPv6 deployment succeeds or fails in application code, configuration management, monitoring pipelines, and the long tail of enterprise software that assumes IPv4. It also fails when the work is unscheduled against competing priorities, or when security and network teams meet the design only at cutover (see Section 2.3).

Scope: The primary audience runs services on infrastructure the organization owns or directly controls --- operator-managed networks, prefixes, routing, firewalls, and bare-metal or virtualized hosts in physical or private data centers. This document does not prescribe how to deploy IPv6 natively inside third-party Infrastructure-as-a-Service (IaaS) platforms (public cloud VPCs, provider-managed Kubernetes, and similar). Each cloud provider imposes its own addressing models, quotas, APIs, and processes; the deployer is constrained by those platform choices in ways this draft cannot generalize. Operators with hybrid estates SHOULD still understand cloud IPv6 gaps and connectivity limits (see Section 2.6) because those constraints often determine whether an on-premise IPv6-only program can succeed.

1.3. Document Structure

This document is organized by audience job --- strategy, then build, then tools, then pitfalls --- rather than by protocol layer or a single linear migration playbook. Overlapping themes (for example internal vs external scope in Section 3.5 and Section 2.2) appear where each audience needs them; sections cross-link rather than repeat editorially. IPv6 fundamentals for software engineers (Appendix A) sit as an appendix at the end for shared vocabulary; they are not the linear starting chapter.

Part I --- Migration Strategies (Section 2): scoping IPv6-only programs, programme sponsorship and early procurement (Section 2.3, Section 2.3.1), inventory and metrics (Section 2.4), hybrid on-premise and cloud (Section 2.6), and noticeable IPv4 friction (Section 2.7) --- define policy and measurement before bulk technical change.

Part II --- Building the IPv6 Data Center: addressing and host/container provisioning (Section 3.1 and related subsections), plus progress metrics that show dual-stack or IPv6-only adoption in the fabric.

Part III --- Tools & Best Practices: developer and pre-production environments (Section 4.1), IPv6-only jump hosts (Section 4.2), network diagnostics (Section 4.3), and tracking application readiness (Section 4.4).

Part IV --- Pitfalls: out-of-band management (Section 5.1), DNS registration (Section 5.2), ICMPv6 and PMTUD (Section 5.3), and application-layer traps --- localhost (Section 5.4), name resolution (Section 5.5), client-side load balancing (Section 5.7), address storage, and language runtimes.

Reading paths by role:

  • Program lead / engineering manager: Part I first (including Section 2.3, Section 2.3.1, and Section 2.5), then skim Parts II and III as overview.
  • Business sponsor / security lead: Section 2.3, Section 2.5, Section 5.3, then Security Considerations.
  • Network / DC infrastructure engineer: Part II addressing, then Part IV on OOB, DNS registration, and ICMPv6/PMTUD; consult Appendix A when vocabulary is needed.
  • SRE/SWE engineer: Part I Section 2.4, Part III tools and readiness tracking, then Part IV application pitfalls; consult Appendix A when vocabulary is needed.
  • Full migration owner: linear --- Parts I through IV, then Security Considerations, with Appendix A as reference.

1.4. Requirements Language

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

2. Part I: Migration Strategies

This section underlines one uncomfortable truth: The hardest challenges on the way to IPv6 (only) are organizational issues and incentivization. Thus, it provides guidance how to pick and slice candidates for a migration to IPv6 only and how to structure such a migration effort.

While it makes sense to roll out dual stack and IPv6 mostly in breadth for access networks, a clear scope is essential for the success of IPv6 only project. Depending on the organizational structure and experience with IPv6, the scope should be limited to a manageable size like a application landscape, platform instance or data center.

2.1. Reasons to start IPv6 only Programs

In most commercial environments, IPv6 only projects over the size of a proof of concept are hard to justify from a business perspective. Therefore, the migration towards IPv6 only should be planned around other activities including, but not limited to:

  • Major hardware replacements,
  • Data center builds or expansions,
  • Re-platforming of applications or infrastructures,
  • Move from on-premise to the cloud (or the other way around),
  • Integration of AI workloads,
  • Introduction of zero trust networking, and
  • Containerization.

While the aforementioned projects justify to start the project, realizing them with an IPv6 only architecture provides cost savings, can improve scalability, provide growth opportunities and may benefit overall security management by reducing overall complexity, and allowing end-to-end audition of data flows. Especially if such activities require costly IPv4 numbering re-architecture or acquisition of IPv4 address space, a cost benefit analysis will likely be in favour of an IPv6-only architecture.

2.2. Easier to Provision Than to Transform

It is easier to provision IPv6 correctly than to transform a running service. Enabling dual-stack on a server, container, or service that was deployed IPv4-only is already a substantial change --- addresses, ACLs, DNS, health checks, and often application configuration --- then restarting in place and hoping nothing was missed. Going IPv6-only is a further step: it removes the IPv4 safety net and usually requires more of the dependency and operations stack to be ready. Both benefit from greenfield timing; they are not the same difficulty. Provisioning time already runs those checks, supports canary or phased ramp-up, and catches failures before the service takes production traffic.

Teams SHOULD treat every new service, new software version, and rewrite of an existing application as an opportunity to ship IPv6-only on internal interfaces from the start (see Section 3.5), with dual-stack only where external reachability requires it, rather than cloning an IPv4-only template and scheduling conversion later. Brownfield conversion remains necessary for legacy estates, but the default for greenfield work SHOULD NOT be "IPv4 now, IPv6 someday."

2.3. Programme Sponsorship and Stakeholders

[RFC7381] covers enterprise IPv6 deployment more broadly. This subsection is the SRE-facing minimum: who must prioritize the work and who must be in the room before the addressing plan is frozen.

Sponsorship schedules the work; escalation only unblocks it. A named business sponsor ranks IPv6 against competing quarterly work so teams can staff the migration. The same person MAY also approve IPv4-only exceptions or escalate blocked teams, but those are different decisions: sponsorship puts the programme on the plan; exception approval bounds a waiver Section 2.5; escalation clears obstruction after the work is already scheduled. Without sponsorship the programme never gets scheduled in the first place.

Treat security and the business as primary stakeholders from kickoff, not as late approval gates. Bring into the room early:

  • Security --- threat models and security policies before perimeter rule changes (see Section 5.3 and Security Considerations).
  • Network --- prefix policy and allocation lead time (see Section 3.2.1).
  • Platform / SRE --- inventory, observability, and jump-host readiness.
  • Owners of tier-1 services --- consent before a service flips to dual-stack or IPv6-only.

An IPv4-only exception process governs one artefact well; it does not replace sponsorship or early stakeholder consent.

2.3.1. Procurement and Long-Lead Hardware

Update purchase requirements, RFPs, and vendor questionnaires at program kickoff --- ideally before any production dual-stack or IPv6-only cutover --- so new acquisitions cannot quietly extend the IPv4-only lifetime of the fleet. Infrastructure and facility gear often have 10+ refresh cycles and little or no field-upgradable network stack; buying IPv4-only today can block IPv4 decommissioning long after application code is ready (see Section 5.1).

Operators SHOULD:

  • Require IPv6-only and dual-stack support for new purchases that attach to data center or management networks --- compute BMCs, switches, consoles, PDUs, environmental monitors, network time appliances (NTP or PTP, including GPS-synced stratum servers), storage appliances, and similar long-lived devices --- not only for application software.
  • Distinguish systems the organization owns or controls (and can mandate in contracts) from systems it does not (public cloud SKUs, SaaS, leased facility gear) so inventory and exception tracking cover both classes early (see Section 2.4 and Section 2.6).
  • Treat written vendor claims as necessary but insufficient: qualify candidates in a lab or acceptance network, including an IPv6-only path where practical (see Section 4.2 for IPv6-only guest or demo Wi-Fi), before production purchase or racking.

Procurement language is the contractual backup; lab "show me" testing catches products that claim IPv6 readiness and fail under operational load.

2.4. Inventory and Metrics

IPv6 migration needs inventory plus measurement: a service list with IPv6 readiness labels, automated discovery of what is missing from that list, and time-series metrics that show progress toward dual-stack or IPv6-only targets.

The inventory in Section 4.4 MUST list every application and platform component with a readiness state (for example: IPv6-only ready, dual-stack, IPv4-only, unknown). Inventory alone is not enough --- operators SHOULD run periodic discovery that compares running processes, container images, load balancer pools, and DNS names against the catalog and flags unregistered services. Shadow deployments and shared hosts routinely run software that no team has classified.

2.5. IPv4-Only Exceptions and Remediation Plans

The business will sometimes require an IPv4-only product, service, or technology --- a vendor constraint, acquisition, regulated workload, or time-to-market trade-off. Business goals matter, but IPv4-only dependency SHOULD NOT be discovered only after full production adoption, when rollback is expensive and the migration program has already assumed dual-stack or IPv6-only readiness.

Default to hard failure on missing IPv6 early in inventory, CI, dependency gates, and synthetic checks (see Section 2.4 and Section 4.4) so non-compliant software surfaces before it reaches tier-1 paths. Where IPv4-only is genuinely required, use a formal exception process --- the same discipline security teams apply to policy waivers:

  • Record the business reason for IPv4-only adoption and who approved it.
  • Require a remediation plan --- path to dual-stack, IPv6 support, or replacement --- with milestones and a target date.
  • Track progress in the same service catalog and dashboards used for migration metrics; exceptions SHOULD expire or be renewed on review, not roll forever.
  • Flag dependents so downstream teams know they are building on a known exception.

An approved exception MAY permit production use of IPv4-only software for a bounded period; it MUST NOT be an informal verbal waiver. Review open exceptions in change advisory or migration governance the same way security reviews open risk acceptances --- stale plans become blockers again when dates slip without an updated timeline.

2.6. Hybrid On-Premise and Cloud Environments

This section is in scope for operator-owned data centers that connect to public cloud; it is not a guide to replacing the data center with IaaS or to running production workloads inside provider-controlled virtual networks. Native IPv6 deployment on public cloud providers like AWS, Azure, GCP, or other IaaS platforms belongs in provider documentation or a separate document. Managed services, and control-plane IPv6 support differ by vendor, region, and SKU in ways no single recommendation can capture. The material below does matter for on-premise migration: cloud dependencies, private connectivity, and provider IPv6 gaps routinely block or reshape IPv6-only programs on operator-managed fabric even when compute stays in the physical data center.

Most enterprises are not pure on-premise: data centers connect to public cloud providers for burst capacity, managed services, disaster recovery, and SaaS integration. At the time of writing, IPv6 support across cloud control planes and managed services is incomplete --- capabilities differ by provider, region, SKU, and release.

Hybrid gap analysis belongs in Part I inventory and early program planning, not a discovery phase after the on-premise fabric is already IPv6-only, as subtile limitations can dramatically effect feasibility of architectural pattern and prevent reaching project goals on some public cloud providers.

2.6.1. Connectivity Models

Migration design depends on how on-premise reaches cloud:

  • Centralized gateway or cloud edge --- on-premise workloads reach cloud APIs and resources through a narrow path: site-to-site VPN, Direct Connect, ExpressRoute, Cloud Interconnect, transit gateway, or operator translation at the border (see Section 3.4). IPv6 may terminate at that gateway; an internal v6-only host might reach cloud only via a dual-stack hub or translation. Prefix plans, ACLs, DNS views, and observability probes must anchor on that choke point.
  • Direct or flat hybrid routing --- on-premise and cloud workloads share routable reachability (extended L3, cloud CIDRs advertised into the DC, cross-site service mesh). Any host may connect to any cloud instance on the allowed paths; IPv4 and IPv6 must both be validated end-to-end, including cloud VPC/VNet IPv6 CIDRs, security groups, network ACLs, private endpoints, and on-premise firewall policy.

Document which model each environment uses before declaring internal IPv6-only. A data center that is v6-only on the fabric but cloud-connected only through an IPv4-only VPN or private link still depends on translation or exceptions at the edge --- a common hidden blocker.

2.6.2. Cloud Provider Gap Analysis

Cloud portfolios change frequently. Operators SHOULD maintain a provider-specific IPv6 matrix for every service in use --- compute, load balancing, databases, object storage, key management, logging, identity, managed Kubernetes control planes, firewalls, WAF, PrivateLink-style endpoints, and inter-region peering --- with readiness labels and notes on region, tier, and verification date.

Label by the default client path used in production (the hostname and options the running SDK, CLI, or library uses with no extra configuration), not by a provider capability page or an alternate dual-stack endpoint that applications do not call unless reconfigured:

  • supported --- the default client path resolves and works on IPv6.
  • supported-not-default --- IPv6 exists only behind an alternate hostname, opt-in flag, or non-default region or SKU; production without that change stays on IPv4.
  • partial --- incomplete feature coverage (some APIs, regions, or SKUs), distinct from "complete but opt-in."
  • unsupported / unknown --- no usable IPv6 path, or not yet verified.

Defaults move over time; re-check on the verification-date column rather than assuming a past "supported" label still matches what clients dial today.

Where clients can use operator-controlled DNS (private zones, service discovery, or aliases under a stable convention), prefer names independent of the provider's hostname taxonomy (see Section 5.5). Publish A and AAAA (or point aliases) under that convention so application configuration does not inherit provider path quirks --- for example when one provider hostname has AAAA and a sibling default does not. Operator names are a mitigation when the client stack allows them; the matrix still records whether the provider default path is IPv6-ready.

Identify blockers early: review architecture diagrams and infrastructure-as-code for implicit IPv4 assumptions (RFC 1918-only security groups, IPv4 health checks, managed endpoints without AAAA on the default path, IPv4-only egress appliances). Open provider support cases and feature requests as soon as a required service lacks IPv6 --- enterprise cutover dates cannot wait for roadmap surprises discovered in production. Where IPv6 exists only as supported-not-default or only in select regions or SKUs, record that constraint in the inventory and use Section 2.5 when the business must stay on IPv4-only cloud paths temporarily.

2.6.3. Cloud as Platform Software

From the data center team's perspective, cloud is platform software the business cannot fully control --- APIs, quotas, and feature availability change on the provider's schedule. Apply the same discipline as Section 4.4: list each cloud dependency in the fleet inventory, assign IPv6 readiness labels, and raise gaps before platform adoption, not after teams have built on IPv4-only managed services.

Hybrid programs SHOULD include cloud account and landing-zone reviews in the same governance cadence as on-premise migration metrics (see Section 2.4). A service marked "IPv6-ready on-premise" that calls an IPv4-only cloud API, depends on a supported-not-default cloud path without the required client change, or runs on an IPv4-only managed control plane is not ready for internal v6-only operation. Treat cloud like any other long-lead vendor: inventory, support tickets, and exception tracking SHOULD start at program kickoff.

2.7. Adding Noticeable IPv4 Friction

This technique belongs in a working dual-stack environment where IPv6 is already preferred --- not during the initial dual-stack rollout, when IPv4 is still the expected path. IPv4 fallback is silent by default: Happy Eyeballs Section 5.5 and most clients succeed on IPv4 when IPv6 is slow or broken, so a deploy can undo IPv6 preference without paging anyone. Prefer observability split by address family (see Section 2.4) and correct client Happy Eyeballs behavior first.

Two related uses:

  • Culture and training (humans): on dual-stack jump hosts and similar admin paths, make IPv4 sessions obvious (for example a login banner --- see Section 4.2) so SREs and SWEs internalize that IPv6 is now preferred before the first sev-1 forces the lesson.
  • Silent regression (machines): on inter-application RPC and HTTP paths, operators MAY apply a modest delay or traffic shaping to IPv4 --- for example a few milliseconds via host or fabric QoS, or Linux tc delay on IPv4 classifiers --- so unintended IPv4 preference shows up as higher latency or lower QPS, metrics most SRE teams already watch. That is a soft failure while the estate is still dual-stack; after IPv6-only, the same breakage becomes a hard failure.

Hard blocks on IPv4 remain a last resort while production still needs IPv4 for emergencies. Treat intentional path degradation with care: it can interact poorly with client Happy Eyeballs implementations and feels like an eternity under incident pressure. On break-glass admin paths, prefer a visible signal (banner, metric regression) over multi-second delays.

The penalty MUST remain small enough that break-glass and degraded operation still succeed. Detection, not outage. This operator-applied path delay is distinct from the Happy Eyeballs IPv4 connection-attempt delay in Section 5.5, which races families at the client rather than making IPv4 worse on the wire.

3. Part II: Building the IPv6 Data Center

3.1. Internet and Data Center Addressing

Network teams assign prefixes; SREs consume them in orchestration templates, container runtimes, and firewall tickets. This section covers patterns that reduce outages during rollout.

3.2. Prefix Length and the /64 Convention

On most LANs and data center segments, the network/host split is at the 64th bit --- a /64 prefix on the wire [RFC4291]. Roughly speaking, a /64 is the IPv6 analogue of an IPv4 /24 in terms of "one subnet per broadcast domain," though the address space is vastly larger.

Operators SHOULD document their own numbering policy and growth plan (see Section 3.2.1). Based on hardware or infrastructure provider capabilities, this can manifest in different data center templates.

For example, such a template may assign a /56 per host so each container can receive its own /64, highlighting the /64 per virtual link on the host. Another variant, assigning a /64 per VLAN/link between hosts so each host can receive a fraction of it, e.g., a /80 sill leaving addressing space for further subnet division on a per container basis.

3.2.1. Prefix Allocation for Hosts and Containers

The important software lesson is an explicit prefix plan per role, sized for growth --- what receives a prefix (host, VM, container, pod, service, rack, or other role), at what length, and how those roles nest --- rather than assuming "one address per host" as in legacy IPv4 NAT designs. Operators SHOULD write that numbering policy down, then size for current inventory and plausible 10+ years growth (hosts, clusters, and sites). Request the next allocation before the last usable prefix is assigned; discovering a ceiling mid-migration turns a sizing choice into an allocation request with its own justification and lead time (the same early-case discipline as Section 2.6). The exact mapping depends on orchestrator and CNI design; the templates below are examples, not a single mandatory layout.

One template for counting /64s --- not a recommendation every estate must follow --- assigns a /56 to each physical host (or rack entity), providing 256 /64 subnets --- one /64 for the host itself and up to 255 /64 prefixes for containers, virtual machines, or pods. Under that template each container MAY receive a full /64, with routing between /64 islands instead of NAT for east-west traffic. Arithmetic follows the policy: a /56 per host exhausts a /48 at 256 hosts; larger estates need a shorter site prefix or a different per-entity size. Assigning only a /64 per host without further delegation is often insufficient when containers need SLAAC for address assignment.

Orchestrators such as Kubernetes often need several ranges (for example node, pod, and service). Whether this can be combined with a single per-host delegation depends on the orchestrators and its CNI. Common layouts either gives each node a /64 from a pod range or carve out longer-than-/64 subnets from one host prefix.

In a closed data center with explicit routing and no SLAAC on container segments, some designs assign one /64 (or longer) per physical host and carve /72 (or longer) subnets from that host prefix for containers. That /72 pattern is not suitable hosts expect standard /64 semantics; use it only with operator-wide agreement and tested CNI or orchestrator support --- do not read it as advising against ordinary orchestrator node /64s.

These patterns assume an operator-controlled data center fabric where the network team can delegate prefixes freely. In hybrid environments that connect on-premise fabric to public cloud (see Section 2.6), operators MAY choose different prefix plans so numbering stays consistent across sites. Cloud providers impose subnet sizes, delegation limits, and aggregation rules that cannot be changed from the data center alone; mirroring (or mapping cleanly to) those conventions on bare metal MAY simplify IPAM, ACLs, and runbooks even when a /56-per-host template would otherwise be preferred locally. The right trade-off depends on connectivity model, orchestrator, and how much of the estate shares addressing with cloud virtual networks. This document does not enumerate cloud or IaaS offerings; it focuses on networks the operator controls directly.

Kubernetes clusters often use eBPF-based service NAT on the node. Traditional Linux tools (ss, /proc/net/tcp) may show node-level sockets, not pod-level flows, when NAT is involved. IPv6 routing reduces NAT use --- which also reduces the complexity inherent in NAT when tracing connections --- but does not remove the need for observability hooks at the CNI layer.

3.4. Internet Egress and Edge Gateways

On IPv4 it is often convenient to give a data center host Internet access via NAT44 (or operator CGNAT) on a central device. That pattern SHOULD NOT be copied onto IPv6 hosts --- do not deploy ad hoc NAT66 or per-server masquerading so internal servers "hide" behind random IPv6 ports. Internal hosts SHOULD reach the Internet through a gateway at the edge (border router, firewall, or dedicated translation cluster) with explicit policy and logging.

That edge model still helps when an IPv6-only server must reach an IPv4-only Internet service: the server sends IPv6 to the edge; the gateway performs NAT64 or protocol translation [RFC6146] (and DNS64 where needed) on the way out. Translation is centralized, observable, and rate-limited --- not duplicated on every app host.

3.5. Internal vs External: Where IPv6-Only Applies

A practical IPv6-only data center usually means IPv6-only on internal interfaces and east-west paths, not on every interface facing the outside world. The Internet is not yet ready for an IPv6-only-only edge: clients, transit, partners, and operator tooling still expect dual-stack (or IPv4 fallback) on external interfaces --- load balancers, border routers, VPN concentrators, and customer-facing anycast fronts.

This document uses "IPv6-only," "dual-stack," and related terms informally for deployment context. For precise, testable definitions of the connectivity scenarios --- IPv4-only, dual-stack, IPv6-only with NAT64, and IPv6-only-strict (no IPv4 connectivity, encapsulated or translated) --- see [I-D.ietf-v6ops-ipv6-app-testing] and the terminology in [I-D.ietf-v6ops-ipv6-only]. Aligning verification with those scenarios keeps this deployment guidance consistent with application-side IPv6 testing.

Plan accordingly:

  • Inside the data center: servers, containers, and service-to-service traffic SHOULD move to IPv6-only (or IPv6-primary) on internal VLANs and /64 islands as readiness allows.
  • At the edge: external interfaces SHOULD remain dual-stack until IPv4 dependency is gone for your user base and upstream paths. The edge gateway performs translation when an internal IPv6-only host must reach IPv4-only destinations (see above).

Dual-home servers on the edge --- one internal interface (IPv6-only or IPv6-primary) and one external interface (dual-stack) --- simplify administration and break-glass access: operators and automation can reach management paths on the internal v6 network while the service still serves dual-stack Internet clients. Document which interface is which in IPAM and host naming; do not collapse "internal v6-only" and "external dual-stack" into a single ambiguous address on production boxes. During migration, the internal interface may remain IPv4-only for a time; see Section 3.5.1 for routing and DNS pitfalls on those hosts.

3.5.1. Dual-Homed Hosts During Internal IPv6 Rollout

Edge servers often have two interfaces: an external interface toward the Internet (dual-stack, default route) and an internal interface toward the data center (today IPv4-only, with more-specific routes for internal prefixes). That layout is common during brownfield migration before the internal VLAN gains IPv6 on every host.

When internal services begin publishing AAAA records, a dual-homed host that still has no IPv6 on the internal interface may resolve both A and AAAA for an internal name but send IPv6 connection attempts out the default route on the external interface. Those packets never reach the internal service. Symptoms include long timeouts on dual-stack clients, flaky automation, and "internal DNS works from other hosts but not from the edge box."

Operators SHOULD align routing policy with DNS, not assume AAAA implies a working IPv6 path from every interface:

  • Preferred long-term: enable IPv6 on the internal interface and install scoped routes (or policy routing) so internal GUA prefixes egress the internal interface (see Section 3.3.2).
  • Transitional mitigation: while the internal NIC remains IPv4-only, install an unreachable route for the site internal IPv6 aggregate on the host (for example, the dc-internal prefix from Section 3.3.2). The kernel then rejects connection attempts to internal AAAA addresses immediately with a local "no route to host" error instead of forwarding them via the Internet default route. Clients that iterate all resolved addresses --- or use Happy Eyeballs [RFC8305] --- can fall back to the A record over the internal IPv4 path (see Section 5.5). Do not use a blackhole route for this purpose: blackhole silently discards packets and recreates the same timeout behavior the operator is trying to avoid.
  • Border visibility: operators MAY also monitor or log at Internet or site border devices any packets destined to internal-only IPv6 aggregates that should never appear on external policy paths --- a useful signal of mis-egress during rollout. Blocking those flows at the border can help, but treat hard denies carefully in multihomed designs.
  • Alternative: split-horizon DNS so resolvers used on edge hosts do not return AAAA for names that are reachable only on the internal IPv4 path until routing is fixed.

This pattern is not a substitute for enabling IPv6 on internal interfaces; it prevents misrouted IPv6 during rollout. Application code that stops after the first address (gethostbyname(), InetAddress.getByName(), and similar) will not benefit --- fix routing and resolution behavior together.

Example (Linux, illustrative prefix):

ip -6 route add unreachable 2001:db8:dc::/48

Express the same policy in configuration management on every dual-homed edge role during the transition; remove the unreachable route when the internal interface is dual-stack and correct scoped routes are in place.

3.6. Frontends for IPv4-Only Services

Legacy applications that remain IPv4-only SHOULD NOT be exposed directly to dual-stack or IPv6-only clients. Surround them with a gateway tier --- for example nginx, HAProxy, or a service-mesh ingress --- that accepts IPv6 (and IPv4 if required) on the front side and speaks IPv4 only to the backend. Clients see a normal v6-capable service name; the IPv4-only binary stays on an internal path until it is rewritten or replaced (see Section 2.2).

In dual-stack deployments where session persistence is required, SREs MUST verify that the gateway tier preserves session continuity across both IPv4 and IPv6. Implementations that maintain separate persistence state for each address family may experience session loss when clients alternate between IPv4 and IPv6.

An alternative on the host is NAT64 implemented with eBPF (similar in spirit to Kubernetes node NAT). That can unblock a single service quickly but often does not scale as a fleet-wide strategy --- connection state, troubleshooting, and upgrade churn multiply with every host doing translation. Prefer a small number of shared frontends or edge translators over per-host NAT64 except in controlled exceptions. See also Section 5.3 for VPN and middlebox interactions with translated traffic.

3.7. Access Control List Propagation

When IPv6 is added to a service that already runs on IPv4, firewall and ACL automation may lag by minutes. During that window the service can appear healthy on IPv4 but broken on IPv6, or reachable in one direction only. SRE runbooks SHOULD treat "IPv6 enabled on the host" and "IPv6 permitted end-to-end" as separate checklist items. Do not announce IPv6 on a load balancer until policy propagation completes. Application-level IP allow and deny lists are a related deployment risk: enabling IPv6 can shift clients onto addresses missing from the list, causing service disruption; [I-D.ietf-v6ops-ipv6-app-testing] discusses testing for this before rollout.

Software teams SHOULD NOT create entirely new ACL models per address family when the same role-based policy can express both; parallel rule sets double drift risk. Where separate rules are unavoidable, generate them from the same source of truth.

3.7.1. IPAM-Based IPv4-to-IPv6 Mapping for ACLs

When IPAM tracks both address families, operators can derive a predictable IPv6 address from a hostname before an AAAA record exists in DNS. That mapping lets ACL and firewall systems publish IPv6 rules in advance, so policy is already in place when the service starts listening on IPv6 --- there is no window where the host is up on IPv6 but ACL automation is still catching up.

This pattern requires ACL policy to be expressed by hostname (or role), not by scattered literal addresses maintained separately per family. Given a hostname, a controller can resolve or derive addresses with the following pseudo-rules:

  1. Look up the AAAA record. If present, use that IPv6 address.
  2. If no AAAA exists, look up the A record and obtain the IPv4 address.
  3. In IPAM, find the IPv4 network that contains that address.
  4. Find the associated IPv6 network paired with that IPv4 network in IPAM.
  5. Embed the IPv4 address into the IPv6 network according to the site's translation plan (for example, a fixed nibble layout or well-known offset). The result is the predicted IPv6 address for that hostname.

The benefit is operational: ACLs for IPv6 can be built and deployed everywhere before DNS advertises AAAA, because the IPv6 address is computable from the same hostname and IPAM data already used for IPv4. When the service later enables IPv6 and the AAAA is published, the pre-provisioned rules should match without a second ACL rollout. The site translation plan in step 5 MUST be documented and stable; ad hoc embedding layouts defeat this approach.

Operators SHOULD detect drift when DNS or IPAM changes: for example, compare published A/AAAA records to the address predicted by the embedding plan, and alert when they diverge so pre-built ACLs are not left pointing at the wrong host.

The same correlation policy supports an early dual-stack step on the host without advertising AAAA in DNS. IPAM assigns the predicted IPv6 address on the interface; the application tier can remain IPv4-only (A record only, IPv4 listen sockets) while outbound traffic from the host uses IPv6. That lets platform agents --- configuration management, monitoring, log shippers, vulnerability scanners, and other infrastructure daemons (see Section 3.8.3) --- reach IPv6-only services on the fabric before application code is ready. Inbound clients still use IPv4 until a deliberate cutover adds AAAA and dual-stack or IPv6-only listeners; pre-provision ACLs and routing for the predicted v6 address using the steps above.

If ACL systems cannot accept hostnames and expand them through this logic, teams fall back to the lag problem described above --- IPv6 goes live while firewall tickets are still in flight.

3.8. Progress Metrics

Dashboards SHOULD expose fleet-level indicators, for example:

  • Percentage of services IPv6-only, dual-stack, or IPv4-only (by count and by criticality tier)
  • Trend of AAAA vs A-only DNS names for production hostnames
  • Ratio of ingress bytes or connections over IPv6 vs IPv4 at load balancers
  • Where NAT64 or similar translation is in use, a third traffic class --- pure IPv6, pure IPv4, and transitional (IPv6 inside the site, IPv4 outside via translation) --- so operators can see when it is safe to remove translators from a segment
  • Where available, TCP/TLS/QUIC connection-establishment counters split by address family --- for example SYN or connection attempts versus successfully established sessions, handshake timeouts, and SYN retransmissions --- so path or middlebox problems that drop or stall IPv6 handshakes are not hidden by byte or connection totals that still look healthy
  • Count of hosts or pods without any IPv6 address in IPAM or configuration management
  • Latency and QPS split by address family, or unexplained regressions correlated with rising IPv4 share (see Section 2.7)

Set explicit targets (for example, "90% of tier-1 APIs dual-stack by Q4") and review the same metrics in change advisory boards.

3.8.1. Dual-Stack Regression and Hard Failures on IPv6

Dual-stack is a valuable migration step, but without monitoring it invites regression. A service that passed dual-stack testing can stop working on IPv6 after an unrelated code push --- for example, a new dependency, a changed bind address, or a refactored HTTP client that silently prefers IPv4. Unmonitored dual-stack fleets often mask such regressions because IPv4 still succeeds. Where operators apply modest IPv4 path friction Section 2.7, a sudden preference for IPv4 often appears first as increased latency or reduced QPS on services that already export those metrics --- treat those regressions as IPv6-preference failures, not generic capacity events, until address-family split confirms otherwise.

Treat IPv6 failures as hard failures as soon as policy allows --- alert on IPv6-only health checks, IPv6 listen-socket regressions, and rising IPv4-only connection share for tier-1 services. Where production remains dual-stack, synthetic probes SHOULD exercise IPv6 explicitly (AAAA-only paths, IPv6 literal targets, or IPv6-only test clients), not only dual-stack clients that can hide breakage. When probing a load balancer or VIP by address to separate DNS or address-selection failures from the data path, HTTP and TLS checks SHOULD still present the production hostname (TLS SNI and HTTP Host) so the probe exercises the same certificate and virtual-host path as real clients; a bare IP literal may pass TCP while missing application-layer faults. [I-D.ietf-v6ops-ipv6-app-testing] describes client-, server-, and network-based tracing strategies that distinguish genuine IPv6-only-strict behavior from dual-stack masking. The sooner IPv6 errors page on-call the same way IPv4 errors do, the less likely a team discovers IPv6 rot months later during an IPv4 decommissioning drill.

Approved IPv4-only exceptions (see Section 2.5) are the controlled counterpart to this policy: hard failure is the default; a documented waiver with remediation timeline is the escape hatch, not silent dual-stack masking.

3.8.2. Host-Level Listen-Socket Audit

On each host, collect which services listen on IPv4-only, IPv6-only, or dual-stack. On Linux, ss -tulnp (or /proc/net/tcp and tcp6) is the usual source, but classification is non-trivial:

  • Separate tcp/udp vs tcp6/udp6 lines are often IPv4-only vs IPv6-only listeners.
  • A single IPv6 socket with IPV6_V6ONLY=0 may accept IPv4-mapped traffic without a matching tcp line --- treat as dual-stack only after checking socket options or process documentation.
  • Match rows by PID, port, and inode when correlating multiple lines for one daemon; export a normalized label (v4-only, v6-only, dual-stack, unknown) for metrics.

Run this audit on a schedule and on every deploy; alert when a tier-1 service regresses to IPv4-only.

3.8.3. Host Agents Before Application Provisioning

Before any application software is installed, inventory every agent and daemon already running on the host --- configuration management, monitoring, log shippers, vulnerability scanners, EDR, host firewalls, and other platform packages the fleet image includes by default. These components often bind IPv4-only, ship IPv4-only policy from a central console, or break when the host loses IPv4 even if the workload you plan to deploy is IPv6-ready.

Run this baseline check on golden images and freshly provisioned servers, not only on production services. A host cannot safely move to dual-stack or IPv6-only if an unknown agent still requires IPv4 loopback for listening (that is, it binds only on 127.0.0.1 while IPv6-only local clients must connect), RFC 1918 reachability, or IPv4-only reporting to its controller. IPv4 loopback on lo itself --- including clients that dial 127.0.0.1 --- is expected to remain on many platforms (for example Linux, where IPv4 cannot be disabled in the kernel) and is not the same as routable IPv4 on application interfaces. Export agent name, version, listen sockets (see above), and IPv6 readiness into the same catalog as Section 4.4. Re-run when the image or security baseline changes.

3.8.4. Traffic by Protocol and Address Family

Switches and routers expose IPv4 and IPv6 packet counters but often do not break out TCP and UDP by IP version (TCPv4 vs TCPv6, UDPv4 vs UDPv6). Where the platform allows, collect tcp4/udp4 vs tcp6/udp6 (or equivalent flow records) on hosts, hypervisors, and top-of-rack devices. Application SREs need L4 metrics split by address family to confirm traffic is migrating and to find stragglers still on IPv4-only or translated paths.

Log pipelines SHOULD record address family explicitly (AF_INET vs AF_INET6) rather than inferring from string shape.

3.8.5. HTTP Signaling and Planned IPv4 Drills

For HTTP services, implementing HTTP Signaling of Planned IPv4 Unavailability (566 responses, Retry-Over-IPv6, and related headers) gives measurable signals during planned IPv4 outages: count 566 responses, soft vs hard failures after IPv6 retry, and clients still hitting IPv4. That data belongs on the same dashboards as listen-socket and byte-ratio metrics when rolling out dual-stack or IPv6-only frontends.

3.8.6. Live Traffic and Service Call Trees

Inventory and socket audits show what could run on IPv6; live traffic shows what does. Instrument outbound and inbound connections (service mesh, eBPF, proxy access logs, or APM) to tag each hop with address family. Roll those tags into a call tree or dependency graph per service so teams see, for example, "API gateway is dual-stack but 80% of backend calls still use IPv4" or "this batch job is IPv4-only despite an IPv6-ready binary."

Use call-tree family breakdown to prioritize refactors: fix the highest-volume IPv4-only edges first. Where translation is present, tag hops as native IPv6, native IPv4, or transitional so dashboards show when NAT64 can be retired from a path. Reconcile call-tree findings with the inventory --- a service marked "IPv6 ready" with no IPv6 traffic is not done. [I-D.ietf-v6ops-ipv6-app-testing] describes decomposing complex, multi-service cloud applications into per-flow test cases, matching this per-hop view.

4. Part III: Tools & Best Practices

4.1. Developer and Pre-Production Environments

Provide dual-stack (and eventually IPv6-only) networks to developers as early as possible --- ideally before production rollout, not after. Engineers who code and debug only on IPv4-only laptops or lab VLANs ship software that "works in the office" and fails when AAAA records appear in production.

It is customary to build and test new code in VMs or containers that mirror production topology before release. Those evaluation environments MUST include dual-stack and IPv6-only variants alongside legacy IPv4-only images where brownfield support is still required. CI pipelines SHOULD run integration tests against both address-family modes so a code push cannot silently regress IPv6 without failing the build. [I-D.ietf-v6ops-ipv6-app-testing] defines the connectivity-scenario combinations and testing strategies these pipelines SHOULD cover, including IPv6-only-strict and IPv6-only with NAT64.

Platform teams SHOULD publish standard developer network profiles (dual-stack lab, IPv6-only sandbox, simulated edge with NAT64) and document how to attach local IDEs, test harnesses, and AI coding agents to them.

4.2. IPv6-Only Jump Hosts

Moving to IPv6 is not only a routing change --- it requires a cultural shift for SREs and SWEs who have spent years assuming IPv4 literals, RFC 1918 mental models, and IPv4-first tooling. Make that shift visible before emergencies: IPv6-only jump hosts, IPv6-first runbooks, and labeled lab networks teach the new defaults while change windows are calm. Engineers under incident pressure do not have time to learn IPv6 idioms; if the first time they need dig -x on an ip6.arpa name or SSH over a global v6 management address is during a sev-1, the organization has already failed the migration program.

A practical staged transition puts administrative jump hosts on an IPv6-first path while leaving application tiers dual-stack temporarily. "IPv6-only" for that host means two different things --- do not conflate them:

  • sshd (and similar entry points) listen only on IPv6: employees and IT must reach the bastion over IPv6. The client path can still be dual-stack (laptop, VPN, corp Wi-Fi); the point is to force IT to provide a working IPv6 environment to staff so people can get in at all.
  • No IPv4 address on the jump host: once operators are on the box, every management command and every call to management APIs (config management, inventory, monitoring, cloud control planes, and similar) must succeed over IPv6. That is a stricter proof that the operations stack is IPv6-ready, not only that SSH answered on a AAAA.

Engineers run break-glass SSH and day-to-day tooling from those hosts. Maintain at least one dual-stack backup jump host during migration and audit who connects and which commands run until parity is proven.

On that dual-stack backup, operators MAY add noticeable but non-blocking IPv4 friction so a session that landed on IPv4 is obvious without denying access. Prefer a login banner that states the session used IPv4 over multi-second delays: under incident pressure, even a few seconds of ForcedCommand countdown can feel like an outage. If a delay is used at all, keep it minimal and temporary, and consider reducing IPv4 SSH session timeouts instead. Emergency access still works; the signal is that IPv6 is not functional or not preferred, so the path can be fixed while the window is calm. IPv6 sessions SHOULD NOT receive the same penalty. The same idea applies more broadly than SSH --- see Section 2.7.

Corporate and guest Wi-Fi are ops- and lab-adjacent to the data center fabric (different device churn and trust model than server VLANs). Treat them as useful migration exercise networks, not as a substitute for jump-host discipline; broader enterprise wireless guidance is in [RFC7381]. Provide dual-stack Wi-Fi for everyday employee devices during migration, and at least one IPv6-only employee Wi-Fi SSID so laptops, phones, VPN clients, and captive-portal flows are exercised on AAAA-only paths before production depends on them. Label SSIDs explicitly (for example, corp-dualstack and corp-v6-only) so engineers know which network they joined.

Some operators MAY additionally offer IPv6-only guest Wi-Fi --- for example in lab, conference, or vendor demo areas --- so external teams can demonstrate that hardware and software work without IPv4 fallback during evaluations and acceptance testing. That network SHOULD be clearly marked, rate-limited, and isolated from internal management zones; it complements jump hosts but does not replace them for break-glass administration.

4.3. Network Diagnostics in the Data Center

A data center is a closed, operator-controlled environment. Two practices that help SREs diagnose routing, DNS, and reachability problems on both IPv4 and IPv6 are often skipped because they feel optional or risky.

4.3.1. Reverse DNS

Maintain forward and reverse DNS for long-lived infrastructure: servers, load balancers, management interfaces, and other addresses that appear in logs, firewall hits, flow records, and packet captures. Reverse zones (PTR for IPv4, ip6.arpa for IPv6 [RFC3596]) map an address back to a hostname. That mapping is routine on IPv4 but becomes essential on IPv6, where prefixes are not human-scannable and incidents otherwise devolve into comparing 128-bit literals. Reverse records SHOULD be created in the same change workflow as forward records and IPAM assignments (see Section 5.2). Spot-check with dig -x or equivalent on both address families before relying on reverse lookup during an outage.

4.3.2. Controlled ICMP Echo (Ping)

Teams trained to drop ICMP echo request/reply ("ping") on the public Internet sometimes apply the same rule everywhere. Inside the data center, allowing echo request/reply with limits --- rate limits, scoped ACLs, source restrictions to management networks or jump hosts, or equivalent controls --- is RECOMMENDED for troubleshooting. A successful ping confirms basic IP reachability (when echo is permitted) without opening application ports. A failed ping alone does not prove there is no route: filtering, rate limits, host firewall policy, or a destination that does not answer echo can produce the same symptom. Combine ping with traceroute, tracepath, or mtr, TCP connects to a known port, or other checks before concluding "no route" versus "route but service down."

This is separate from the ICMPv6 requirements in Section 5.3: Neighbor Discovery and Path MTU Discovery need specific ICMPv6 types on production paths and MUST NOT be blocked wholesale. Controlled echo is an additional diagnostic convenience on top of that baseline. Operators SHOULD NOT replace protocol-required ICMP with echo-only rules, nor block echo in ways that remove a basic reachability tool from on-call engineers. Apply the same philosophy to ICMPv4 echo inside the fabric: constrain abuse, but preserve a controlled way to test L3 connectivity during incidents.

4.4. Tracking Application and Software Readiness

IPv6 deployment exposes software that "worked on the LAN" only because the LAN was IPv4. This section lists classes of problems seen in production data centers and enterprise rollouts.

4.4.1. Enterprise Platform Inventory

Many enterprise platforms still assume IPv4-only access paths. Examples reported in operator experience as of this writing include Hadoop, certain object storage APIs, Kubernetes dependencies (especially third-party charts and sidecars), cloud firewalls (for example, Firewalls and third-party NGFW images on cloud platforms where IPv6 support lagged vendor roadmaps), and security analytics pipelines that ingest NetFlow or packet metadata on IPv4 only. Re-check product status at publication and deployment time --- capability claims change. Hybrid and multi-cloud estates need the same inventory discipline for managed services and connectivity paths (see Section 2.6).

Action for SRE teams: maintain a living inventory of software in the deployment path (data plane, control plane, CI/CD, security, logging) with an explicit IPv6 supported / broken / untested classification. Monitoring pipelines SHOULD continuously discover services not yet in that inventory (see Section 2.4). Security research or monitoring that runs IPv4-only cannot validate IPv6 attack surface; teams SHOULD require IPv6 parity before accepting "no IPv6 security issues" claims.

4.4.2. Dependency and Platform Readiness Gates

Many SREs and software engineers will not study address representation, getaddrinfo() semantics, or Happy Eyeballs in depth --- and should not have to before every deploy. Platform teams SHOULD publish monitored readiness gates: for each shared dependency (language runtime, HTTP/RPC client, database driver, messaging library, observability agent, base container image), document a minimum version or image tag and the required configuration profile, both validated on dual-stack and IPv6-only paths.

A version or image threshold is a prerequisite, not proof that the deployed service is IPv6-ready. The same binary can still run IPv4-only because a feature flag, environment variable, listen address, or endpoint-selection setting is wrong. Software version and configuration version MAY be shipped as one bundle or pushed independently --- the usual case in large data centers using Puppet, Ansible, or similar. Operators already monitor which software and configuration versions are deployed; IPv6 gates SHOULD use those same signals.

Configuration commonly inherits and overrides along a hierarchy (for example organisation, site, maintenance zone, application, host). A ready package with a leftover override is still not ready. The gate is therefore often "upgrade to version X" and/or "remove the override so the general value applies" --- for instance dropping a host-level java.net.preferIPv4Stack=true (see Section 5.5.5).

Example gates: upgrade example-http-client to 2.4.0 or newer; remove application or host overrides of java.net.preferIPv4Stack. Versions or profiles below the threshold remain blocked or flagged in the inventory until both the package and the effective configuration match.

Automate enforcement against that catalog: compare SBOMs, lockfiles, image scans, and configuration-management reports (resolved inheritance, not only the default) to the matrix on a schedule and in CI (see Section 2.4). Crossing the software-version threshold SHOULD NOT by itself mark a service ready. When version and configuration match the gate and end-to-end validation on dual-stack and IPv6-only paths succeeds --- dependency bumped, agent replaced, golden image refreshed, override removed --- update its readiness label without requiring every engineer to audit socket call sites by hand. Put the gates where teams already work (service catalog, Renovate or equivalent dependency bots, configuration-management dashboards, deployment checklists) and SHOULD tie change-advisory or promotion policy to them so unknown, below-minimum, or misconfigured software cannot reach production dual-stack or IPv6-only paths unnoticed.

4.4.3. Static Analysis and Pull Request Automation

Manual review does not scale across large monorepos. Security and platform teams SHOULD integrate IPv6 readiness checks into pull request (PR) workflows, piggybacking on existing gates rather than relying on a separate audit cycle.

4.4.4. Pattern Scanners in CI

Ship Semgrep, CodeQL, or equivalent rules that flag likely IPv4-only patterns, for example:

  • Literal 127.0.0.1 or 0.0.0.0 in listen/bind configuration (not every client connect to 127.0.0.1; see Section 5.4), or dotted-decimal regexes used as addresses
  • Calls to deprecated Python socket helpers (see Section 5.10)
  • AF_INET sockets where dual-stack or AF_INET6 is required
  • Database columns or structs sized for IPv4-only (CHAR(15), 32-bit integers)
  • String splits on . to parse "IP addresses"
  • getaddrinfo() (and language equivalents) that use only the first returned address, or that treat DNS response order as load balancing without within-family selection --- assumptions that ordinary review often misses (see Section 5.5.4 and Section 5.7)

Security teams often own the rule pack; application teams own remediation. Rules SHOULD be published internally with examples and fix guidance.

4.4.5. Automated Remediation Pull Requests

Beyond blocking merges, pipelines MAY open automatic PRs that propose fixes when a scan finds matches on default branches or on a schedule. Some findings are straightforward (replace gethostbyname with getaddrinfo usage); others need context. AI-assisted patch generation can speed up bulk refactors, but MUST be reviewed by a human --- expect false positives (for example, code that intentionally handles IPv4-only legacy clients).

Treat auto-generated PRs like any other contribution: tests, ownership by code owners, and rollback plan.

4.4.6. Opt-Out Annotations for Engineers

Engineers SHOULD be able to suppress a finding on a specific line when the IPv4-only behavior is intentional and documented --- for example, a compatibility shim with a planned removal date. Define a codified comment recognized by the scanner, placed immediately before the flagged line. An example directive:

# ipv6-readiness: ignore-next-line -- see TICKET-123

The project MUST document the exact directive string, required rationale format, and whether ticket references are mandatory. Blanket disables of entire files SHOULD NOT be allowed without security team approval.

4.5. AI Coding Agent Skills

Many teams now use AI coding agents in the IDE and in CI. Add an IPv6 readiness skill (or equivalent project rule) to the agent environment --- and push the same skill into application repositories --- so generated patches default to dual-stack APIs, getaddrinfo()-style resolution, and IPv6-safe listen/bind patterns. The skill SHOULD require agents to verify that new network code works when AAAA records are present and when IPv4 is absent (IPv6-only paths). Treat this as part of the same program as Semgrep and CodeQL rules, not a substitute for automated tests on dual-stack and IPv6-only runners (see Section 4.1).

4.6. Documentation and Presentations

Runbooks, architecture diagrams, wikis, training decks, and conference slides SHOULD use IPv6 addresses in examples by default, unless the example is inherently IPv4-specific. Using IPv4-only literals in internal documentation normalizes the wrong protocol for new engineers and hides gaps until production rollout. IETF documents follow the same principle: examples SHOULD use IPv6 and reserved documentation prefixes rather than arbitrary or production addresses [RFC3849] [RFC5737].

When an example needs an IP address or prefix, follow IETF documentation address rules:

  • IPv6 (preferred): use the documentation prefixes reserved in [RFC3849] (2001:db8::/32) and [RFC9637] (3fff::/20 for larger or more realistic layouts). Represent addresses in canonical text form per [RFC5952] (lowercase hex, suppress leading zeros, use :: compression).
  • IPv4 (only when required): use the TEST-NET blocks in [RFC5737] (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) --- not production space, arbitrary 10.0.0.0/8 lab subnets, or other unreserved ranges that could collide with real deployments.
  • Names: use example domain names from [RFC2606] (example.com, example.net, example.org) rather than real operator domains.

Review documentation the same way code is reviewed: a slide full of 10.x.x.x or 192.168.x.x examples teaches habits that conflict with IPv6-first data center operation. Prefer 2001:db8:... and service names unless the document explicitly covers legacy IPv4 behavior.

5. Part IV: Pitfalls

5.1. Out-of-Band Management and Network Boot

Software readiness is insufficient if servers cannot be installed, booted, or power-cycled over IPv6. This area SHOULD be tackled very early in an IPv6 program --- before application tiers --- because hardware refresh cycles can take up to five years. A server bought today with an IPv4-only baseboard management controller (BMC) or provisioning stack may still block IPv6-only operation long after application code is ready. Align purchase and RFP language with that timeline (see Section 2.3.1).

5.1.1. Often-Forgotten Infrastructure Devices

Out-of-band work is not limited to compute IPMI, Redfish, and PXE. Teams routinely overlook facility and operations gear that shares the same management VLANs and must be reachable during incidents:

  • UPS and power distribution monitoring
  • Climate control (CRAC, chillers, environmental sensors)
  • NTP appliances or stratum servers on dedicated hardware
  • Console servers and serial concentrators
  • KVM switches, rack PDUs, and other data center infrastructure management devices

These systems often ship with fixed IPv4-only interfaces, embedded web UIs bound to 192.168.x.x, and long firmware cadences. Include them in the same IPv6 readiness inventory as production servers (see Section 4.4 and Section 2.4); they become blockers during IPv4 decommissioning even when every application pod is dual-stack.

5.1.2. Firmware and PXE/UEFI Boot

Many BIOS implementations still lack usable IPv6. UEFI network boot over IPv6 exists but varies by server vendor in ways that affect automated provisioning. Network appliance EFI implementations are similarly inconsistent. An IPv6-only provisioning VLAN requires explicit qualification of every hardware generation in the fleet.

5.1.3. IPMI and Redfish

IPMI over IPv6 is essential for remote power cycle and reboot when management networks move to IPv6-only. Without a working BMC address on v6, automation cannot recover a hung host without a physical visit. The same requirement applies to the provisioning and reboot toolchain --- imaging, PXE/UEFI orchestration, configuration management kickstart, and out-of-band serial concentrators SHOULD be dual-stack or IPv6-only capable before internal management VLANs drop IPv4.

IPMI and Redfish IPv6 support differs by vendor and firmware generation: some platforms support SLAAC, others DHCPv6, others require initial IPv4 configuration before enabling IPv6. Linux ipmitool subcommands and output formats vary with firmware. Enterprises often defer firmware upgrades because failed BMC updates require physical data center visits --- plan IPv6 on management networks with spare in-rack capacity and conservative change windows.

5.2. DNS Registration and Dynamic Addressing

IPv6's default autoconfiguration (SLAAC) generates addresses from interface identifiers. Without operational discipline, DNS lags behind actual addresses, and break-glass access by name fails.

5.2.1. SLAAC, Switches, and the DNS Gap

Wi-Fi controllers often integrate with DNS to register client names; access switches frequently do not. To populate DNS for wired servers using SLAAC, operators need MAC and address visibility from switches (for example, via Neighbor Discovery logging or sFlow/IPFIX) correlated with inventory to derive hostnames. Ideally, selected Neighbor Discovery events would be exported to a registration service --- a gap in many switch implementations.

5.2.2. DHCPv6 and Hostname Registration

Enterprises that distrust client self-registration prefer DHCPv6 with central lease logging. Clients SHOULD send DHCPv6 Option 39 (Client FQDN) so the server can register forward and reverse DNS [RFC4704] [RFC8415]. Support for Option 39 has varied by OS; operators SHOULD verify current behavior on every deployed OS image (including macOS, Windows, Linux, and container base images) rather than assuming parity.

Device-side Dynamic DNS updates remain possible but are often disabled in enterprise policy. For why reverse zones matter during incidents, see Section 4.3.

5.2.3. DHCPv6 Suitability Considerations

DHCPv4 is extremely common in IPv4 deployments, as it is best mechanism to automatically provide network information (such as IP address, router, netmask, recursive DNS resolvers) to nodes. This, combined with a desire to have centralized logging of assigned addresses, leads to a desire for DHCPv6 in new IPv6 deployments. However, IPv6 includes much of this functionality in the base protocol; a central server is not needed. Moreover, operating system support for DHCPv6 is not as universal as for DHCPv4, so it is not a full replacement for SLAAC. This means that using DHCPv6 for centralized logging of addresses or DNS synchronization either means that some clients may be logged (as they will use SLAAC), or some clients may not work at all (if SLAAC is disabled on the network). Operators SHOULD verify DHCPv6 support for all existing and planned hardware before relying on it for logging features.

5.3. ICMPv6, PMTUD, and Middleboxes

5.3.1. Do Not Block ICMPv6

Teams trained to block ICMPv4 "for security" sometimes apply the same policy to ICMPv6. ND and PMTUD depend on ICMPv6 [RFC4443] [RFC8201]. Blocking ICMPv6 produces hung connections, mysterious TLS timeouts, and DNS failures that are misdiagnosed as application bugs. Filter specific message types judiciously; do not implement blanket deny rules. For echo request/reply used in reachability testing inside the data center, see Section 4.3.

Blanket deny is often a sequencing failure, not only a knowledge gap: security meets IPv6 for the first time at the perimeter firewall late in the rollout, with no agreed threat model and full accountability for residual risk. Agree filtering with security when the addressing plan is written (see Section 2.3), not as the last firewall change. Treat [RFC4890] training as a prerequisite to the rule change.

5.3.2. Path MTU Discovery

When many organizations enabled IPv6 on their web sites during World IPv6 Day (2011) and World IPv6 Launch (2012), Path MTU Discovery failures forced operators to lower TCP MSS on servers and load balancers until paths were validated --- a reminder that IPv6 MTU assumptions differ from internal IPv4 MTU 1500 end-to-end paths. Mobile operators (for example, T-Mobile USA and Reliance Jio in India) run IPv6-only access networks successfully at scale; problems on enterprise fixed networks often come from middleboxes and policy, not from IPv6 itself.

Hard PMTUD failures also interact with DNS over large responses when fragmentation is mishandled. If fragmented UDP is dropped, DNS appears "flaky" only for some large records. Where classic ICMP-based PMTUD is unreliable, operators and implementers MAY also use Packetization Layer Path MTU Discovery (DPLPMTUD) [RFC8899].

5.3.3. VPNs and NAT64

Some VPN products treat translated packets as attacks. NAT64 [RFC6146] changes headers; a VPN that validates packet integrity on IPv4 paths may drop NAT64 flows. Prefer edge gateways for translation as described in Section 3.4 and Section 3.6 rather than sprouting translators on every host. Long-term, VPN endpoints should be native IPv6 on the data center side. Until then, document which access paths require IPv4 literal connectivity vs IPv6.

5.4. Hard-Coded Addresses and Localhost Pitfalls

Listening and connecting to loopback are different problems.

::1 is localhost; 127.0.0.1 is localhost. Do not embed IP addresses in application code when a name will do --- especially for listen/bind targets. Use hostnames and service discovery; resolve names at connection time. Clients that connect to 127.0.0.1 remain acceptable where IPv4 loopback stays on lo (see Section 5.4).

A recurring server-side defect is binding services to 127.0.0.1 instead of localhost (or an explicit dual-stack listen). On dual-stack hosts, 127.0.0.1 listens IPv4 loopback only; IPv6 clients that resolve localhost to ::1 cannot connect even when the service "runs locally." The fix is to use name-based bind targets (localhost), listen on both loopback families (127.0.0.1 and ::1), or use explicit dual-stack sockets depending on platform API.

Client-side use of 127.0.0.1 as a connect target is a different case. Local agents, scripts, and libraries that dial 127.0.0.1 continue to work on hosts where IPv4 loopback remains on lo --- which is the normal state even on systems that are IPv6-only on application interfaces and, on Linux, cannot disable IPv4 in the kernel entirely. Migration programs are not required to spend effort replacing every client connect to 127.0.0.1 when loopback IPv4 is left in place; prioritize listen misconfigurations that block IPv6-only local clients. To surface applications that wrongly assume IPv4 loopback is present, [I-D.ietf-v6ops-ipv6-app-testing] recommends testing in an environment without IPv4 on the loopback interface.

DNS (or an equivalent naming and service registry) becomes essential in IPv6 because humans cannot memorize 128-bit addresses. Operational maturity includes forward and reverse DNS for infrastructure, health checks keyed on names, and monitoring that labels series by hostname rather than by address literals.

Similar listen-side bugs appear with 0.0.0.0 vs :: semantics, health probes that curl IPv4 literals against services bound IPv6-only, and container images that ship /etc/hosts without IPv6 entries.

5.5. Resolving Hostnames to Addresses

This section covers name-to-address APIs and client resolution behavior --- the connection layer above application readiness gaps cataloged above.

Turning a hostname into addresses is a separate step from choosing which address to connect to. Prefer an address-family-agnostic API in the OS, library, or framework that already returns the full candidate set and supports both IPv4 and IPv6, unless there is a specific reason to do otherwise. Application code MUST obtain all candidate addresses, then apply local policy (retries, Happy Eyeballs [RFC8305], load spreading --- see Section 5.5.4 and Section 5.7). Prefer the OS or a shared library's Happy Eyeballs implementation over reimplementing connection racing in each application; when a custom implementation is unavoidable, delay the IPv4 connection attempt so IPv6 has more time to succeed first --- consistent with [RFC8305] and with ongoing work in the HAPPY working group.

Even with correct client retry logic, missing or wrong IPv6 routes can send internal AAAA targets out an Internet default route. Edge hosts in transitional layouts SHOULD install unreachable routes for internal aggregates so address-family fallback can succeed (see Section 3.5.1).

5.5.1. Use getaddrinfo(), Not Legacy One-Address APIs

On POSIX systems, when a higher-level family-agnostic helper is not available, the correct resolver entry point is getaddrinfo() [RFC3493]. It takes a hostname (or numeric address string), service/port hints, and an addrinfo hints structure, and returns a linked list of addrinfo structures --- one node per destination address candidate. The caller MUST iterate over the entire list (the ai_next chain) trying to connect to each candidate until either successful or no candidates are left, and MUST release the list with freeaddrinfo() afterwards.

Please note: getaddrinfo() is the name-to-address API for retrieving a full list; it is not the same as:

  • gethostbyname() and gethostbyname2() --- deprecated, not thread-safe, and still present in old tutorials.
  • inet_addr(), inet_aton(), and inet_pton() --- parse a literal address string into binary; they perform no DNS lookup and return a single address only.
  • Higher-level HTTP or RPC helpers that resolve a name internally and connect to one chosen address without exposing the full set --- fine for quick clients, unsuitable when the service relies on multiple A/AAAA records.

To request both IPv4 and IPv6 results, set hints.ai_family to AF_UNSPEC (unless a deliberate single-family policy applies). Inspect ai_family, ai_addrlen, and ai_addr on each list element; do not assume every node has the same address family.

Language runtimes expose the same idea under different names:

  • Python: socket.getaddrinfo() returns a list of tuples --- iterate all entries; avoid socket.gethostbyname(), which returns one IPv4 address.
  • Go: net.DefaultResolver.LookupIPAddr() or LookupIP(); better use net.Dialer which provides Happy Eyeballs support.
  • Java: InetAddress.getAllByName() returns an array; getByName() returns only the first address and is a common source of "works in the lab" failures under round-robin DNS.
  • Node.js: dns.promises.lookup() or dns.lookup() with { all: true } as the default lookup() without all: true returns a single address; better use net.connect with autoSelectFamily which provides Happy Eyeballs support.

Pay special attention when connecting to a hostname (as opposed to a numeric literal): resolution can return both IPv4 and IPv6 addresses, and often more than one of each. A failed connect() to one of those addresses does not mean the host is unreachable. Application code MUST NOT report the destination as down after trying only the first AAAA or A record and never the other family, or after IPv4 fails while unused IPv6 candidates remain (and vice versa). Try other addresses from the resolved list --- or use Happy Eyeballs [RFC8305] --- before concluding that the service cannot be reached. When none of the candidates succeed, do not surface only the error from the first attempt: preferably report all failures encountered. If this is not feasible, report at least the most pertinent failure --- typically the attempt that progressed furthest (for example TCP handshake completed but TLS or application protocol failed, or a clear ICMP unreachable rather than a timeout on an earlier candidate).

5.5.2. Why the Full List Matters

DNS often publishes multiple A and AAAA records for availability and load distribution. Connecting to result->ai_addr and ignoring ai_next defeats that design. After collecting the list, the application (or a shared library) may ether rely on the order produced by the libc implementation (usually following [RFC6724]) or apply a more sophisticated re-ordering strategy based on Happy Eyeballs, within-family random or weighted selection for equivalent data-center backends. There is no guarantee that the first entry is the best choice, reflects order from DNS or is even functional at all.

Note that libc implementations may reorder the list per [RFC6724] before returning it (see Section 5.5.4). You still need every element --- reorder yourself if policy requires --- but you cannot skip resolution and hope DNS order survives unchanged.

5.5.3. Numeric Input at the Edge

When configuration or user input contains an address literal rather than a hostname, inet_pton() (or the language equivalent) converts it to binary for storage. When input might be either a name or a literal, getaddrinfo() accepts both; alternatively, try literal parse first, then fall back to DNS. Either way, convert once to binary and use binary forms internally.

5.5.4. Address Selection, gai.conf, and DNS Round Robin

The Linux file /etc/gai.conf and the algorithms in [RFC6724] control address selection order for dual-stack hosts --- which address family and which destination address are tried first. This is invisible in application source but visible in production load distribution.

RFC 6724 has two axes that operators often conflate:

  • The policy table decides which class wins (for example ULA vs GUA vs IPv4). [I-D.ietf-6man-rfc6724-update] updates that table so known-local ULA-ULA is preferred over IPv4 and, for local use, over GUA. That helps dual-stack sites that use ULAs internally. It does not change Rule 9.
  • Rule 9 ("Use longest matching prefix") decides which same-family destination is tried first. It compares each candidate with its likely source address and sorts addresses deterministically [RFC6724]. Resolver libraries such as glibc implement this sorting inside getaddrinfo().

Rule 9 is a problem if you expect DNS load balancing. A rotated set of A or AAAA records can collapse to "always try the same address first" once Rule 9 runs, concentrating connections on one backend. The problem is subtle on IPv4 but often severe on IPv6, especially inside a data center where many servers are functionally equidistant and operators expect DNS or anycast to spread load. Changing /etc/gai.conf adjusts precedence tables but does not fully disable Rule 9 in all implementations.

[I-D.martin-ipv6-addr-selection-updates] is trying to address that gap at the resolver: operators would configure prefix ranges for which Rule 9 does not apply, so getaddrinfo() preserves same-family DNS order without application changes. That is not something operators can assume on the fleet today.

Meanwhile, load balancing MUST be treated as something the client handles --- a shared library, service-discovery client, or mesh --- not DNS order after getaddrinfo(). The discipline matches Happy Eyeballs: do not assume destination selection is correct for every language, runtime, and client. Review it per client, especially inside a data center where Rule 9 is most harmful. DNS load balancing is often an implicit assumption buried in connection code --- "we publish multiple AAAA records, so clients will spread" --- so ordinary code review may never surface it. Pattern scanners such as Semgrep or CodeQL (see Section 4.4.3) SHOULD flag getaddrinfo() and language equivalents that take only the first result, skip within-family spreading, or otherwise treat DNS order as load balancing, so each call site is questioned rather than assumed correct.

Mitigations while Rule 9 still reorders:

  • Internal / cluster backends intended to be equivalent: within-family random or weighted selection (or service mesh / anycast). Do not trust DNS or getaddrinfo() order for spread. Do not shuffle the entire resolved list across families --- that breaks IPv6 preference; partition by family first, then randomize or weight within each family.
  • External Internet destinations: keep RFC 6724 family and prefix-class order (do not shuffle IPv4 with IPv6). Same-family DNS round-robin is still not a load-balancing strategy while Rule 9 runs.
  • Prefer putting resolution, Happy Eyeballs, and within-family spreading in shared client libraries so each application team does not rediscover the same interaction (see Section 5.7).

5.5.5. Runtime-Specific Resolution (Not Always glibc)

Examples above assume POSIX getaddrinfo() via glibc (or an equivalent libc). Not every language or runtime uses libc for name resolution. Java maintains its own resolver stack and system properties such as java.net.preferIPv4Stack and java.net.preferIPv6Addresses that override address-family preference independently of /etc/gai.conf. A JVM configured to prefer IPv4 can appear "IPv6 broken" even when the OS resolver returns AAAA records. Test Java services with explicit property settings and with InetAddress.getAllByName(), not getByName(). [I-D.ietf-v6ops-ipv6-app-testing] catalogs these destination-address-selection and address-filtering deviations (including Java preferring IPv4 and resolvers such as NGINX that ignore address-family availability) as common IPv6 failure sources.

In extreme cases, an /etc/resolv.conf that lists only IPv6 nameserver addresses can interact badly with runtimes that bootstrap DNS over IPv4 first or assume a v4-reachable resolver path. Symptoms include slow resolution, timeouts, or unexpected family ordering. Qualify resolver configuration on dual-stack and IPv6-only hosts for each runtime in the fleet, not only for C callers of getaddrinfo().

5.6. Address Representation

IPv6 addresses have several equivalent textual forms [RFC4291]:

  • Full form: 2001:db8:0:0:0:0:0:1
  • Compressed zeros: 2001:db8::1
  • Loopback: ::1 (compare IPv4 127.0.0.1)
  • Unspecified: ::
  • IPv4-mapped IPv6: ::ffff:192.0.2.1

In dual-stack environments, IPv4 addresses also appear in multiple forms in code and configuration:

  • Dotted decimal: 192.0.2.1
  • Integer (historical APIs): 3232235521
  • Hex packed in configs: 0xC0000201
  • Mapped in IPv6 APIs: ::ffff:192.0.2.1

In software, addresses SHOULD be stored in a normalized form --- preferably a binary field or structure sized for 128 bits (for example, in6_addr, sockaddr_storage, or an equivalent language type), so the same field can hold IPv4 or IPv6 and equality is unambiguous. Binary storage provides normalization by construction. If a string form is unavoidable, apply a strict canonicalization function (for example [RFC5952]) at write time and compare only normalized values --- never parse or compare address strings ad hoc in application logic. Provide helpers to convert between binary and human-readable forms at display and configuration I/O boundaries. When addresses are handled as data (logging, ACLs, management output), test that code accepts all valid representations [RFC4291] and renders canonical text [RFC5952]; [I-D.ietf-v6ops-ipv6-app-testing] covers this "addresses as data" testing.

For human comparison in fixed-width tables, spreadsheets, or IPAM grids, operators MAY deliberately diverge from [RFC5952] --- for example by suppressing :: compression or zero-padding hextets --- so columns align and adjacent addresses are easier to scan. That form SHOULD be consistent within the display context. Interchange formats, APIs, logs-as-data, and configuration that software parses SHOULD still use binary storage or canonical text per [RFC5952]; do not treat a tabular display convention as the on-the-wire or storage format.

Applications SHOULD treat names, not literal addresses, as the stable interface (see Section 5.5). To turn a name into addresses, use the APIs described in Section 5.5 --- not legacy one-address helpers and not string parsing.

5.7. Client-Side Load Balancing

Client-side load balancing builds on the resolution patterns in Section 5.5 when services publish multiple A/AAAA records.

As described in Section 5.5.4, RFC 6724 Rule 9 reorders addresses returned from DNS. In data centers that rely on multiple AAAA records for spread, connection counts can skew badly --- one backend receives most IPv6 connections while others appear idle. This section assumes the application has already obtained the full address list using the patterns in Section 5.5.

Recommended pattern (when the shared library does not already encapsulate this --- prefer OS or library Happy Eyeballs and service-discovery clients first; see Section 5.5 and the HAPPY working group):

  1. Resolve the service name to all addresses (or refresh from service discovery).
  2. Partition addresses by address family.
  3. Apply family preference policy (operator choice: IPv6-first, happy eyeballs, or parallel). For Happy Eyeballs, start IPv4 attempts after a deliberate delay so IPv6 connections have priority time to complete.
  4. For equivalent data-center backends, randomize or round-robin within each family rather than trusting DNS order after getaddrinfo() --- Rule 9 defeats DNS load balancing today (see Section 5.5.4); [I-D.martin-ipv6-addr-selection-updates] is trying to fix that in the resolver, but clients must handle spreading until hosts implement it. When service discovery or endpoint metadata provides weights, prefer weighted selection within a family. For external Internet destinations, keep family preference from RFC 6724 / Happy Eyeballs; do not shuffle IPv4 and IPv6 together. Like Happy Eyeballs, destination selection is a client behavior to inventory and review, not a property of DNS.
  5. Optionally implement retries across the full set on failure.

Endpoint freshness: treat selection policy as distinct from discovery and refresh. Re-resolve on DNS TTL expiry or refresh from service discovery so drained, replaced, or newly added backends enter and leave the candidate set; otherwise clients keep balancing across stale addresses.

Long-lived connections: for HTTP/2, gRPC, and similar multiplexed pools, endpoint selection often occurs only when a connection is opened. Equal distribution of connections does not imply equal distribution of requests, and weight or membership changes may take effect only as old connections drain.

Implement load balancing in shared client libraries so every service does not rediscover the same RFC 6724 interaction. Most software engineers are not DNS or path-selection specialists, and they should not have to be: put resolution, Happy Eyeballs, and within-family spreading in one (or a small set of) platform libraries used across the codebase, then review each client that still rolls its own destination selection --- the same discipline as Happy Eyeballs coverage. Because DNS-spread expectations are often implicit, pair that review with the Semgrep / CodeQL patterns in Section 4.4.3 rather than relying on humans to notice every getaddrinfo() call site. Platform and SRE teams can then clear IPv6 readiness by saying upgrade the shared client to version X and apply (or stop overriding) the documented dual-stack profile, rather than teaching each application team how to rewrite connection logic --- the same readiness-gate pattern as Section 4.4.

5.8. IP Address Storage in Application Data

Many services store client or server IP addresses in databases, logs, caches, and message queues using fixed-width fields (32-bit integers, CHAR(15)) or parsers that accept dotted decimal only. IPv6 requires structured address types (128-bit binary, or text with adequate length) and family-aware comparison.

Affected areas include:

  • Geolocation databases (for example, MaxMind and similar) used for compliance, fraud, and ad targeting --- coverage and accuracy for IPv6 vary widely.
  • Real User Monitoring (RUM) and DNS steering products that map clients to "nearest" PoP --- if the probe or edge logic is IPv4-only, steering decisions silently degrade for IPv6 clients.
  • Rate limiting and abuse detection keyed on "IP" strings with naive splitting on . characters.

Refactoring often touches every schema, serializer, and analytics job that touched the field --- plan migration as a program, not a one-line fix.

5.9. Databases, ACLs, and Security Tools

MySQL and MariaDB host-based ACLs are historically string comparisons on the client address field. IPv6 literals contain colons and zone identifiers; copying IPv4 ACL patterns without testing produces false denials or overly broad grants. Test USER@'2001:db8::/32'-style entries explicitly.

Security agents (EDR, IDS, WAF) may lack IPv6 decode paths even when they claim dual-stack support. Validate both directions --- ingress to the service and egress from the service --- under IPv6-only client paths. The same teams can extend PR checks with static analysis rules (see Section 4.4.3).

5.10. Language Runtimes and Libraries

Python exposes several deprecated socket helpers that are IPv4-only or return only one address, yet remain common in production code and older tutorials. Examples include:

  • socket.gethostbyname() and socket.gethostbyname_ex() --- resolve a name to IPv4 only; use socket.getaddrinfo() and iterate all results (see Section 5.5).
  • socket.gethostbyaddr() --- reverse lookup with IPv4-centric assumptions; prefer getnameinfo() with a binary sockaddr from the connection.
  • socket.inet_aton() and socket.inet_ntoa() --- convert IPv4 literals only; use socket.inet_pton() and socket.inet_ntop() for both address families.

These APIs will not return IPv6 even when the host has AAAA records and IPv6 connectivity. Replacing them is rarely a one-line change --- call sites, tests, and error handling often assume 32-bit or dotted-decimal form.

Other languages have similar legacy (inet_aton assumptions, IPv4-only standard library gaps). Code review checklists SHOULD include:

  • No unparsed string IPs in business logic
  • Resolve names with a full-list API (see Section 5.5); never call legacy one-address helpers in new code
  • Tests that run against IPv6 literals and DNS names with AAAA records

6. Security Considerations

IPv6 restores global routability; absence of NAT is not absence of need for firewall policy. ULAs and link-local addresses still require filtering at boundaries. ICMPv6 filtering must preserve ND and PMTUD. Application-level ACLs and security products must parse IPv6 literals correctly (see Section 4.4).

Security appliances and host security software are notoriously weak on IPv6 --- incomplete decode, IPv4-only dashboards, agents that drop or mislabel v6 traffic, and policies that silently fail open or closed. Engage the security organization very early in the IPv6 program --- as a Part I stakeholder gate (see Section 2.3), in parallel with out-of-band and network design (see Section 5.1). In many enterprises, application SREs do not have full visibility into which tools the security team deploys; there is often deliberate operational secrecy around EDR, NDR, DLP, and forensics platforms. Assume unknown agents exist on every host until proven otherwise (see Section 3.8.3); establish a shared readiness process with security leadership rather than discovering blockers during the first IPv6-only pilot.

Security monitoring systems MUST receive IPv6 traffic mirrors, tap coverage, and metadata on parity with IPv4 before declaring IPv6 production-ready. Validate that incident response playbooks (pcap collection, IP blocking, geo blocking, threat intel feeds) work with 128-bit addresses and canonical text forms [RFC5952]. PR static analysis for IPv4-only patterns (see Section 4.4.3) complements but does not replace security-tool qualification.

Operator inventory practices in Section 4.4 also reduce supply-chain risk from undeclared IPv4-only dependencies in the control plane.

7. IANA Considerations

This document has no IANA actions.

8. Acknowledgments

The authors thank the following people who contributed suggestions and editorial improvements to this document:

9. Normative References

[RFC1918]
Rekhter, Y., Moskowitz, B., Karrenberg, D., de Groot, G. J., and E. Lear, "Address Allocation for Private Internets", BCP 5, RFC 1918, DOI 10.17487/RFC1918, , <https://www.rfc-editor.org/info/rfc1918>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC3493]
Gilligan, R., Thomson, S., Bound, J., McCann, J., and W. Stevens, "Basic Socket Interface Extensions for IPv6", RFC 3493, DOI 10.17487/RFC3493, , <https://www.rfc-editor.org/info/rfc3493>.
[RFC3596]
Thomson, S., Huitema, C., Ksinant, V., and M. Souissi, "DNS Extensions to Support IP Version 6", STD 88, RFC 3596, DOI 10.17487/RFC3596, , <https://www.rfc-editor.org/info/rfc3596>.
[RFC3849]
Huston, G., Lord, A., and P. Smith, "IPv6 Address Prefix Reserved for Documentation", RFC 3849, DOI 10.17487/RFC3849, , <https://www.rfc-editor.org/info/rfc3849>.
[RFC4193]
Hinden, R. and B. Haberman, "Unique Local IPv6 Unicast Addresses", RFC 4193, DOI 10.17487/RFC4193, , <https://www.rfc-editor.org/info/rfc4193>.
[RFC4291]
Hinden, R. and S. Deering, "IP Version 6 Addressing Architecture", RFC 4291, DOI 10.17487/RFC4291, , <https://www.rfc-editor.org/info/rfc4291>.
[RFC4443]
Conta, A., Deering, S., and M. Gupta, Ed., "Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification", STD 89, RFC 4443, DOI 10.17487/RFC4443, , <https://www.rfc-editor.org/info/rfc4443>.
[RFC4704]
Volz, B., "The Dynamic Host Configuration Protocol for IPv6 (DHCPv6) Client Fully Qualified Domain Name (FQDN) Option", RFC 4704, DOI 10.17487/RFC4704, , <https://www.rfc-editor.org/info/rfc4704>.
[RFC4861]
Narten, T., Nordmark, E., Simpson, W., and H. Soliman, "Neighbor Discovery for IP version 6 (IPv6)", RFC 4861, DOI 10.17487/RFC4861, , <https://www.rfc-editor.org/info/rfc4861>.
[RFC4890]
Davies, E. and J. Mohacsi, "Recommendations for Filtering ICMPv6 Messages in Firewalls", RFC 4890, DOI 10.17487/RFC4890, , <https://www.rfc-editor.org/info/rfc4890>.
[RFC5737]
Arkko, J., Cotton, M., and L. Vegoda, "IPv4 Address Blocks Reserved for Documentation", RFC 5737, DOI 10.17487/RFC5737, , <https://www.rfc-editor.org/info/rfc5737>.
[RFC5952]
Kawamura, S. and M. Kawashima, "A Recommendation for IPv6 Address Text Representation", RFC 5952, DOI 10.17487/RFC5952, , <https://www.rfc-editor.org/info/rfc5952>.
[RFC6146]
Bagnulo, M., Matthews, P., and I. van Beijnum, "Stateful NAT64: Network Address and Protocol Translation from IPv6 Clients to IPv4 Servers", RFC 6146, DOI 10.17487/RFC6146, , <https://www.rfc-editor.org/info/rfc6146>.
[RFC6724]
Thaler, D., Ed., Draves, R., Matsumoto, A., and T. Chown, "Default Address Selection for Internet Protocol Version 6 (IPv6)", RFC 6724, DOI 10.17487/RFC6724, , <https://www.rfc-editor.org/info/rfc6724>.
[RFC6890]
Cotton, M., Vegoda, L., Bonica, R., Ed., and B. Haberman, "Special-Purpose IP Address Registries", BCP 153, RFC 6890, DOI 10.17487/RFC6890, , <https://www.rfc-editor.org/info/rfc6890>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC8200]
Deering, S. and R. Hinden, "Internet Protocol, Version 6 (IPv6) Specification", STD 86, RFC 8200, DOI 10.17487/RFC8200, , <https://www.rfc-editor.org/info/rfc8200>.
[RFC8201]
McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., "Path MTU Discovery for IP version 6", STD 87, RFC 8201, DOI 10.17487/RFC8201, , <https://www.rfc-editor.org/info/rfc8201>.
[RFC8415]
Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., Richardson, M., Jiang, S., Lemon, T., and T. Winters, "Dynamic Host Configuration Protocol for IPv6 (DHCPv6)", RFC 8415, DOI 10.17487/RFC8415, , <https://www.rfc-editor.org/info/rfc8415>.

10. Informative References

[ARCEP-IPV6-GUIDE]
ARCEP, "How to Deploy IPv6 in Your Enterprise (Guide for Enterprises)", , <https://www.arcep.fr/fileadmin/cru-1648459125/reprise/observatoire/ipv6/guide-entreprises-how-to-deploy-IPv6-march-2022.pdf>.
[ARIN-APPS-V6]
ARIN, "Preparing Applications for IPv6: A Software Developers Guide to Writing and Migrating Networked Applications for Use on IPv6 Networks", <https://www.arin.net/resources/guide/ipv6/preparing_apps_for_v6.pdf>.
[I-D.ietf-6man-rfc6724-update]
Buraglio, N., Chown, T., and J. Duncan, "Prioritizing known-local IPv6 ULAs through address selection policy", Work in Progress, Internet-Draft, draft-ietf-6man-rfc6724-update-25, , <https://datatracker.ietf.org/doc/html/draft-ietf-6man-rfc6724-update-25>.
[I-D.ietf-v6ops-ipv6-app-testing]
Tiesel, P. S., Linkova, J., Ouellette, K., and B. Patton, "Testing Applications' IPv6 Support", Work in Progress, Internet-Draft, draft-ietf-v6ops-ipv6-app-testing-02, , <https://datatracker.ietf.org/doc/html/draft-ietf-v6ops-ipv6-app-testing-02>.
[I-D.ietf-v6ops-ipv6-only]
Martinez, J. P., "IPv6-Only and IPv6-Mostly Terminology Definitions", Work in Progress, Internet-Draft, draft-ietf-v6ops-ipv6-only-02, , <https://datatracker.ietf.org/doc/html/draft-ietf-v6ops-ipv6-only-02>.
[I-D.martin-ipv6-addr-selection-updates]
Martin, F., Xiao, X., and B. E. Carpenter, "Updates to IPv6 Default Address Selection", Work in Progress, Internet-Draft, draft-martin-ipv6-addr-selection-updates-00, , <https://datatracker.ietf.org/doc/html/draft-martin-ipv6-addr-selection-updates-00>.
[RFC2606]
Eastlake 3rd, D. and A. Panitz, "Reserved Top Level DNS Names", BCP 32, RFC 2606, DOI 10.17487/RFC2606, , <https://www.rfc-editor.org/info/rfc2606>.
[RFC4038]
Shin, M., Ed., Hong, Y., Hagino, J., Savola, P., and E. M. Castro, "Application Aspects of IPv6 Transition", RFC 4038, DOI 10.17487/RFC4038, , <https://www.rfc-editor.org/info/rfc4038>.
[RFC7381]
Chittimaneni, K., Chown, T., Howard, L., Kuarsingh, V., Pouffary, Y., and E. Vyncke, "Enterprise IPv6 Deployment Guidelines", RFC 7381, DOI 10.17487/RFC7381, , <https://www.rfc-editor.org/info/rfc7381>.
[RFC8305]
Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: Better Connectivity Using Concurrency", RFC 8305, DOI 10.17487/RFC8305, , <https://www.rfc-editor.org/info/rfc8305>.
[RFC8899]
Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. Völker, "Packetization Layer Path MTU Discovery for Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, , <https://www.rfc-editor.org/info/rfc8899>.
[RFC9637]
Huston, G. and N. Buraglio, "Expanding the IPv6 Documentation Space", RFC 9637, DOI 10.17487/RFC9637, , <https://www.rfc-editor.org/info/rfc9637>.

Appendix A. IPv6 Fundamentals for Software Engineers

Software engineers who have worked only in IPv4 environments often discover that IPv6 is not "IPv4 with longer addresses." The differences below affect code, configuration, monitoring, and troubleshooting daily.

A.1. Address Size and Header Format

IPv4 addresses are 32 bits; IPv6 addresses are 128 bits [RFC8200]. The IPv4 header has a variable length because options are carried in the main header. The IPv6 header has a fixed 40-byte length, which simplifies fast-path processing on routers and hosts. Additional IPv6 options live in extension headers chained after the main header; routers do not need to process most extension headers for forwarding [RFC8200].

A.2. Checksums, Jumbo Frames, and Fragmentation

IPv6 removed the header checksum present in IPv4; integrity is assumed to be covered by upper-layer protocols (for example, TCP, UDP, and SCTP) and link layers where applicable [RFC8200]. Operators can use jumbo frames on supported paths to reduce per-packet overhead and acknowledgment rates on high-throughput links. Jumbo frames are an operational choice on the LAN and require end-to-end support; they are not an IPv6 requirement but are often easier to reason about once NAT middleboxes are removed.

IPv4 allowed routers to fragment packets in transit. IPv6 fragments only at endpoints [RFC8200]. If a packet exceeds the path MTU, the source discovers the limit through Path MTU Discovery (see Section 5.3) rather than relying on router fragmentation. Application teams that tune MSS or disable PMTUD on IPv4 often cannot copy those habits to IPv6: endpoints alone fragment, and paths that depended on router fragmentation or aggressive MSS clamping may fail until PMTUD (or DPLPMTUD [RFC8899]) works end-to-end (see Section 5.3).

A.3. ICMPv6 and Neighbor Discovery

IPv4 Address Resolution Protocol (ARP) is replaced in IPv6 by Neighbor Discovery (ND) carried in ICMPv6 [RFC4861] [RFC4443]. ND resolves addresses on the local link, discovers routers, and performs other essential functions. ICMPv6 therefore MUST NOT be blocked wholesale on IPv6 paths the way some IPv4 deployments block all ICMP. Blocking ICMPv6 breaks ND and PMTUD and produces failures that look like application bugs. Guidance exists to identify essential ICMPv6 traffic that should not be blocked [RFC4890].

A.4. End-to-End Connectivity

IPv4 data centers often rely on Network Address Translation (NAT), carrier-grade NAT (CGNAT), and overlapping private address space [RFC1918]. IPv6 restores the end-to-end principle: globally unique addresses (with deliberate exceptions noted below) can be routed on the Internet without translation. Routing replaces NAT for many multi-tenant container scenarios, which simplifies traffic inspection but requires disciplined prefix planning (see Section 3.1).

A.5. Address Types and Terminology

Careless use of the word "IPv6" causes outages. This document uses the following terms:

Link-local address: An address in fe80::/10 used only on a single link [RFC4291]. Link-local addresses are not routed on the Internet. On Linux, connecting to a link-local destination requires a zone identifier (for example, fe80::1%eth0) because the same link-local prefix exists on every interface.

Unique Local Address (ULA): An address in fc00::/7 intended for local use and not globally routed [RFC4193]. ULAs resemble IPv4 private space in purpose but are uncommon in many data center designs that use provider- aggregated global unicast space internally. Like IPv4 private address space, ULAs can create renumbering work when companies merge or networks are combined --- a data center network is never final.

Global Unicast Address (GUA): A globally routable IPv6 address assigned from an organization's allocation of IPv6 addresses.

Unlike IPv4, there is no RFC 1918 equivalent that dominates data center design. With rare exceptions (link-local, ULA, and special-purpose ranges in [RFC6890]), IPv6 unicast addresses are designed to be globally unique and routable. Security boundaries are enforced by routing policy and firewall rules, not by assuming addresses are inherently non-routable. We use two additional terms to distinguish addresses based on these policies:

Internal global unicast address: A globally routable IPv6 address used inside the data center. These addresses are reachable according to routing and security policy, not because they are "private."

External global unicast address: A globally routable address presented to clients on the Internet, often via load balancers or anycast.

Unlike IPv4, nodes typically have multiple IPv6 addresses assigned to each of their interfaces. The link-local addresses are necessary to participate in Neighbor Discovery and so serve a vital purpose even though they are not globally routable. Additionally, because so many IPv6 addresses are available, some machines may use multiple global addresses simultaneously for purposes such as privacy or temporary use. The number of addresses per host can matter for TCAM and ACL scale on switches and firewalls --- another reason to prefer an explicit addressing plan and to avoid unexpected autoconfigured addresses (see Section 3.2.1 and the RA/SLAAC double safeguard under Static Addressing, Router Advertisements, and IPAM).

Authors' Addresses

Franck Martin
Peachymango.org
Philipp S. Tiesel
SAP SE