<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="info" docName="draft-ietf-v6ops-siit-dc-01" ipr="trust200902">

  <front>
    <title abbrev="SIIT-DC">SIIT-DC: Stateless IP/ICMP Translation for IPv6
    Data Centre Environments</title>
    <author fullname="Tore Anderson" initials="T." surname="Anderson">
      <organization>Redpill Linpro</organization>
      <address>
        <postal>
          <street>Vitaminveien 1A</street>
          <!-- Embedding the postal code directly in the <city> element
               instead of using <code> in necessary to get correct Norwegian
               syntax. For more information, see:
               http://trac.tools.ietf.org/tools/xml2rfc/trac/ticket/280 -->
          <city>0485 Oslo</city>
          <country>Norway</country>
        </postal>
        <phone>+47 959 31 212</phone>
        <email>tore@redpill-linpro.com</email>
        <uri>http://www.redpill-linpro.com</uri>
      </address>
    </author>
    <date year="2015"/>
    <area>General</area>
    <workgroup>IPv6 Operations</workgroup>
    <abstract>
      <t>
      This document describes the use of the Stateless IP/ICMP Translation
      (SIIT) algorithm in an IPv6 Internet Data Centre (IDC). In this
      deployment model, traffic from legacy IPv4-only clients on the Internet
      is translated to IPv6 when reaches the IDC operator's network
      infrastructure. From that point on, it is treated just as if it was
      traffic from any other IPv6-capable end user. This facilitates a
      single-stack IPv6-only network infrastructure, as well as efficient
      utilisation of public IPv4 addresses.
      </t>
      <t>
      The primary audience is IDC operators who are deploying IPv6, running
      out of available IPv4 addresses, and/or feel that dual stack causes
      undesirable operational complexity.
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro" title="Introduction">
      <t>
      Historically, dual stack <xref target="RFC4213"/> <xref
      target="RFC6883"/> has been the recommended way to transition from a
      legacy IPv4-only environment to one capable of serving IPv6 users.
      However, for IDC operators, dual stack operation has a number of
      disadvantages compared to single stack operation. In particular, running
      two protocols rather than one results in increased complexity and
      operational overhead, with little return on investment for as long as
      large parts of the public Internet remains predominantly IPv4-only.
      Furthermore, the dual stack approach does not in any way help with the
      depletion of the IPv4 address space, which at the time of writing is a
      pressing concern in most parts of the world.
      </t>
      <t>
      Therefore, some IDC operators may instead prefer an approach in which
      they only need to operate one protocol in the data centre as they
      prepare for the future. SIIT-DC is one such approach. Its design goals
      include:
      </t>
      <t>
      <list style="symbols">
        <t>Promote the deployment of native IPv6 services (cf. <xref
        target="RFC6540"/>).</t>
        <t>Provide IPv4 service availability for legacy users with no loss of
        performance or functionality.</t>
        <t>To ensure that that the legacy users' IPv4 addresses remain visible
        to the nodes and applications.</t>
        <t>To conserve and maximise the utilisation of the operator's public
        IPv4 addresses.</t>
        <t>To avoid introducing more complexity than absolutely necessary,
        especially on the nodes and applications.</t>
        <t>To be easy to scale and deploy in a fault-tolerant manner.</t>
      </list>
      </t>
      <t>
      The following subsections elaborates on how SIIT-DC meets these goals.
      </t>
      <section anchor="intro_v6only" title="Single Stack IPv6 Operation">
        <t>
        SIIT-DC allows IDC operators to build their infrastructure and
        applications on an IPv6-only foundation. IPv4 end-user connectivity
        becomes a service provided by the network, which systems
        administration and application development staff do not need to
        concern themselves with. This promotes universal IPv6 deployment for
        the IDC operator's services and applications.
        </t>
        <t>
        SIIT-DC requires no special support or change from the underlying IPv6
        infrastructure, it is compatible with all standard IPv6 networks.
        Traffic between IPv6-enabled end users and IPv6-enabled services will
        always be transported native end-to-end; SIIT-DC does not intercept or
        handle native IPv6 traffic at all.
        </t>
        <t>
        When the day comes to discontinue all support for IPv4, no change
        needs to be made to the overall architecture - it's only a matter of
        shutting off the BRs. Operators who deploy native IPv6 along with
        SIIT-DC will thus avoid requiring any future migration or deployment
        projects relating to IPv6 deployment and/or IPv4 sun-setting.
        </t>
      </section>
      <section anchor="intro_stateless" title="Stateless Operation">
        <t>
        Unlike other solutions that provide either dual stack availability to
        single-stack services (e.g., <xref target="RFC6146">Stateful
        NAT64</xref> and Layer-4/7 proxies), or that provide conservation of
        IPv4 addresses (e.g., <xref target="RFC3022">NAPT44</xref>), SIIT-DC
        does not keep any state between each packet in a single connection or
        flow. In this sense it operates exactly like a regular IP router, and
        has similar scaling properties - the limiting factors are packets per
        second and bandwidth. The number of concurrent flows and flow
        initiation rates are irrelevant for performance.
        </t>
        <t>
        This not only allows individual BRs to easily attain "line rate"
        performance, it also allows for per-packet load balancing between
        multiple BRs using <xref target="RFC2991">Equal-Cost Multipath
        Routing</xref>. Asymmetric routing is also acceptable, which makes it
        easy to avoid sub-optimal traffic patterns; the prefixes involved may
        be anycasted from all the BRs in the provider's network, thus ensuring
        that the most optimal path through the network is used, even where the
        optimal path in one direction differs from the optimal path in the
        opposite direction.
        </t>
        <t>
        Finally, stateless operation means that high availability is easily
        achieved. If a BR should fail, its traffic can be re-routed onto
        another BR using a standard IP routing protocol. This does not impact
        existing flows any more than what any other IP re-routing event would.
        </t>
      </section>
      <section anchor="intro_v4conserv" title="IPv4 Address Conservation">
        <t>
        In most parts of the world, it is difficult or even impossible to
        obtain generously sized IPv4 delegation from the <xref
        target="RFC7020">Internet Numbers Registry System</xref>. The
        resulting scarcity in turn impacts individual end users and operators,
        which might be forced to purchase IPv4 addresses from other operators
        in order to cover their needs. This process can be risky to business
        continuity, in the case no suitable block for sale can be located,
        and/or turn out to be prohibitively expensive. In spite of this, an
        IDC operator will find that providing IPv4 service remains essential,
        as a large share of the Internet end users still do not have IPv6
        connectivity.
        </t>
        <t>
        A key goal of SIIT-DC is to help reduce a data centre operator's IPv4
        address requirement to the absolute minimum, by allowing the operator
        to remove them entirely from nodes and applications that do not need
        to communicate with endpoints in the IPv4 Internet. One example would
        be servers that are operating in a supporting/back-end role and only
        communicates with to other servers (database servers, file servers,
        and so on). Another example would be the network infrastructure itself
        (router-to-router links, loopback addresses, and so on). Furthermore,
        as LAN prefix sizes must always be rounded up to the nearest power of
        two (or larger, if one reserves space for future growth), even more
        IPv4 addresses will often end up being wasted without even being used.
        </t>
        <t>
        With SIIT-DC, the operator can remove these valuable IPv4 addresses
        from his back-end servers and network infrastructure, and reassign
        them to the SIIT-DC service as IPv4 Service Addresses. There exists no
        requirement that IPv4 Service Addresses are assigned in an aggregated
        manner, so there is nothing lost due to infrastructure overhead; every
        single IPv4 address assigned to SIIT-DC can be used an IPv4 Service
        Address.
        </t>
      </section>
      <section title="Clients' IPv4 Source Addresses Visible to Applications">
        <t>
        SIIT-DC uses the <xref target="RFC6052"/> algorithm to map the entire
        end-user's IPv4 source address into an predefined IPv6 Translation
        Prefix. This ensures that there is no loss of information; the
        end-user's IPv4 source address remains available to the application,
        allowing it to perform tasks like Geo-Location, logging, abuse
        handling, and so forth.
        </t>
      </section>
      <section anchor="intro_compat"
               title="Compatible with Standard IPv4 and IPv6 Stacks">
        <t>
        Except for the introduction of the BRs themselves, no change to the
        network, nodes, applications, or anything else is required in order to
        support SIIT-DC. SIIT-DC is practically invisible from the point of
        view of the IPv4 clients, the IPv6 nodes, the IPv6 data centre
        network, and the IPv4 Internet. SIIT-DC interoperates with all
        standards-compliant IPv4 or IPv6 stacks.
        </t>
      </section>
    </section>
    <section anchor="terminology" title="Terminology">
      <t>
      This document makes use of the following terms:
      </t>
      <t>
      <list style="hanging">
       <t hangText="SIIT-DC Border Relay (BR)"><vspace/>A device or a logical
       function that performs stateless protocol translation between IPv4 and
       IPv6 in accordance with <xref target="RFC6145"/> and <xref
       target="I-D.ietf-v6ops-siit-eam"/>.</t>
       <t hangText="SIIT-DC Edge Relay (ER)"><vspace/>A device or logical
       function that provides "native" IPv4 connectivity to IPv4-only devices
       or application software. It is very similar in function to a BR, but is
       typically located close to the IPv4-only component(s) it is supporting
       rather than on the IDC's outer network border. The ERs is an optional
       component of SIIT-DC. It is discussed in more detail in <xref
       target="I-D.ietf-v6ops-siit-dc-2xlat"/>.</t>
       <t hangText="IPv4 Service Address"><vspace/>A public IPv4 address with
       which IPv4-only clients communicates. This communication will be
       translated to IPv6 by a BR. The service's "IN A" DNS record will
       typically point to the IPv4 Service Address.</t>
       <t hangText="IPv4 Service Address Pool"><vspace/>One or more IPv4
       prefixes routed to the BR's IPv4 interface. IPv4 Service Addresses are
       allocated from this pool. That this does not necessarily have to be a
       "pool" per se, as it could also be one or more host routes (whose
       prefix length is equal to /32). The purpose of using a pool rather than
       host routes is to facilitate IPv4 route aggregation and ease
       provisioning of new IPv4 Service Addresses.</t>
       <t hangText="IPv6 Service Address"><vspace/>A public IPv6 address
       assigned to a node (such as a server or load-balancer) or an individual
       application in the IPv6 network. IPv6-capable clients communicate
       directly with the IPv6 Service Address using native IPv6. The service's
       "IN AAAA" DNS record will typically point to the IPv6 Service Address.
       IPv4-only clients indirectly communicate with the IPv6 Service Address
       through SIIT-DC.</t>
       <t hangText="Explicit Address Mapping (EAM)"><vspace/>A bi-directional
       coupling between an IPv4 Service Address and an IPv6 Service Address
       configured in a BR or ER. When translating between IPv4 and IPv6, the
       BR/ER changes the address fields in the translated packet's IP header
       according to any matching EAM. See <xref
       target="I-D.ietf-v6ops-siit-eam"/>.</t>
       <t hangText="Translation Prefix"><vspace/>An IPv6 prefix into which the
       entire IPv4 address space is mapped. This prefix is routed to the BR's
       IPv6 interface. It is either a Network-Specific Prefix or the
       Well-Known Prefix 64:ff9b::/96, cf. <xref target="RFC6052"/>. When
       translating between IPv4 and IPv6, a BR/ER inserts or removes the
       Translation Prefix from the address fields in the translated packet's
       IP header, unless an EAM for the IP address being translated
       exists.</t>
       <t hangText="IPv4-translatable IPv6 addresses"><vspace/>As defined in
       Section 1.3 of <xref target="RFC6052"/>.</t>
       <t hangText="IDC"><vspace/>Short for "Internet Data Centre"; a data
       centre whose main purpose is to deliver services to the public
       Internet, the use case SIIT-DC is primarily targeted at. IDCs are
       typically operated by Internet Content Providers or Managed Services
       Providers.</t>
       <t hangText="SIIT"><vspace/>The Stateless IP/ICMP Translation
       algorithm, as specified in <xref target="RFC6145"/>.</t>
       <t hangText="XLAT"><vspace/>Short for "translation".</t>
     </list>
     </t>
     <t>
     The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
     "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
     document are to be interpreted as described in <xref
     target="RFC2119"/>.
     </t>
    </section>
    <section anchor="overview" title="Architectural Overview">
      <t>
      This section describes the basic SIIT-DC architecture.
      <figure anchor="fig_architecture" align="center">
        <preamble>SIIT-DC Architecture</preamble>
        <artwork align="center"><![CDATA[
  IPv6-capable user      IPv4-only user
  <2001:db8::ab:cd>      <203.0.113.50>
    |                          |
 (the IPv6 internet)   (the IPv4 Internet)
    |                          |
    |  +-[BR]---------<192.0.2.0/24>--------------+
    |  |                                          |
    |  | EAM #1:      192.0.2.1,2001:db8:12:34::1 |
    |  | EAM #2..#n:  [...]                       |
    |  | XLAT Prefix: 2001:db8:46::/96            |
    |  |                                          |
    |  +------------<2001:db8:46::/96>------------+
    |                        |
   (the IPv6-only data centre network)
               |
+--<2001:db8:12:34::1>--[v6-only server]-+
|     |                                  |
| +-[2001:db8:12:34::1]--[v6-only app]-+ |
| |   AF_INET6 socket                  | |
| +------------------------------------+ |
+----------------------------------------+
        ]]></artwork>
      </figure>
      </t>
      <t>
      In <xref target="fig_architecture"/>, 192.0.2.0/24 is the IPv4 Service
      Address Pool. Individual IPv4 Service Addresses are assigned from this
      prefix, and traffic destined for it is routed to the BR's IPv4-facing
      network interface. There are no restrictions on how many IPv4 Service
      Address Pools are used or their prefix length, as long as they are all
      routed to the BR's IPv4-facing network interface.
      </t>
      <t>
      When translating packets between IPv4 and IPv6, the BR uses the EAM to
      replace any occurrence of the IPv4 Service Address (192.0.2.1) with its
      corresponding IPv6 Service Address (2001:db8:12:34::1). Addresses that
      do not match any EAM configured in the BR are translated by inserting or
      removing the Translation Prefix (2001:db8:46::/96), cf. <xref
      target="RFC6052">Section 2.2 of RFC6052</xref>.
      </t>
      <t>
      The BR can be deployed as a separate device or as a logical function in
      another multi-purpose device, such as an IP router. Any number of BRs
      may exist simultaneously in the IDC's network infrastructure, as long as
      they all configured with the same Translation Prefix and an identical
      EAM Table.
      </t>
      <t>
      The IPv6 Service Address of should be registered in DNS using an "IN
      AAAA" record, while its corresponding IPv4 Service Address should be
      registered using an "IN A" record. This ensures that IPv6-capable
      clients access the application/service directly using its native IPv6
      end-to-end, while IP4-only clients will access it through SIIT-DC.
      </t>
      <section title="Packet Flow">
        <t>
        In this example, the "IPv4-only user" from <xref
        target="fig_architecture"/> initiates a connection to the application
        running on the IPv6-only server. After first having looked up the "IN
        A" record in DNS, the user starts by transmitting an TCP SYN packet to
        the IPv4 Service Address. This IPv4 packet is routed to the BR, and is
        there translated to IPv6 as follows:
        </t>
        <t>
        <figure anchor="fig_xlat_v4v6" align="center">
          <preamble>IPv4 to IPv6 translation</preamble>
          <artwork align="center"><![CDATA[
+--[IPv4]----------+     +--[IPv6]-----------------------+
| SRC 203.0.113.50 |     | SRC 2001:db8:46::203.0.113.50 |
| DST 192.0.2.1    | --> | DST 2001:db8:12:34::1         |
| TCP SYN [..]     |     | TCP SYN [..]                  |
+------------------+     +-------------------------------+
          ]]></artwork>
        </figure>
        </t>
        <t>
        The resulting IPv6 packet is routed to the IPv6-only server, which
        processes and responds to it as if it had been a native IPv6 packet
        all along. The server's IPv6 response packet is then routed back to
        the BR, where it is translated back to IPv4 as follows:
        </t>
        <t>
        <figure anchor="fig_xlat_v6v4" align="center">
          <preamble>IPv6 to IPv4 translation</preamble>
          <artwork align="center"><![CDATA[
+--[IPv6]-----------------------+      +--[IPv4]----------+
| SRC 2001:db8:12:34::1         |      | SRC 192.0.2.1    |
| DST 2001:db8:46::203.0.113.50 | -->  | DST 203.0.113.50 |
| TCP SYN/ACK [..]              |      | TCP SYN/ACK [..] |
+-------------------------------+      +------------------+
          ]]></artwork>
        </figure>
        </t>
        <t>
        It is important to note that neither the IPv4 client nor the IPv6
        server/application need any special support to participate in SIIT-DC.
        However, the application may optionally be taught to extract the
        embedded IPv4 source address from incoming IPv6 packets with source
        addresses within the Translation Prefix. This will allow it to perform
        IPv4-specific tasks such as Geo-Location, logging, abuse handling, and
        so on.
        </t>
      </section>
    </section>
    <section title="Deployment Considerations and Guidelines">
      <section title="Application/Device Support for IPv6">
        <t>
        SIIT-DC as described in this document requires that the application
        (and/or the node the application is located on) supports IPv6
        networking, and that it has no dependency on local IPv4 network
        connectivity. However, SIIT-DC supports IPv4-dependent applications
        and nodes through the introduction of an ER. The ER provides the
        application or node with seemingly native IPv4 connectivity, by
        translating the packets (that were previously translated from IPv4 to
        IPv6) by the BR back to IPv4 before passing them to the IPv4-dependent
        application or node. This approach is described in more detail in
        <xref target="I-D.ietf-v6ops-siit-dc-2xlat"/>.
        </t>
      </section>
      <section title="Application Support for NAT">
        <t>
        The operator should carefully examine whether or not the application
        protocols he would like to use SIIT-DC with are able to operate in a
        network environment where rewriting of IP addresses occur. In general,
        if an application layer protocol works correctly through standard
        NAT44 (see <xref target="RFC3235"/>), it will most likely work
        correctly through SIIT-DC as well.
        </t>
        <t>
        Higher-level protocols that embed IP addresses as part of their
        payload are particularly problematic <xref target="RFC2663"/> <xref
        target="RFC2993"/> <xref target="RFC3022"/>. One well-known example of
        such a protocol is <xref target="RFC0959">FTP</xref>. Such protocols
        can be made to work with SIIT-DC through the introduction of an ER,
        which provides end-to-end IPv4 address transparency by reversing the
        translations performed by the BR before passing the packets to the
        NAT-incompatible application. This approach is described in more
        detail in <xref target="I-D.ietf-v6ops-siit-dc-2xlat"/>.
        </t>
      </section>
      <section title="Application Communication Pattern">
        <t>
        SIIT-DC is best suited for traditional client/server applications
        where IPv4-only clients on the Internet initiate traffic towards an
        IPv6-only service, which in turn is passively listening for inbound
        traffic and responding as necessary. In this case, an IPv4 client
        looks exactly like an native IPv6 client from the IPv6 service's point
        of view, and thus does not require any special treatment. One
        particularly common application protocol that follows this
        client/server communication pattern, and thus is ideally suited for
        use with SIIT-DC, is <xref target="RFC7230">HTTP</xref>.
        </t>
        <t>
        It is also possible to combine SIIT-DC with <xref
        target="RFC6147">DNS64</xref> in order to allow an IPv6-only
        application to initiate communication with IPv4-only nodes through
        SIIT-DC. However, in this case, care must be taken so that all
        outgoing communication is sourced from an IPv6 Service Address that is
        found in an EAM configured in the BR. If another address is used, the
        BR will most likely be unable to translate it to IPv4, causing the
        packet to be discarded. This could be prevented by altering the <xref
        target="RFC6724">Default Address Selection Policy Table</xref> on the
        IPv6 node.
        </t>
        <t>
        An alternative approach to the above would be to place an ER in front
        of the application in question, as described <xref
        target="I-D.ietf-v6ops-siit-dc-2xlat"/>. This provides the application
        with seemingly native IPv4 connectivity, which it may use freely for
        bi-directional communication with the IPv4 Internet. An application or
        node located behind an ER does not need to worry about selecting a
        specific source address, as it will only have valid options available.
        </t>
      </section>
      <section anchor="xlat_pfx" title="Choice of Translation Prefix">
        <t>
        Either a Network-Specific Prefix (NSP) from the provider's own IPv6
        address space or the IANA-allocated Well-Known Prefix 64:ff9b::/96
        (WKP) may be used. From a technical point of view, both work equally
        well. However, only a single WKP exists, so if a provider would like
        to deploy more than one instance of SIIT-DC in his network, or another
        translation technology such as <xref target="RFC6146">Stateful
        NAT64</xref>, the operator will be forced to use an NSP for all but
        one of those deployments.
        </t>
        <t>
        Another consideration is that the WKP cannot be used in inter-domain
        routing. By using an NSP instead, SIIT-DC will support a deployment
        where the BR and the IPv6 Service Address are located in different
        Autonomous Systems.
        </t>
        <t>
        The Translation Prefix may use any of the lengths described in <xref
        target="RFC6052">Section 2.2 of RFC6052</xref>, but /96 has two
        distinct advantages over the others. First, converting it to IPv4 can
        be done in a single operation by simply stripping off the first 96
        bits; second, it allows for IPv4 addresses to be embedded directly
        into the text representation of an IPv6 address using the familiar
        dotted quad notation, e.g., "2001:db8::198.51.100.10" (cf. <xref
        target="RFC6052">Section 2.4 of RFC6052</xref>)), instead of being
        converted to hexadecimal notation. This makes it easier to write IPv6
        ACLs and similar that match translated endpoints in the IPv4 Internet.
        </t>
        <t>
        For the reasons discussed above, this document recommends that an NSP
        with a prefix length of /96 is used. Section 3.3 of <xref
        target="RFC6052"/> discusses the choice of translation prefix in more
        detail.
        </t>
      </section>
      <section title="Routing Considerations">
        <t>
        The prefixes that constitute the IPv4 Service Address Pool and the
        IPv6 Translation Prefix may be routed to the BRs as any other IPv4 or
        IPv6 route in the provider's network. If more than one BR is being
        deployed, it is recommended that a routing protocol (IGP) used to
        advertise the routes within the provider's network. This will ensure
        that the traffic that is to be translated will reach the closest BR,
        reducing or eliminating sub-optimal traffic patterns, as well as
        providing high availability: Should one BR fail, the IGP will
        automatically redirect the traffic to the closest alternate BR.
        </t>
      </section>
      <section title="Location of the SIIT-DC Border Relays">
        <t>
        The goal of SIIT-DC is to facilitate a true IPv6-only application and
        network architecture, with the sole exception being the IPv4
        interfaces of the BRs and the network infrastructure required to
        connect the BRs to the IPv4 Internet. Therefore, the BRs must be
        located somewhere between the IPv4 Internet and the application
        delivery stack. This should be understood to include all servers, load
        balancers, firewalls, intrusion detection systems, and similar devices
        that are processing traffic to a greater extent than merely forwarding
        it.
        </t>
        <t>
        It is optimal to place the BRs as close as possible to the direct path
        between the location of the IPv6 Service Address and the end users. If
        the closest BR was located a long way from the direct path, all
        packets in both directions must make a detour in order to traverse the
        BR. This would increase the RTT between the service and the end user
        by by two times the extra latency incurred by the detour, as well as
        cause unnecessary load on the network links on the detour path.
        </t>
        <t>
        Where possible, it is beneficial to implement the BRs as a logical
        function within the routers would have handled the traffic anyway, had
        the topology been dual stacked. This way, a SIIT-DC deployment does
        not require separate networks ports (which might become saturated and
        impact the service quality), nor will it require extra rack space and
        energy. Some particularly good choices of the location could be within
        an IDC's access routers, or within the Autonomous System's border
        routers.
        </t>
        <t>
        Finally, another possibility is that the IDC operator outsources the
        SIIT-DC service to another entity, for example his upstream ISP. Doing
        so allows the IDC operator to build a true IPv6-only infrastructure.
        </t>
      </section>
      <section title="Migration from Dual Stack">
        <t>
        While this document mainly discusses the use of IPv6-only nodes and
        applications, it is important to note that SIIT-DC is fully compatible
        with dual stack infrastructures, including dual stack nodes and
        applications.
        </t>
        <t>
        Thus, migrating a dual-stacked service to an IPv6-only one where
        SIIT-DC provides the IPv4 Internet connectivity is easy. The operator
        would start out by designating the service's current native IPv6
        address as the IPv6 Service Address, and assign it a corresponding
        IPv4 Service Address. At this point, the service will respond on both
        its old (native) IPv4 address, and the SIIT-DC IPv4 Service Address.
        The operator may now move traffic from the former to the latter by
        changing the service's "IN A" DNS record. Once all IPv4 traffic has
        been successfully moved to SIIT-DC, the old IPv4 address may be
        reclaimed.
        </t>
      </section>
      <section title="Translation of ICMPv6 Errors to IPv4">
        <t>
        In response to an IPv4 packet subsequently translated to IPv6 by the
        BR, an IPv6 router in the IDC network may need to transmit an ICMPv6
        error back to the origin IPv4 node. By default, such an ICMPv6 error
        will most likely be discarded by the BR, unless the source address of
        the ICMPv6 error happens to be a IPv4-translatable IPv6 address or
        covered by an EAM.
        </t>
        <t>
        To facilitate reliable delivery of such ICMPv6 errors, an SIIT-DC
        operator SHOULD implement the recommendations in <xref
        target="RFC6791"/> in the BRs.
        </t>
      </section>
      <section title="MTU and Fragmentation">
        <t>
        There are some key differences between IPv4 and IPv6 relating to
        packet sizes and fragmentation that one should consider when deploying
        SIIT-DC. They result in a few problematic corner cases, which can be
        dealt with in a few different ways. The following subsections will
        discuss these in detail, and provide operational guidance.
        </t>
        <t>
        In particular, the operator may find that relying on fragmentation in
        the IPv6 domain is undesired or even operationally impossible <xref
        target="I-D.taylor-v6ops-fragdrop"/>. For this reason, the
        recommendations in this section seeks to minimise the use of IPv6
        fragmentation.
        </t>
        <t>
        Unless otherwise stated, the following subsections assume that the MTU
        in both the IPv4 and IPv6 domains is 1500 bytes.
        </t>
        <section anchor="ip_hdr_size_diff"
                 title="IPv4/IPv6 Header Size Difference">
          <t>
          The IPv6 header is up to 20 bytes larger than the IPv4 header. This
          means that a full-size 1500 bytes large IPv4 packet cannot be
          translated to IPv6 without being fragmented, otherwise it would
          likely have resulted in a 1520 bytes large IPv6 packet.
          </t>
          <t>
          If the transport protocol used is TCP, this is generally not a
          problem, the IPv6 node will advertise a TCP MSS of 1440 bytes during
          the initial TCP handshake. This causes the IPv4 clients to never
          send larger packets than what can be translated to a single
          full-size IPv6 packet, eliminating any need for fragmentation.
          </t>
          <t>
          For other transport protocols, full-size IPv4 packets with the DF
          flag cleared will need to be fragmented by the BR. This may be
          avoided by increasing the Path MTU between the BR and the IPv6 nodes
          to 1520 bytes or greater. If this is done, the MTU on the IPv6 nodes
          themselves SHOULD NOT be increased accordingly, as doing so would
          cause them to undergo Path MTU Discovery for all destinations on the
          IPv6 Internet. The nodes MUST however be able to accept and process
          incoming packets larger than their own MTU. If the nodes' IPv6
          implementation allows the initial Path MTU to be set differently for
          specific destinations, it MAY be increased to 1520 for destinations
          within the Translation Prefix specifically.
          </t>
        </section>
        <section title="IPv6 Atomic Fragments">
          <t>
          In keeping with <xref target="RFC6145">the fifth paragraph of
          Section 4 of RFC6145</xref>, a stateless translator like a BR will
          by default add an IPv6 Fragmentation header to the resulting IPv6
          packet when translating an IPv4 packet with the Don't Fragment flag
          set to 0. This happens even though the resulting IPv6 packet isn't
          actually fragmented into several pieces, resulting in an IPv6 Atomic
          Fragment <xref target="RFC6946"/>. These Atomic Fragments are
          generally not useful in an IDC environment, and it is therefore
          recommended that this behaviour is disabled in the BRs. To this end,
          <xref target="RFC6145">Section 4 of RFC6145</xref> notes that the
          "translator MAY provide a configuration function that allows the
          translator not to include the Fragment Header for the non-fragmented
          IPv6 packets".
          </t>
          <t>
          Note that <xref
          target="I-D.ietf-6man-deprecate-atomfrag-generation"/> seeks to
          update <xref target="RFC6145"/>, making the functionality described
          above as the standard and only mode of operation.
          </t>
          <t>
          In IPv6, the Identification value is located inside the
          Fragmentation header. That means that if the generation of IPv6
          Atomic Fragments is disabled, the IPv4 Identification value will be
          lost during translation to IPv6. This could potentially confuse some
          diagnostic tools.
          </t>
        </section>
        <section title="Minimum Path MTU Difference Between IPv4 and IPv6">
          <t>
          <xref target="RFC2460">Section 5 of RFC2460</xref> specifies that
          the minimum IPv6 link MTU is 1280 bytes. Therefore, an IPv6 node can
          reasonably assume that if it transmits an IPv6 packet that is 1280
          bytes or smaller, it is guaranteed to reach its destination without
          requiring fragmentation or invoking the Path MTU Discovery algorithm
          <xref target="RFC1981"/>. However, this assumption might prove false
          if the destination is an IPv4 node reached through a protocol
          translator such as a BR, as the minimum IPv4 link MTU is 68 bytes.
          See <xref target="RFC0791">Section 3.2 of RFC791</xref>.
          </t>
          <t>
          <xref target="RFC6145">Section 5.1 of RFC6145</xref> specifies that
          a stateless translator should set the IPv4 Don't Fragment flag to 1
          when it translates a non-fragmented IPv6 packet to IPv4. This means
          that when the path to the destination IPv4 node contains an IPv4
          link with an MTU smaller than 1260 bytes (which corresponds to an
          IPv6 MTU smaller than 1280 bytes, cf. <xref
          target="ip_hdr_size_diff"/>), the Path MTU Discovery algorithm will
          be invoked, even if the original IPv6 packet was only 1280 bytes
          large. This happens as a result of the IPv4 router connecting to the
          IPv4 link with the small MTU returning an ICMPv4 Need To Fragment
          error with an MTU value smaller than 1260, which in turns is
          translated by the BR to an ICMPv6 Packet Too Big error with an MTU
          value smaller than 1280 which is then transmitted to the origin IPv6
          node.
          </t>
          <t>
          When an IPv6 node receives an ICMPv6 Packet Too Big error indicating
          an MTU value smaller than 1280, <xref target="RFC2460">the last
          paragraph of Section 5 of RFC2460</xref> gives it two choices on how
          to proceed:
          </t>
          <t>
          <list style="symbols">
            <t>It may reduce its Path MTU value to the value indicated in the
            Packet Too Big, i.e., limit the size of subsequent packets
            transmitted to that destination to the indicated value. This
            approach causes no problems for the SIIT-DC function, as it simply
            allows Path MTU Discovery to work transparently across the BR.</t>
            <t>It may reduce its Path MTU value to exactly 1280, and in
            addition include a Fragmentation header in subsequent packets sent
            to that destination. In other words, the IPv6 node will start
            emitting Atomic Fragments. The Fragmentation header signals to the
            the BR that the Don't Fragment flag should be set to 0 in the
            resulting IPv4 packet, and it also provides the Identification
            value.</t>
          </list>
          </t>
          <t>
          If the use of the IPv6 Fragmentation header is problematic, and the
          operator has IPv6 nodes that implement the second option above, the
          operator should consider enabling the functionality described as
          <xref target="RFC6145"> the "second approach" in Section 6 of
          RFC6145</xref>. This functionality changes the BR's behaviour as
          follows:
          </t>
          <t>
          <list style="symbols">
            <t>When translating ICMPv4 Need To Fragment to ICMPv6 Packet Too
            Big, the resulting packet will never contain an MTU value lower
            than 1280. This prevents the IPv6 nodes from generating Atomic
            Fragments.</t>
            <t>When translating IPv6 packets smaller than or equal to 1280
            bytes, the Don't Fragment flag in the resulting IPv4 packet will
            be set to 0. This ensures that in the eventuality that the path
            contains an IPv4 link with an MTU smaller than 1260, the IPv4
            router connected to that link will have the responsibility to
            fragment the packet before forwarding it towards its
            destination.</t>
          </list>
          </t>
          <t>
          In summary, this approach could be seen as prompting the IPv4
          protocol itself to provide the "link-specific fragmentation and
          reassembly at a layer below IPv6" required for links that "cannot
          convey a 1280-octet packet in one piece", to paraphrase <xref
          target="RFC2460">Section 5 of RFC2460</xref>.  Note that <xref
          target="I-D.ietf-6man-deprecate-atomfrag-generation"/> seeks to
          update <xref target="RFC6145"/>, making the approach described above
          as the standard and only mode of operation.
          </t>
        </section>
      </section>
      <section title="IPv4-translatable IPv6 Service Addresses">
        <t>
        SIIT-DC is designed so that the IPv6 Service Addresses are not
        required to be IPv4-translatable IPv6 addresses. <xref
        target="I-D.ietf-v6ops-siit-eam">Section 2 of
        I-D.ietf-v6ops-siit-eam</xref> discusses why it is desirable to avoid
        requiring the use of IPv4-translatable IPv6 addresses.
        </t>
        <t>
        It is however quite possible to deploy SIIT-DC in combination with
        IPv4-translatable IPv6 Service Addresses. The primary benefits in
        doing so are:
        </t>
        <t>
        <list style="symbols">
          <t>The operator is not required to provision EAMs for
          IPv4-translatable IPv6 Service Addresses onto the BR/ERs.</t>
          <t><xref target="RFC6145"/> translation can be performed in a
          checksum-neutral manner, cf. <xref target="RFC6052">Section 4.1 of
          RFC6052</xref>.</t>
        </list>
        </t>
        <t>
        The trade-off is that the IPv4-translatable IPv6 Service Addresses
        must be configured on the IPv6 nodes, and the applications must be set
        up to use them - likely in addition to their primary
        (non-IPv4-translatable) IPv6 addresses. The IPv4-translatable IPv6
        Service Addresses must also be routed from the BR through the IDC's
        IPv6 network infrastructure to the nodes on which they are assigned.
        This essentially requires the entire IPv6 infrastructure to be made
        aware of and handle translated IPv4 traffic as a special case, which
        significantly increases complexity. Avoiding such drawbacks is a
        design goal of SIIT-DC, cf.  <xref target="intro_v6only"/>, therefore
        the use of IPv4-translatable IPv6 Service Addresses is discouraged.
        </t>
      </section>
    </section>
    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>
      The author would like to thank the following individuals for their
      contributions, suggestions, corrections, and criticisms: Fred Baker,
      Cameron Byrne, Brian E Carpenter, Ross Chandler, Dagfinn Ilmari
      Mannsaaker, Lars Olafsen, Stig Sandbeck Mathisen, Knut A. Syed, Andrew
      Yourtchenko.
      </t>
    </section>
    <section anchor="IANA" title="IANA Considerations">
      <t>
      This draft makes no request of the IANA. The RFC Editor may remove this
      section prior to publication.
      </t>
    </section>
    <section anchor="Security" title="Security Considerations">
      <section title="Mistaking the Translation Prefix for a Trusted Network">
        <t>
        If a Network-Specific Prefix from the provider's own address space is
        chosen for the translation prefix, as recommended in <xref
        target="xlat_pfx"/>, care must be taken if the translation service is
        used in front of services that have application-level ACLs that
        distinguish between the operator's own networks and the Internet at
        large, as traffic from translated IPv4 end users on the Internet might
        appear to be originating from the provider's own network. It is
        therefore important that the translation prefix is treated the same as
        the Internet at large, rather than as a trusted network.
        </t>
        <t>
        In order to alleviate this problem, the operator may opt to use a
        Translation Prefix that is distinct from and not a subset of the IPv6
        prefixes used elsewhere in the network infrastructure.
        </t>
      </section>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119"?>
      <?rfc include="reference.RFC.6052"?>
      <?rfc include="reference.RFC.6145"?>
      <?rfc include="reference.RFC.6791"?>
      <?rfc include="reference.I-D.ietf-v6ops-siit-eam"?>
    </references>
    <references title="Informative References">
      <?rfc include="reference.RFC.0791"?>
      <?rfc include="reference.RFC.0959"?>
      <?rfc include="reference.RFC.1981"?>
      <?rfc include="reference.RFC.2460"?>
      <?rfc include="reference.RFC.2663"?>
      <?rfc include="reference.RFC.2991"?>
      <?rfc include="reference.RFC.2993"?>
      <?rfc include="reference.RFC.3022"?>
      <?rfc include="reference.RFC.3235"?>
      <?rfc include="reference.RFC.4213"?>
      <?rfc include="reference.RFC.6146"?>
      <?rfc include="reference.RFC.6147"?>
      <?rfc include="reference.RFC.6540"?>
      <?rfc include="reference.RFC.6724"?>
      <?rfc include="reference.RFC.6883"?>
      <?rfc include="reference.RFC.6946"?>
      <?rfc include="reference.RFC.7020"?>
      <?rfc include="reference.RFC.7230"?>
      <?rfc include="reference.I-D.ietf-v6ops-siit-dc-2xlat"?>
      <?rfc include="reference.I-D.ietf-6man-deprecate-atomfrag-generation"?>
      <?rfc include="reference.I-D.taylor-v6ops-fragdrop"?>
    </references>
    <section title="Complete SIIT-DC IDC topology example">
      <t>
      <xref target="fig_topology"/> attempts to "tie it all together" and show
      a more complete SIIT-DC topology, in order to better demonstrate its
      advantageous properties discussed in <xref target="intro"/>. These are
      discussed in more detail below.
      </t>
      <t>
      <figure anchor="fig_topology" align="center">
        <preamble>Example SIIT-DC IDC topology </preamble>
        <artwork align="center"><![CDATA[
             /--------------------------------\ /---------------\
             |          IPv4 Internet         | | IPv6 Internet |
             \-+----------------------------+-/ \--------+------/
               |                            |            |
               | <----------[BGP]---------> |          [BGP]
               |                            |            |
+-------<192.0.2.0/24>---------+ +---<192.0.2.0/24>---+  |
|                        BR #1 | | BR #2              |  |
| EAM Table:                   | |                    |  |
| ==========                   | |                    |  |
| 192.0.2.1,2001:db8:12:34::1  | |                    |  |
| 192.0.2.2,2001:db8:12:34::2  | |  Exactly the same  |  |
| 192.0.2.3,2001:db8:fe:dc::1  | |  configuration as  |  |
| 192.0.2.4,2001:db8:12:34::4  | |  BR #1 has         |  |
| 192.0.2.5,2001:db8:fe:dc::e  | |                    |  |
|                              | |                    |  |
| XLAT Prefix 2001:db8:46::/96 | |                    |  |
|                              | |                    |  |
+--------<2001:db8:46::/96>----+ +-<2001:db8:46::/96>-+  |
                  |                      |               |
                  | <------[ECMP]------> |               |
                  |                      |               |
/-----------------+----------------------+--\            |
|         IPv6 IDC network w/OSPFv3         +------------/
\-+--------------------------------+--------/
  |                                |
  | Tenant A's server LAN          | Tenant B's server LAN
  | 2001:db8:12:34::/64            | 2001:db8:fe:dc::/64
  |                                |
  +-- www      ::1 (IPv6+SIIT-DC)  +-- www-lb ::1 (IPv6+SIIT-DC)
  |                                |
  +-- mta      ::2 (IPv6+SIIT-DC)  +-- web ::80:01 (IPv6-only)
  |                                |   [...]
  +-- ftp      ::3 (IPv6)          +-- web ::80:99 (IPv6-only)
  |            ::4 (IPv4, via ER)  |
  |                                |         +----+
  +-- app01 ::a:01 (IPv6-only)     \---- ::e | ER | --\
  |   [...]                                  +----+   |
  +-  app99 ::a:99 (IPv6-only)                        |
  |                                  ftp 192.0.2.5 ---/
  +-- db01  ::d:01 (IPv6-only)
  |   [..]
  \-- db99  ::d:99 (IPv6-only)
        ]]></artwork>
      </figure>
      </t>
      <t>
      <list style="hanging">
        <t hangText="Single Stack IPv6 Operation"><vspace/>As discussed in
        <xref target="intro_v6only"/>, SIIT-DC facilitates an IPv6-only IDC
        network infrastructure. The only places where IPv4 is absolutely
        required is between the BRs and the IPv4 Internet, and between any ERs
        and the IPv4-only applications or devices they are serving
        (illustrated here as the two tenants' FTP servers). The figure also
        illustrates how SIIT-DC does not interfere with native IPv6; when
        there is no longer a need to support IPv4 clients, the BRs may be
        decommissioned without causing any impact to native IPv6 traffic.</t>
        <t hangText="Stateless Operation"><vspace/>As discussed in <xref
        target="intro_stateless"/>, SIIT-DC operates in a stateless fashion.
        In the illustration, both BRs are simultaneously advertising (i.e.,
        anycasting) the IPv4 Service Address Pool and the IPv6 Translation
        Prefix, so incoming traffic from the IPv4 Internet may arrive at
        either of the BRs, while outgoing IPv6 traffic destined for IPv4
        endpoints are load balanced between them using Equal-Cost Multipath
        Routing. No continuous state synchronisation between the two BRs
        occurs. Should one of the BRs fail, the BGP and OSPF protocols will
        ensure that traffic converges on the remaining BR. Existing sessions
        will not be disrupted, beyond any disruption caused by the BGP/OSPF
        convergence process itself.</t>
        <t hangText="IPv4 Address Conservation"><vspace/>As discussed in <xref
        target="intro_v4conserv"/>, SIIT-DC conserves the IDC operator's IPv4
        address space. Even though the two customers in the example above have
        several hundred servers, the majority of them are not used to run
        services made available directly from the Internet, and therefore do
        not need to consume IPv4 addresses. The IDC network infrastructure
        consumes no IPv4 addresses, either. Finally, the IPv4 addresses that
        are assigned to the SIIT-DC function as IPv4 Service Address Pools may
        assigned with 100% efficiency, one address at a time; there is no
        requirement to assign multiple addresses to a single customer in a
        contiguous block.</t>
        <t hangText="Application support"><vspace/>As discussed in <xref
        target="intro_compat"/>, as long as the application protocol is
        translation-friendly (illustrated here with HTTP and SMTP), it will
        work with SIIT-DC without requiring any special adaptation.
        Furthermore, translation-unfriendly applications (illustrated here
        with FTP) will also work when located behind an <xref
        target="I-D.ietf-v6ops-siit-dc-2xlat">ER</xref>. Tenant A's FTP server
        illustrates how an ER may be located in the networking stack of a
        node, while Tenant B's FTP server illustrates how the ER may be
        deployed as a network service. The latter approach enables SIIT-DC to
        support IPv4-only nodes/devices.</t>
      </list>
      </t>
    </section>
  </back>

</rfc>
<!-- vim: syntax=xml tw=78 ai fo=2 sw=2 et:
-->
