<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
    which is available here: http://xml.resource.org. -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6724 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6724.xml">
<!ENTITY RFC4193 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4193.xml">
<!ENTITY RFC6598 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6598.xml">
<!ENTITY RFC1918 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.1918.xml">
<!ENTITY RFC8305 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8305.xml">
<!ENTITY RFC3484 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3484.xml">
]>

<?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-buraglio-v6ops-ula-04" ipr="trust200902">

    <!-- ***** FRONT MATTER ***** -->

    <front>

        <title>Unintended Operational Issues With ULA</title>

        <author initials='N.' surname='Buraglio' fullname='Nick Buraglio'>
            <organization>Energy Sciences Network</organization>
            <address>
                <email>buraglio@es.net</email>
            </address>
        </author>


        <author initials='C.' surname='Cummings' fullname='Chris Cummings'>
            <organization>Energy Sciences Network</organization>
            <address>
                <email>chriscummings@es.net</email>
            </address>
        </author>


        <author initials='R.' surname='White' fullname='Russ White'>
            <organization>Juniper Networks</organization>
            <address>
                <email>russ@riw.us</email>
            </address>
        </author>

        <date/>

        <abstract>
            <t>The behavior of ULA addressing as defined by <xref target="RFC6724"/>
 is preferred below legacy IPv4 addressing, thus rendering ULA IPv6 deployment functionally unusable in IPv4 / IPv6 dual-stacked environments. This behavior is counter to the operational behavior of GUA IPv6 addressing on nearly all modern operating systems that leverage a preference model based on <xref target="RFC6724"/>
.</t>
    </abstract>

</front>

<middle>

    <section title="Introduction" toc="default">
        <t>In modern IPv4 / IPv6 dual-stacked environments, ULA addressing and GUA IPv6 addressing exhibit opposite behavior, which creates difficulties in deployments leveraging ULA addressing. This conflicting behavior carries planning, operational, and security implications for environments requiring ULA addressing with IPv4/IPv6 dual-stack and prioritization of IPv6 traffic by default, as is the behavior with IPv6 GUA addressing.</t>
    </section>    <!-- end of introduction -->


    <section title="Defining Well Known Unintended Operational Issues With ULA" toc="default">

        <t>The <xref target="RFC6724"/> definition is incomplete for ULA precedence if a host is operating in a dual-stack environment. 
    As written, <xref target="RFC6724"/> section 10.3 states 
   "The default policy table gives IPv6 addresses higher precedence than
   IPv4 addresses.  This means that applications will use IPv6 in
   preference to IPv4 when the two are equally suitable.  An
   administrator can change the policy table to prefer IPv4 addresses by
   giving the ::ffff:0.0.0.0/96 prefix a higher precedence"
 Expected behavior would be that ULA address space would be preferred over legacy IPv4, however this is not the case. This presents an acute issue with any environment that will use ULA addressing along side legacy IPv4 that is counter to the standard expectations for legacy IPv4 / IPv6 dual-stack behavior of preferring IPv6, as is performed with GUA addressing. 
 Further, <xref target="RFC6724"/> Section 10.6 states that this is resolvable by adding a site-specific policy to cause ULAs
   within a site to be preferred over global addresses. While theoretically possible, this presents signnificant issues on devices with inaccessable configuration files as detailed below. </t>


    </section>    <!-- end of Defining Well Known Unintended Operational Issues With ULA -->

    <section title="Operational Implications" toc="default">

        <t>There are demonstrated and easily repeatible uses cases of ULA not being preferred in some OS and network equipment over legacy IPv4 that necessitate the immediate update to <xref target="RFC6724"/>
to better reflect the original intent of the RFC. As with most adjustments to standards, and using <xref target="RFC6724"/>
itself as a measurment, this update will likely take between 8-20 years to become common enough for relatively consistent behavior within operating systems. As a reference, as of the time of this writing, it has been 10 years since <xref target="RFC6724"/>
has been published but we continue to see existing commercial and open source operating systems exhibiting <xref target="RFC3484"/>
behavior. While it should be noted that <xref target="RFC6724"/> defines a solution that is functional academically, operationally the solution of adjusting the address preference selection table 
is both operating system dependent and unable to be signalled by any network mechanism such as within a router advertisement, DHCPv6 option, or the like. This lack of an
intra-protocol or network-based ability to adjust address selection preference, along with the inability to adjust a notable number of operating systems either programmatically or manually 
renders operational scalability of such a mechanism functionally untenable.  
It is anticipated that any update of <xref target="RFC6724"/>would require an additional 8-20 years to be fully realized and properly implemented in a majority of network connected systems. In addition, in the current versions of Linux, 
the priority table (gai.conf) still makes reference to <xref target="RFC3484"/>, further demonstrating the long timeframe to have updates reflected in a current, modern operating system. Examples of such out-of-date behavior can be found in 
printers, cameras, fixed devices, IoT sensors, and longer lifecycle equipment. 
It is especially important to note this behavior in the long lifecycle equipment that exists in industrial control and operational techology environments due to their very long mean time to replacement. 
The core issue is the stated interpretation from gai.conf that has the following default:
</t>


<figure anchor="gai1">
<artwork align="left" name="" type="" alt=""><![CDATA[       
#scopev4  <mask> <value> 
#    Add another rule to the RFC 6724 scope table for IPv4 addresses. 
#    By default the scope IDs described in section 3.2 in RFC 6724 are
#    used.  Changing these defaults should hardly ever be necessary.
#    The defaults are equivalent to:
#
#scopev4 ::ffff:169.254.0.0/112  2
#scopev4 ::ffff:127.0.0.0/104    2
#scopev4 ::ffff:0.0.0.0/96       14
            ]]>
</artwork>
</figure>


<t> Notice that they are interpreting the legacy IPv4 address range as "scopev4" and the prefix ::ffff:0.0.0.0/96 which has a higher precedence (35) in <xref target="RFC6724"/>
 then the ULA prefix of fc00::/7 (3). This results in legacy IPv4 being preferred over IPv6 ULA.</t>

<t>The operational outcome is the move to dual-stack with ULA is inconsistent and imparts unnecessary difficulty for both troubleshooting and creating the baseline expected behavior which are both requirements for deployments. This results in operational and engineering teams not gaining IPv6 experience as limited traffic is actually using IPv6, and security baseline expectations are inconsistent at best and haphazard at worst.</t>

<t>In practice, <xref target="RFC6724"/>
 imposes several operational shortcomings preventing both consistent and desired behavior. If we define "desired behavior" as IPv6 preference over legacy IPv4 for address and protocol selection, then the resulting implemented behavior, based on <xref target="RFC6724"/>
, will fall short of that intent. Based on the current verbiage, dual-stacked hosts configured with both a legacy IPv4 address and an IPv6 ULA address, the resulting behavior will manifest as a host choosing IPv4 over ULA IPv6. This behavior deviates from the current goal of a host with legacy IPv4 address and also with an IPv6 GUA address preferring IPv6 over IPv4. Operationally and strategically, this manifests as an impediment to deployment of IPv6 for many non-service provider and mobile networks phasing in dual-stacked (both legacy IPv4 and IPv6) networking with the expectation of consistent behavior (alway use IPv6 before legacy IPv4).</t>

<t>Other operational considerations are the use of the policy table detailed in section 2.1 of <xref target="RFC6724"/>
. While conceptually the intent was for a configurable, longest-match table to be adjusted as-needed. In practice, modifying the prefix policy table remains difficult across platforms, and in some cases impossible. Embedded, proprietary, closed source, and IoT devices are especially difficult to adjust and are, in many cases, incapable of any adjustment whatsoever. Large scale manipulation of the policy table also remains out of the realm of realistic support for small and medium scale operators due to lack of ability to manipulate all the hosts and systems, or a lack of tooling and access.</t>

<t>Below is an example of a gai.conf file from a modern Linux installation as of 03 April 2022: </t>

<figure anchor="gai2">
<artwork align="left" name="" type="" alt=""><![CDATA[       
# Configuration for getaddrinfo(3).
#
# So far only configuration for the destination address sorting is needed.
# RFC 3484 governs the sorting.  But the RFC also says that system
# administrators should be able to overwrite the defaults.  This can be
# achieved here.
#
# All lines have an initial identifier specifying the option followed by
# up to two values.  Information specified in this file replaces the
# default information.  Complete absence of data of one kind causes the
# appropriate default information to be used.  The supported commands include:
#
# reload  <yes|no>
#    If set to yes, each getaddrinfo(3) call will check whether this file
#    changed and if necessary reload.  This option should not really be
#    used.  There are possible runtime problems.  The default is no.
#
# label   <mask>   <value>
#    Add another rule to the RFC 3484 label table.  See section 2.1 in
#    RFC 3484.  The default is:
#
#label ::1/128       0
#label ::/0          1
#label 2002::/16     2
#label ::/96         3
#label ::ffff:0:0/96 4
#label fec0::/10     5
#label fc00::/7      6
#label 2001:0::/32   7
#
#    This default differs from the tables given in RFC 3484 by handling
#    (now obsolete) site-local IPv6 addresses and Unique Local Addresses.
#    The reason for this difference is that these addresses are never
#    NATed while IPv4 site-local addresses most probably are.  Given
#    the precedence of IPv6 over IPv4 (see below) on machines having only
#    site-local IPv4 and IPv6 addresses a lookup for a global address would
#    see the IPv6 be preferred.  The result is a long delay because the
#    site-local IPv6 addresses cannot be used while the IPv4 address is
#    (at least for the foreseeable future) NATed.  We also treat Teredo
#    tunnels special.
#
# precedence  <mask>   <value>
#    Add another rule to the RFC 3484 precedence table.  See section 2.1
#    and 10.3 in RFC 3484.  The default is:
#
#precedence  ::1/128       50
#precedence  ::/0          40
#precedence  2002::/16     30
#precedence ::/96          20
#precedence ::ffff:0:0/96  10
#
#    For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96  100

#
# scopev4  <mask>  <value>
#    Add another rule to the RFC 6724 scope table for IPv4 addresses.
#    By default the scope IDs described in section 3.2 in RFC 6724 are
#    used.  Changing these defaults should hardly ever be necessary.
#    The defaults are equivalent to:
#
#scopev4 ::ffff:169.254.0.0/112  2
#scopev4 ::ffff:127.0.0.0/104    2
#scopev4 ::ffff:0.0.0.0/96       14
            ]]>
</artwork>
</figure>

<t>Several assumptions are made here and are largely based on interpretations of <xref target="RFC6724"/>
 but are not operationally relevant in modern networks. As this file or an equivalent structure within a given operating system is referenced, it dictates the 
 behavior of the getaddrinfo() or analogous process. More specifically, where getaddrinfo() or comparable API is used, the sorting behavior should take into account both 
 the source address of the requesting host as well as the destination addresses returned and sort according to both source and destination addressing, i.e, when a ULA address is 
 returned, the source address selection should return and use a ULA address if available. Similarly, if a GUA address is returned the source address selection should return 
 a GUA source address if available.</t>

<t>Here are some example failure modes:
<list style="numbers">
<t>ULA per <xref target="RFC6724"/>
 is less preferred (the Precedence value is lower) than all legacy IPv4 (represented by ::ffff:0:0/96 in the aforementioned table).</t>
<t>Because of the lower Precedence value of fc00::/7, if a host has legacy IPv4 enabled, it will use legacy IPv4 before using ULA.</t>
<t>A dual-stacked client will source the traffic from the legacy IPv4 address, meaning it will require a corresponding legacy IPv4 destination address.</t>
</list>
</t>



<t>Per number 3, even a host choosing a destination with A and AAAA DNS records, the host in question will choose the A record to get an legacy IPv4 address for the destination, meaning ULA IPv6 is rendered completely unused. It is also notable that Happy Eyeballs (<xref target="RFC8305"/>
) will not change the source address selection process on a host. Happy Eyeballs will only modify the destination sorting process.</t>

<t>As a direct result of the described failure modes, and in addition to the aforementioned operational implications, use of ULA is not a viable option for dual-stack \
networking transition planning, large scale network modeling, network lab environments or other modes of emulating a large scale networking that runs both IPv4 and IPv6 concurrently.</t>


</section><!-- end of Operational Implications -->

<section title="IANA Considerations" toc="default">

<t>None at this time.</t>

</section><!-- end of IANA considerations -->



<section title="Security Considerations" toc="default">

<t>Such unexpected behavior can result in odd operational outcomes which can result in serious security and compliance issues and could, in some cases, result in disabling of IPv6 to acheive compliance and consistency. .</t>

</section><!-- end of security considerations -->

<section title="Acknowledgements" toc="default">
<t>The authors acknowledge the work of Brian Carpenter, David Farmer, Bob Hinden, Mark Andrews, Vasilenko Eduardand, and Mark Smith for participation in the technical discussions
 leading to this finding and Michael Ackermann, Tom Coffeen, Kevin Myers, and Ed Horley for providing further testing and operational input.</t>
</section><!-- end of acknowledgements -->

</middle>

<back>
<references title="Normative References">
<!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
            &RFC6724;
            &RFC8305;
            &RFC3484;
</references><!-- end of normative references -->
<references title="Informative References">
<!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
            &RFC4193;
            &RFC6598;
            &RFC1918;
</references><!-- end of informative references -->
</back>
</rfc>

