|
| 1 | +--- |
| 2 | +title: IPv6-Resolved IPv4 Gateway |
| 3 | +abbrev: IPv6-Resolved IPv4 GW |
| 4 | +docname: draft-vanmook-intarea-ipv6-resolved-gateway-latest |
| 5 | +date: 2026-04-30 |
| 6 | +category: std |
| 7 | +ipr: trust200902 |
| 8 | +workgroup: intarea |
| 9 | +submissiontype: IETF |
| 10 | +consensus: true |
| 11 | +v: 3 |
| 12 | +keyword: Internet-Draft |
| 13 | + |
| 14 | +venue: |
| 15 | + github: "remcovanmook/draft-ipv6-resolved-gateway" |
| 16 | + |
| 17 | +stand_alone: yes |
| 18 | +pi: [toc, sortrefs, symrefs] |
| 19 | + |
| 20 | +author: |
| 21 | + - |
| 22 | + ins: R.S. van Mook |
| 23 | + name: Remco van Mook |
| 24 | + org: Asteroid International B.V. |
| 25 | + email: remco@asteroidhq.com |
| 26 | + |
| 27 | +normative: |
| 28 | + RFC4191: |
| 29 | + RFC4861: |
| 30 | + RFC6890: |
| 31 | + RFC8950: |
| 32 | + |
| 33 | +informative: |
| 34 | + RFC1122: |
| 35 | + RFC5737: |
| 36 | + RFC2132: |
| 37 | + RFC3927: |
| 38 | + RFC6105: |
| 39 | + RFC7600: |
| 40 | + RFC8925: |
| 41 | +--- abstract |
| 42 | + |
| 43 | +This document requests the allocation of the IPv4 special-purpose |
| 44 | +address `192.0.0.11/32` to enable IPv4 communication over IPv6-only |
| 45 | +networks without subnets, ARP, tunneling, or translation. Hosts |
| 46 | +configured with this address as their IPv4 default gateway resolve |
| 47 | +the next-hop link-layer address from the IPv6 neighbor cache instead |
| 48 | +of via ARP. IPv4 packets are carried natively, end-to-end. |
| 49 | + |
| 50 | +--- middle |
| 51 | + |
| 52 | +# Introduction |
| 53 | + |
| 54 | +Networks migrating to IPv6-only infrastructure still need to carry |
| 55 | +IPv4 traffic. Traditional mechanisms such as dual-stack, tunneling, |
| 56 | +and translation all reintroduce IPv4 at the infrastructure level. |
| 57 | +This document defines a special-purpose IPv4 address, `192.0.0.11`, |
| 58 | +that signals to a host stack that link-layer resolution for the |
| 59 | +IPv4 default gateway is derived from the link-layer address entry |
| 60 | +for the IPv6 default router in the neighbor cache {{RFC4861}}, |
| 61 | +rather than via ARP. The IPv4 routing table entry is unchanged; |
| 62 | +only the ARP resolution path is modified. This eliminates the |
| 63 | +need for IPv4 subnets and ARP on the local segment, removing |
| 64 | +the requirement for tunneling or translation at the first hop. |
| 65 | + |
| 66 | +# Conventions and Definitions |
| 67 | + |
| 68 | +{::boilerplate bcp14-tagged} |
| 69 | + |
| 70 | +# Problem Statement |
| 71 | + |
| 72 | +IPv4 next-hop resolution on a local link depends on ARP, which |
| 73 | +requires an IPv4 subnet to be configured on the link. In an |
| 74 | +IPv6-only network, no such subnet exists. Existing solutions |
| 75 | +-- dual-stack, tunneling, and translation-based approaches |
| 76 | +such as NAT64 -- generally require changes beyond the local |
| 77 | +segment. This document closes the first-hop resolution gap |
| 78 | +for IPv4 hosts on IPv6-only segments without requiring changes |
| 79 | +to host software, packet formats, or DHCPv4 clients. |
| 80 | + |
| 81 | +# Host Behavior and Next-Hop Resolution |
| 82 | + |
| 83 | +When a host is configured to use `192.0.0.11` as its IPv4 default |
| 84 | +gateway, the host's operating system MUST implement the following |
| 85 | +logic: |
| 86 | + |
| 87 | +1. The host MUST maintain a functional IPv6 Neighbor Discovery |
| 88 | + implementation per {{RFC4861}} on the same interface, |
| 89 | + including default router discovery and neighbor cache |
| 90 | + maintenance. No additional action specific to this mechanism |
| 91 | + is required at interface configuration time. |
| 92 | +2. When the next hop for an IPv4 packet is `192.0.0.11`, the host |
| 93 | + MUST NOT perform ARP. Instead, it consults the IPv6 default |
| 94 | + router list and neighbor cache for the link-layer address, |
| 95 | + scoped to the interface on which `192.0.0.11` is configured |
| 96 | + as the IPv4 default gateway. |
| 97 | +3. If the IPv6 default router link-layer address is in a usable |
| 98 | + NUD state (REACHABLE, STALE, DELAY, or PROBE per {{RFC4861}}), |
| 99 | + the IPv4 packet is sent in a link-layer frame addressed to |
| 100 | + that destination. |
| 101 | +4. If no reachable IPv6 default router is known after the |
| 102 | + interface has completed initial configuration (i.e., at |
| 103 | + least one RA has been processed), the packet MAY be queued |
| 104 | + or dropped per implementation policy. If a last-known |
| 105 | + router address is available, a Neighbor Solicitation |
| 106 | + SHOULD be sent to that address. For behavior prior to |
| 107 | + first RA reception, see the startup paragraph below. |
| 108 | + |
| 109 | +Host stacks MUST treat `192.0.0.11` as a reserved address |
| 110 | +requiring IPv6-based next-hop resolution, regardless of other |
| 111 | +address configuration on the interface. This behavior is |
| 112 | +unconditional and not dependent on any additional signaling. |
| 113 | +When a DHCPv4 lease configuring `192.0.0.11` expires and |
| 114 | +is not renewed, the host SHOULD remove `192.0.0.11` as the |
| 115 | +IPv4 default gateway and cease IPv6-based resolution on that |
| 116 | +interface. For statically configured deployments, removal |
| 117 | +is governed by local administrative policy. |
| 118 | + |
| 119 | +Cross-interface resolution MUST NOT be performed. On multi-homed |
| 120 | +hosts, each interface independently resolves `192.0.0.11` against |
| 121 | +its own IPv6 neighbor cache state. |
| 122 | + |
| 123 | +The following pseudocode defines the resolution logic: |
| 124 | + |
| 125 | +~~~ |
| 126 | +on interface I (where 192.0.0.11 is the configured IPv4 gateway): |
| 127 | + |
| 128 | + if next-hop(pkt) == 192.0.0.11: |
| 129 | + |
| 130 | + routers = default_router_list(I) |
| 131 | + |
| 132 | + if routers is empty: |
| 133 | + if not first_ra_received(I): /* startup: MUST queue */ |
| 134 | + queue pkt |
| 135 | + else: /* mid-operation: MAY drop */ |
| 136 | + queue or drop pkt |
| 137 | + send Router Solicitation on I /* ff02::2; subject to |
| 138 | + RFC 4861 rate limiting */ |
| 139 | + return |
| 140 | + |
| 141 | + selected = select from routers by: |
| 142 | + 1. highest Default Router Preference (RFC 4191) |
| 143 | + 2. NUD state == REACHABLE /* if preference equal */ |
| 144 | + 3. implementation-defined /* if reachability equal */ |
| 145 | + |
| 146 | + lladdr = neighbor_cache(I, selected).lladdr |
| 147 | + |
| 148 | + if lladdr is valid and NUD state != INCOMPLETE: |
| 149 | + /* STALE, DELAY, and PROBE are usable; see RFC 4861 s7.3.3 */ |
| 150 | + send pkt in link-layer frame with dst = lladdr |
| 151 | + else: |
| 152 | + queue or drop pkt /* per implementation policy */ |
| 153 | + send Neighbor Solicitation for selected router on I |
| 154 | +~~~ |
| 155 | + |
| 156 | +Router selection uses Default Router Preference as defined in |
| 157 | +{{RFC4191}}. When multiple routers have equal preference and |
| 158 | +reachability, the tiebreaker is implementation-defined; use |
| 159 | +of most-recently-heard RA is one reasonable approach. |
| 160 | + |
| 161 | +If the selected IPv6 default router becomes unreachable during |
| 162 | +an active session, the host SHOULD re-evaluate the default |
| 163 | +router list and select an alternative. Existing transport |
| 164 | +sessions will be disrupted if the link-layer next-hop changes; |
| 165 | +this is consistent with IPv6 router failure behavior and is not |
| 166 | +specific to this mechanism. Packets queued for a router that |
| 167 | +has become unreachable SHOULD be flushed and re-evaluated |
| 168 | +against the updated router selection. |
| 169 | + |
| 170 | +Each time an interface transitions to an operational state |
| 171 | +and begins RA solicitation, a host may receive DHCPv4 |
| 172 | +configuration before any RA has been processed. Until a |
| 173 | +reachable IPv6 default router is known, IPv4 packets MUST |
| 174 | +be queued rather than silently dropped, pending RA reception. |
| 175 | +Implementations SHOULD bound this queue duration to avoid |
| 176 | +indefinite resource consumption. On queue timeout, packets |
| 177 | +SHOULD be dropped and an ICMPv4 Host Unreachable message |
| 178 | +MAY be generated toward the sending application. |
| 179 | + |
| 180 | +# Router Behavior |
| 181 | + |
| 182 | +## End-to-End Packet Flow |
| 183 | + |
| 184 | +In this model, end hosts are assigned IPv4 addresses with a /32 |
| 185 | +prefix length. No IPv4 prefix is configured on the link; a |
| 186 | +sending host directs all IPv4 traffic to the first-hop router |
| 187 | +using the link-layer address derived from the IPv6 neighbor cache. |
| 188 | +A host cannot resolve another host's IPv4 address on the |
| 189 | +local link without router assistance; direct host-to-host |
| 190 | +IPv4 communication on the segment may occur via ICMPv4 redirect |
| 191 | +({{RFC1122}}, Section 3.2.2.2) from the gateway, but cannot be |
| 192 | +initiated by the host alone. |
| 193 | + |
| 194 | +For return traffic to reach end hosts, operators MUST ensure |
| 195 | +that host /32 routes with an IPv6 next-hop per {{RFC8950}} |
| 196 | +are present in the routing infrastructure, allowing routers |
| 197 | +to forward IPv4 traffic toward the correct first-hop without |
| 198 | +requiring IPv4 addresses on any router interface. The mechanism |
| 199 | +by which the routing infrastructure learns these host routes is |
| 200 | +outside the scope of this document. |
| 201 | + |
| 202 | +The following diagram illustrates the end-to-end packet flow. |
| 203 | +Router-to-router forwarding uses {{RFC8950}}; no IPv4 address |
| 204 | +is configured on any router interface. IPv4 addresses used in |
| 205 | +the diagram are from the documentation ranges defined in |
| 206 | +{{?RFC5737}} and are not globally routable. |
| 207 | + |
| 208 | +~~~ |
| 209 | +Host A Router R1 |
| 210 | +IPv4: 198.51.100.1/32 (no IPv4 address configured) |
| 211 | +IPv6: 2001:db8:1::1 IPv6 link-local: fe80::R1 |
| 212 | + |
| 213 | + [1] IPv4 pkt (src: 198.51.100.1, dst: 203.0.113.5) |
| 214 | + L2 dst: MAC(R1) -- resolved from ND cache, no ARP |
| 215 | + ----------------------------------------------------> |
| 216 | + |
| 217 | +Router R1 Router R2 |
| 218 | +(no IPv4 address) (no IPv4 address configured) |
| 219 | +IPv6 link-local: fe80::R1 IPv6 link-local: fe80::R2 |
| 220 | + |
| 221 | + [2] FIB lookup: 203.0.113.5/32 via fe80::R2 (RFC 8950) |
| 222 | + L2 dst: MAC(R2) -- resolved from ND cache, no ARP |
| 223 | + ----------------------------------------------------> |
| 224 | + |
| 225 | +Router R2 Host B |
| 226 | +(no IPv4 address) IPv4: 203.0.113.5/32 |
| 227 | +IPv6 link-local: fe80::R2 IPv6: 2001:db8:2::2 |
| 228 | + |
| 229 | + [3] FIB lookup: 203.0.113.5/32 via fe80::HostB (ND) |
| 230 | + L2 dst: MAC(HostB) -- resolved from ND cache, no ARP |
| 231 | + ----------------------------------------------------> |
| 232 | + [4] IPv4 packet delivered to Host B |
| 233 | +~~~ |
| 234 | + |
| 235 | +No ARP is exchanged at any point. |
| 236 | + |
| 237 | +## Router Ingress Behavior |
| 238 | + |
| 239 | +Routers MUST treat `192.0.0.11` as an interface-scoped |
| 240 | +address -- valid only on the interface on which it is |
| 241 | +configured, and only for locally-terminated traffic. |
| 242 | +Specifically: |
| 243 | + |
| 244 | +- It MUST NOT be injected into any routing protocol. |
| 245 | +- It MUST NOT trigger overlapping-subnet checks. |
| 246 | +- It MUST NOT appear as source or destination in any |
| 247 | + forwarded packet. |
| 248 | + |
| 249 | +A router MAY respond to ICMPv4 echo requests addressed to |
| 250 | +`192.0.0.11` and MAY generate ICMPv4 Time Exceeded messages using |
| 251 | +`192.0.0.11` as the source address. All such messages are |
| 252 | +interface-local. |
| 253 | + |
| 254 | +ICMPv4 error generation on IPv6-only transit routers is out of |
| 255 | +scope; see {{RFC7600}}. |
| 256 | + |
| 257 | +## Backward Compatibility: Router ARP Response |
| 258 | + |
| 259 | +The use of `192.0.0.11` as the DHCPv4 Router Option (Option 3) |
| 260 | +value is fully conformant with {{RFC2132}}, which imposes no |
| 261 | +requirement that the router address be reachable via ARP on |
| 262 | +the same subnet. |
| 263 | + |
| 264 | +Unmodified hosts receiving `192.0.0.11` as their IPv4 default |
| 265 | +gateway will issue an ARP request for it. A router SHOULD respond |
| 266 | +to such ARP requests with its own MAC address. This is not proxy |
| 267 | +ARP: no subnet exists, no remote host is being proxied. |
| 268 | + |
| 269 | +This enables a two-tier deployment model on the same L2 segment: |
| 270 | + |
| 271 | +- **Unmodified hosts:** router answers ARP; IPv4 forwarding works |
| 272 | + with zero host-side changes. |
| 273 | +- **Updated hosts:** link-layer address resolved from IPv6 neighbor |
| 274 | + cache; ARP eliminated entirely. |
| 275 | + |
| 276 | +Both tiers interoperate, allowing incremental deployment. |
| 277 | +The router requires no per-host state to support both |
| 278 | +tiers simultaneously: updated hosts will not send ARP |
| 279 | +requests for `192.0.0.11`, so the router's ARP response |
| 280 | +behavior is triggered only by unmodified hosts. |
| 281 | + |
| 282 | +# Deployment Considerations |
| 283 | + |
| 284 | +This mechanism complements {{RFC8925}} (IPv6-Only Preferred |
| 285 | +Option). RFC 8925 allows hosts to signal a preference for |
| 286 | +IPv6-only operation, but operators must still provide IPv4 |
| 287 | +for hosts or applications that require it. This document |
| 288 | +provides exactly that fallback: IPv4 connectivity on an |
| 289 | +IPv6-only segment, without requiring a dual-stack |
| 290 | +infrastructure or an IPv4 subnet on the local link. A host |
| 291 | +that receives Option 108 and transitions to IPv6-only |
| 292 | +operation retains functional IPv4 connectivity via |
| 293 | +`192.0.0.11` without any additional configuration. |
| 294 | + |
| 295 | +Hosts without an IPv6 stack are outside the scope of this |
| 296 | +document. |
| 297 | + |
| 298 | +On segments with multiple routers advertising equal Default |
| 299 | +Router Preference -- common in datacenter ECMP fabrics -- hosts |
| 300 | +may make inconsistent router selections based on RA timing. |
| 301 | +Operators SHOULD configure explicit Default Router Preference |
| 302 | +values per {{RFC4191}} to ensure deterministic behavior. |
| 303 | + |
| 304 | +Implementations in which IPv4 and IPv6 stacks are managed by |
| 305 | +separate processes -- as is common on mobile operating systems -- |
| 306 | +will require inter-process communication to expose the IPv6 |
| 307 | +neighbor cache to the IPv4 forwarding path. This is an |
| 308 | +implementation consideration and does not affect the on-wire |
| 309 | +behavior defined in this document. |
| 310 | + |
| 311 | +# Security Considerations |
| 312 | + |
| 313 | +In the updated-host deployment model, ARP is eliminated from the |
| 314 | +network entirely. In the unmodified-host model, ARP is constrained |
| 315 | +to a single well-known address, reducing the ARP attack surface |
| 316 | +relative to conventional dual-stack networks. |
| 317 | + |
| 318 | +The mechanism relies on the integrity of IPv6 Neighbor Discovery. |
| 319 | +Rogue RA risks apply as in any IPv6 deployment and can be |
| 320 | +mitigated with RA Guard {{RFC6105}}. Subnet scanning is |
| 321 | +mitigated since hosts carry /32 addresses only. |
| 322 | + |
| 323 | +A host receiving `192.0.0.11` as its IPv4 default gateway |
| 324 | +on a network that does not implement this mechanism will issue |
| 325 | +an ARP request that receives no response, causing IPv4 |
| 326 | +connectivity to fail silently. Operators SHOULD ensure |
| 327 | +`192.0.0.11` is only offered via DHCPv4 on segments where |
| 328 | +the mechanism is deployed. DHCPv4 snooping and dynamic ARP |
| 329 | +inspection, where used, MUST be configured to permit ARP |
| 330 | +responses for `192.0.0.11` from the first-hop router. |
| 331 | + |
| 332 | +This mechanism does not interact with IPv4 link-local address |
| 333 | +configuration per {{RFC3927}}. A host configured with |
| 334 | +`192.0.0.11` as its gateway and a link-local IPv4 source |
| 335 | +address will follow the same resolution logic defined in |
| 336 | +Section 4 (Host Behavior and Next-Hop Resolution). |
| 337 | + |
| 338 | +# Implementation Requirements |
| 339 | + |
| 340 | +[PLACEHOLDER: This section will document conformance |
| 341 | +requirements and reference known implementations prior |
| 342 | +to IETF Last Call. An implementation is conformant if |
| 343 | +it satisfies all MUST and MUST NOT requirements in |
| 344 | +Sections 4 and 5. A reference implementation is |
| 345 | +available at https://github.com/remcovanmook/v4-with-v6-nh.] |
| 346 | + |
| 347 | +# IANA Considerations |
| 348 | + |
| 349 | +This document requests that IANA assign `192.0.0.11/32` in the |
| 350 | +"IANA IPv4 Special-Purpose Address Registry" {{RFC6890}} as follows: |
| 351 | + |
| 352 | +| Field | Value | |
| 353 | +|----------------------|--------------------------------| |
| 354 | +| Address Block | 192.0.0.11/32 | |
| 355 | +| Name | IPv4 Gateway via IPv6 Resolution | |
| 356 | +| RFC | This document | |
| 357 | +| Allocation Date | (date of publication) | |
| 358 | +| Termination Date | N/A | |
| 359 | +| Source | True | |
| 360 | +| Destination | True | |
| 361 | +| Forwardable | False | |
| 362 | +| Globally Reachable | False | |
| 363 | +| Reserved-by-Protocol | False | |
| 364 | + |
| 365 | +The Destination=True designation reflects that `192.0.0.11` |
| 366 | +may appear as a destination in ICMPv4 messages received by |
| 367 | +the router on a local interface (see Section 5.2). It does |
| 368 | +not imply global reachability; Forwardable=False and |
| 369 | +Globally Reachable=False together preclude any use of this |
| 370 | +address beyond the local link. |
| 371 | + |
| 372 | +--- back |
| 373 | + |
| 374 | +# Acknowledgements |
| 375 | + |
| 376 | +The author thanks Tobias Fiebig, Warren Kumari, and Jen Linkova. |
0 commit comments