rfc9329xml2.original.xml | rfc9329.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc [ | ||||
<!ENTITY nbsp " "> | ||||
<!ENTITY zwsp "​"> | ||||
<!ENTITY nbhy "‑"> | ||||
<!ENTITY wj "⁠"> | ||||
]> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category=" | |||
std" consensus="true" docName="draft-ietf-ipsecme-rfc8229bis-09" number="9329" i | ||||
<rfc category="std" ipr="trust200902" docName="draft-ietf-ipsecme-rfc8229bis-09" | pr="trust200902" obsoletes="8229" updates="" xml:lang="en" tocInclude="true" sym | |||
obsoletes="8229"> | Refs="true" sortRefs="false" version="3"> | |||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<?rfc toc="yes" ?> | ||||
<?rfc symrefs="yes" ?> | ||||
<?rfc sortrefs="no"?> | ||||
<?rfc iprnotified="no" ?> | ||||
<?rfc strict="yes" ?> | ||||
<front> | <!-- xml2rfc v2v3 conversion 3.14.2 --> | |||
<title abbrev="TCP Encapsulation of IKE and IPsec Packets">TCP Encapsula | ||||
tion of IKE and IPsec Packets</title> | ||||
<author fullname="Tommy Pauly" initials="T." surname="Pauly"> | ||||
<organization>Apple Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>1 Infinite Loop</street> | ||||
<city>Cupertino, California 95014</city> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<email>tpauly@apple.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials='V.' surname="Smyslov" fullname='Valery Smyslov'> | ||||
<organization>ELVIS-PLUS</organization> | ||||
<address> | ||||
<postal> | ||||
<street>PO Box 81</street> | ||||
<city>Moscow (Zelenograd)</city> | ||||
<code>124460</code> | ||||
<country>Russian Federation</country> | ||||
</postal> | ||||
<phone>+7 495 276 0211</phone> | ||||
<email>svan@elvis.ru</email> | ||||
</address> | ||||
</author> | ||||
<date/> | ||||
<!-- | <front> | |||
<keyword></keyword> | <title abbrev="TCP Encapsulation of IKE & IPsec Packets">TCP Encapsulati | |||
--> | on of Internet Key Exchange | |||
Protocol (IKE) and IPsec Packets</title> | ||||
<seriesInfo name="RFC" value="9329"/> | ||||
<author fullname="Tommy Pauly" initials="T." surname="Pauly"> | ||||
<organization>Apple Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>1 Infinite Loop</street> | ||||
<city>Cupertino</city> | ||||
<region>California</region> | ||||
<code>95014</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<email>tpauly@apple.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials="V." surname="Smyslov" fullname="Valery Smyslov"> | ||||
<organization>ELVIS-PLUS</organization> | ||||
<address> | ||||
<postal> | ||||
<street>PO Box 81</street> | ||||
<city>Moscow (Zelenograd)</city> | ||||
<code>124460</code> | ||||
<country>Russian Federation</country> | ||||
</postal> | ||||
<phone>+7 495 276 0211</phone> | ||||
<email>svan@elvis.ru</email> | ||||
</address> | ||||
</author> | ||||
<date year="2022" month="November" /> | ||||
<area>sec</area> | ||||
<workgroup>ipsecme</workgroup> | ||||
<abstract> | <abstract> | |||
<t> This document describes a method to transport Internet Key Exchange | <t> This document describes a method to transport Internet Key Exchange | |||
Protocol (IKE) and IPsec packets over a TCP connection for traversing | Protocol (IKE) and IPsec packets over a TCP connection for traversing | |||
network middleboxes that may block IKE negotiation over UDP. This | network middleboxes that may block IKE negotiation over UDP. This | |||
method, referred to as "TCP encapsulation", involves sending both IKE | method, referred to as "TCP encapsulation", involves sending both IKE | |||
packets for Security Association establishment and Encapsulating | packets for Security Association (SA) establishment and Encapsulating | |||
Security Payload (ESP) packets over a TCP connection. This method is | Security Payload (ESP) packets over a TCP connection. This method is | |||
intended to be used as a fallback option when IKE cannot be | intended to be used as a fallback option when IKE cannot be | |||
negotiated over UDP. | negotiated over UDP. | |||
</t> | </t> | |||
<t>TCP encapsulation for IKE and IPsec was defined in RFC 8229. | <t>TCP encapsulation for IKE and IPsec was defined in RFC 8229. | |||
This document updates the specification for TCP encapsulation by includi | This document clarifies the specification for TCP encapsulation by inclu | |||
ng | ding | |||
additional clarifications obtained during implementation and deployment | additional clarifications obtained during implementation and deployment | |||
of this method. This documents obsoletes RFC 8229. | of this method. This documents obsoletes RFC 8229. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | ||||
<middle> | <section anchor="intro" numbered="true" toc="default"> | |||
<section title="Introduction" anchor="intro"> | <name>Introduction</name> | |||
<t> The Internet Key Exchange Protocol version 2 (IKEv2) <xref target="R | <t> The Internet Key Exchange Protocol version 2 (IKEv2) <xref target="RFC | |||
FC7296"/> is a | 7296" format="default"/> is a | |||
protocol for establishing IPsec Security Associations (SAs), using | protocol for establishing IPsec Security Associations (SAs) using | |||
IKE messages over UDP for control traffic, and using Encapsulating | IKE messages over UDP for control traffic and using Encapsulating | |||
Security Payload (ESP) <xref target="RFC4303"/> messages for encrypted d | Security Payload (ESP) messages <xref target="RFC4303" format="default"/ | |||
ata traffic. | > for encrypted data traffic. | |||
Many network middleboxes that filter traffic on public hotspots block | Many network middleboxes that filter traffic on public hotspots block | |||
all UDP traffic, including IKE and IPsec, but allow TCP connections | all UDP traffic, including IKE and IPsec, but allow TCP connections | |||
through because they appear to be web traffic. Devices on these | through because they appear to be web traffic. Devices on these | |||
networks that need to use IPsec (to access private enterprise | networks that need to use IPsec (to access private enterprise | |||
networks, to route Voice over IP calls to carrier networks, | networks, to route Voice over IP calls to carrier networks | |||
because of security policies, etc.) are unable to establish IPsec SAs. | because of security policies, etc.) are unable to establish IPsec SAs. | |||
This document defines a method for encapsulating IKE control messages | This document defines a method for encapsulating IKE control messages | |||
as well as ESP data messages within a TCP connection. Note that AH is no | as well as ESP data messages within a TCP connection. Note that Authenti | |||
t supported by this specification. | cation Header (AH) is not supported by this specification. | |||
</t> | </t> | |||
<t> Using TCP as a transport for IPsec packets adds a third option to th e | <t> Using TCP as a transport for IPsec packets adds the third option (belo w) to the | |||
list of traditional IPsec transports: | list of traditional IPsec transports: | |||
</t> | </t> | |||
<ol spacing="normal" type="1"><li>Direct. Usually, IKE negotiations begin | ||||
<t><list style="numbers"> | over UDP port 500. If | |||
<t>Direct. Currently, IKE negotiations begin over UDP port 500. If | ||||
no Network Address Translation (NAT) device is detected between | no Network Address Translation (NAT) device is detected between | |||
the Initiator and the Responder, then subsequent IKE packets are | the Initiator and the Responder, then subsequent IKE packets are | |||
sent over UDP port 500, and IPsec data packets are sent | sent over UDP port 500 and IPsec data packets are sent | |||
using ESP.</t> | using ESP.</li> | |||
<li>UDP Encapsulation. Described in <xref target="RFC3948" format="defa | ||||
<t>UDP Encapsulation <xref target="RFC3948"/>. If a NAT is detected b | ult"/>. If a NAT is detected between the | |||
etween the | ||||
Initiator and the Responder, then subsequent IKE packets are sent | Initiator and the Responder, then subsequent IKE packets are sent | |||
over UDP port 4500 with four bytes of zero at the start of the | over UDP port 4500 with 4 bytes of zero at the start of the | |||
UDP payload, and ESP packets are sent out over UDP port 4500. | UDP payload, and ESP packets are sent out over UDP port 4500. | |||
Some implementations default to using UDP encapsulation even when no N AT is | Some implementations default to using UDP encapsulation even when no N AT is | |||
detected on the path, as some middleboxes do not support IP | detected on the path, as some middleboxes do not support IP | |||
protocols other than TCP and UDP.</t> | protocols other than TCP and UDP.</li> | |||
<li>TCP Encapsulation. Described in this document. If the other two me | ||||
<t>TCP Encapsulation. If the other two methods are not available or | thods are not available or | |||
appropriate, IKE negotiation packets as well as ESP packets can | appropriate, IKE negotiation packets as well as ESP packets can | |||
be sent over a single TCP connection to the peer.</t> | be sent over a single TCP connection to the peer.</li> | |||
</list> | </ol> | |||
</t> | ||||
<t> Direct use of ESP or UDP encapsulation should be preferred by | <t> Direct use of ESP or UDP encapsulation should be preferred by | |||
IKE implementations due to performance concerns when using | IKE implementations due to performance concerns when using | |||
TCP encapsulation (<xref target="perf"/>). Most implementations should use | TCP encapsulation (<xref target="perf" format="default"/>). Most implem entations should use | |||
TCP encapsulation only on networks where negotiation over UDP has | TCP encapsulation only on networks where negotiation over UDP has | |||
been attempted without receiving responses from the peer or if a | been attempted without receiving responses from the peer or if a | |||
network is known to not support UDP.</t> | network is known to not support UDP.</t> | |||
<section anchor="prior" numbered="true" toc="default"> | ||||
<section title="Prior Work and Motivation" anchor="prior"> | <name>Prior Work and Motivation</name> | |||
<t> Encapsulating IKE connections within TCP streams is a common appro | <t> Encapsulating IKE connections within TCP streams is a common approac | |||
ach | h | |||
to solve the problem of UDP packets being blocked by network | to solve the problem of UDP packets being blocked by network | |||
middleboxes. The specific goals of this document are as follows:</t> | middleboxes. The specific goals of this document are as follows:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>To promote interoperability by defining a standard method of | |||
<t>To promote interoperability by defining a standard method of | framing IKE and ESP messages within TCP streams.</li> | |||
framing IKE and ESP messages within TCP streams.</t> | <li>To be compatible with the current IKEv2 standard without requiring | |||
modifications or extensions.</li> | ||||
<t>To be compatible with the current IKEv2 standard without requirin | <li>To use IKE over UDP by default to avoid the overhead of other | |||
g | ||||
modifications or extensions.</t> | ||||
<t>To use IKE over UDP by default to avoid the overhead of other | ||||
alternatives that always rely on TCP or Transport Layer Security | alternatives that always rely on TCP or Transport Layer Security | |||
(TLS) <xref target="RFC5246"/><xref target="RFC8446"/>.</t> | (TLS) <xref target="RFC5246" format="default"/> <xref target="RFC844 | |||
6" format="default"/>.</li> | ||||
</list> | </ul> | |||
</t> | <t>Some previous alternatives include:</t> | |||
<dl newline="true" spacing="normal" indent="3"> | ||||
<t>Some previous alternatives include:</t> | <dt>Cellular Network Access:</dt> | |||
<dd> | ||||
<t><list style="hanging" hangIndent="3"> | ||||
<t hangText="Cellular Network Access"> | ||||
<vspace blankLines="0"/> | ||||
Interworking Wireless LAN (IWLAN) uses IKEv2 to create secure | Interworking Wireless LAN (IWLAN) uses IKEv2 to create secure | |||
connections to cellular carrier networks for making voice calls | connections to cellular carrier networks for making voice calls | |||
and accessing other network services over Wi-Fi networks. 3GPP has | and accessing other network services over Wi-Fi networks. 3GPP has | |||
recommended that IKEv2 and ESP packets be sent within a TLS | recommended that IKEv2 and ESP packets be sent within a TLS | |||
connection to be able to establish connections on restrictive | connection to be able to establish connections on restrictive | |||
networks. | networks. | |||
</t> | </dd> | |||
<dt>ISAKMP over TCP:</dt> | ||||
<t hangText="ISAKMP over TCP"> | <dd> | |||
<vspace blankLines="0"/> | ||||
Various non-standard extensions to the Internet Security | Various non-standard extensions to the Internet Security | |||
Association and Key Management Protocol (ISAKMP) have been | Association and Key Management Protocol (ISAKMP) have been | |||
deployed that send IPsec traffic over TCP or TCP-like packets. | deployed that send IPsec traffic over TCP or TCP-like packets. | |||
</t> | </dd> | |||
<dt>Secure Sockets Layer (SSL) VPNs:</dt> | ||||
<t hangText="Secure Sockets Layer (SSL) VPNs"> | <dd> | |||
<vspace blankLines="0"/> | ||||
Many proprietary VPN solutions use a combination of TLS and IPsec | Many proprietary VPN solutions use a combination of TLS and IPsec | |||
in order to provide reliability. These often run on TCP port 443. | in order to provide reliability. These often run on TCP port 443. | |||
</t> | </dd> | |||
<dt>IKEv2 over TCP:</dt> | ||||
<t hangText="IKEv2 over TCP"> | <dd> | |||
<vspace blankLines="0"/> | IKEv2 over TCP as described in <xref target="I-D.ietf-ipsecme-ike-tc | |||
IKEv2 over TCP as described in <xref target="I-D.ietf-ipsecme-ike-tc | p" format="default"/> is used to avoid UDP | |||
p"/> is used to avoid UDP | ||||
fragmentation. | fragmentation. | |||
</t> | </dd> | |||
</dl> | ||||
</list> | <t> | |||
TCP encapsulation for IKE and IPsec was defined in <xref target="RFC82 29" />. | TCP encapsulation for IKE and IPsec was defined in <xref target="RFC82 29" format="default"/>. | |||
This document updates the specification for TCP encapsulation by inclu ding | This document updates the specification for TCP encapsulation by inclu ding | |||
additional clarifications obtained during implementation and deploymen t | additional clarifications obtained during implementation and deploymen t | |||
of this method. | of this method. | |||
</t> | </t> | |||
<t>In particular: | ||||
<t>In particular: | </t> | |||
<list style="symbols"> | <ul spacing="normal"> | |||
<t>The interpretation of the Length field preceding every message is | <li>The interpretation of the Length field preceding every message is | |||
clarified (<xref target="format" />)</t> | clarified (<xref target="format" format="default"/>).</li> | |||
<t>The use of the NAT_DETECTION_*_IP notifications is clarified | <li>The use of the NAT_DETECTION_*_IP notifications is clarified | |||
(Sections <xref format = "counter" target="fallback" />, <xref forma | (Sections <xref format="counter" target="fallback"/>, <xref format=" | |||
t = "counter" target="nat-det" />, | counter" target="nat-det"/>, | |||
and <xref format = "counter" target="mobike" />)</t> | and <xref format="counter" target="mobike"/>).</li> | |||
<t>Retransmission behavior is clarified (<xref target="retr" />)</t> | <li>Retransmission behavior is clarified (<xref target="retr" format=" | |||
<t>The use of cookies and puzzles is described in more detail (<xref | default"/>).</li> | |||
target="cookie-puzzle" />)</t> | <li>The use of cookies and puzzles is described in more detail (<xref | |||
<t>Error handling is clarified (<xref target="errors" />)</t> | target="cookie-puzzle" format="default"/>).</li> | |||
<t>Implications of TCP encapsulation on IPsec SA processing are expa | <li>Error handling is clarified (<xref target="errors" format="default | |||
nded (<xref target="ipsec" />)</t> | "/>).</li> | |||
<t><xref target="extensions" /> describing interactions with other I | <li>Implications of TCP encapsulation on IPsec SA processing are expan | |||
KEv2 extensions is added</t> | ded (<xref target="ipsec" format="default"/>).</li> | |||
<t>The interaction of TCP encapsulation with MOBIKE is clarified (<x | <li> | |||
ref target="mobike" />)</t> | <xref target="extensions" format="default"/> describing interactions | |||
<t>The recommendation for TLS encapsulation (<xref target="tls" />) | with other IKEv2 extensions is added.</li> | |||
now includes TLS 1.3</t> | <li>The interaction of TCP encapsulation with IKEv2 Mobility and Multi | |||
<t>Examples of TLS encapsulation are provided using TLS 1.3 (<xref t | homing (MOBIKE) is clarified (<xref target="mobike" format="default"/>).</li> | |||
arget="tls-example" />)</t> | <li>The recommendation for TLS encapsulation (<xref target="tls" forma | |||
<t>More security considerations are added.</t> | t="default"/>) now includes TLS 1.3.</li> | |||
</list> | <li>Examples of TLS encapsulation are provided using TLS 1.3 (<xref ta | |||
</t> | rget="tls-example" format="default"/>).</li> | |||
<li>More security considerations are added.</li> | ||||
</section> | </ul> | |||
</section> | ||||
<section anchor="mustshouldmay" title="Terminology and Notation"> | <section anchor="mustshouldmay" numbered="true" toc="default"> | |||
<t> This document distinguishes between the IKE peer that initiates TC | <name>Terminology and Notation</name> | |||
P | <t> This document distinguishes between the IKE peer that initiates TCP | |||
connections to be used for TCP encapsulation and the roles of | connections to be used for TCP encapsulation and the roles of | |||
Initiator and Responder for particular IKE messages. During the | Initiator and Responder for particular IKE messages. During the | |||
course of IKE exchanges, the role of IKE Initiator and Responder may | course of IKE exchanges, the role of IKE Initiator and Responder may | |||
swap for a given SA (as with IKE SA rekeys), while the Initiator of | swap for a given SA (as with IKE SA rekeys), while the Initiator of | |||
the TCP connection is still responsible for tearing down the TCP | the TCP connection is still responsible for tearing down the TCP | |||
connection and re-establishing it if necessary. For this reason, | connection and re-establishing it if necessary. For this reason, | |||
this document will use the term "TCP Originator" to indicate the IKE | this document will use the term "TCP Originator" to indicate the IKE | |||
peer that initiates TCP connections. The peer that receives TCP | peer that initiates TCP connections. The peer that receives TCP | |||
connections will be referred to as the "TCP Responder". If an IKE SA | connections will be referred to as the "TCP Responder". If an IKE SA | |||
is rekeyed one or more times, the TCP Originator MUST remain the peer | is rekeyed one or more times, the TCP Originator <bcp14>MUST</bcp14> r emain the peer | |||
that originally initiated the first IKE SA. | that originally initiated the first IKE SA. | |||
</t> | </t> | |||
<t> | ||||
<t> The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT" | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
, "SHOULD", "SHOULD NOT", | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
"RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this docume | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
nt are to be interpreted | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
as described in BCP 14 <xref target="RFC2119" /> <xref target="RFC8174 | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
" /> when, and only when, | be interpreted as | |||
they appear in all capitals, as shown here. | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
</t> | when, and only when, they appear in all capitals, as shown here. | |||
</section> | </t> | |||
</section> | </section> | |||
</section> | ||||
<section title="Configuration" anchor="config"> | <section anchor="config" numbered="true" toc="default"> | |||
<t>One of the main reasons to use TCP encapsulation is that UDP traffic | <name>Configuration</name> | |||
<t>One of the main reasons to use TCP encapsulation is that UDP traffic | ||||
may be entirely blocked on a network. Because of this, support for | may be entirely blocked on a network. Because of this, support for | |||
TCP encapsulation is not specifically negotiated in the IKE exchange. | TCP encapsulation is not specifically negotiated in the IKE exchange. | |||
Instead, support for TCP encapsulation must be pre-configured on both | Instead, support for TCP encapsulation must be preconfigured on both | |||
the TCP Originator and the TCP Responder.</t> | the TCP Originator and the TCP Responder.</t> | |||
<t>Compliant implementations <bcp14>MUST</bcp14> support TCP encapsulation | ||||
<t>Compliant implementations MUST support TCP encapsulation on TCP port | on TCP port 4500, | |||
4500, | ||||
which is reserved for IPsec NAT traversal.</t> | which is reserved for IPsec NAT traversal.</t> | |||
<t>Beyond a flag indicating support for TCP encapsulation, the | ||||
<t>Beyond a flag indicating support for TCP encapsulation, the | ||||
configuration for each peer can include the following optional | configuration for each peer can include the following optional | |||
parameters:</t> | parameters:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>Alternate TCP ports on which the specific TCP Responder listens | |||
<t>Alternate TCP ports on which the specific TCP Responder listens | ||||
for incoming connections. Note that the TCP Originator may | for incoming connections. Note that the TCP Originator may | |||
initiate TCP connections to the TCP Responder from any local port.</t> | initiate TCP connections to the TCP Responder from any local port.</li | |||
> | ||||
<t>An extra framing protocol to use on top of TCP to further | <li>An extra framing protocol to use on top of TCP to further | |||
encapsulate the stream of IKE and IPsec packets. See <xref target="tl | encapsulate the stream of IKE and IPsec packets. See <xref target="tl | |||
s" /> | s" format="default"/> | |||
for a detailed discussion.</t> | for a detailed discussion.</li> | |||
</list> | </ul> | |||
</t> | <t>Since TCP encapsulation of IKE and IPsec packets adds overhead and | |||
<t>Since TCP encapsulation of IKE and IPsec packets adds overhead and | ||||
has potential performance trade-offs compared to direct or | has potential performance trade-offs compared to direct or | |||
UDP-encapsulated SAs (as described in <xref target="perf"/>), implementa | UDP-encapsulated SAs (as described in <xref target="perf" format="defaul | |||
tions | t"/>), implementations | |||
SHOULD prefer ESP direct or UDP-encapsulated SAs over | <bcp14>SHOULD</bcp14> prefer ESP direct or UDP-encapsulated SAs over | |||
TCP-encapsulated SAs when possible. | TCP-encapsulated SAs when possible. | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="format" numbered="true" toc="default"> | |||
<name>TCP-Encapsulated Data Formats</name> | ||||
<section title="TCP-Encapsulated Data Formats" anchor="format"> | <t>Like UDP encapsulation, TCP encapsulation uses the first 4 bytes | |||
<t>Like UDP encapsulation, TCP encapsulation uses the first four bytes | ||||
of a message to differentiate IKE and ESP messages. TCP | of a message to differentiate IKE and ESP messages. TCP | |||
encapsulation also adds a 16-bit Length field that precedes every messag e | encapsulation also adds a 16-bit Length field that precedes every messag e | |||
to define the boundaries of messages within a stream. | to define the boundaries of messages within a stream. | |||
The value in this field is equal to the length of the original me ssage | The value in this field is equal to the length of the original me ssage | |||
plus the length of the field itself, in octets. If the first 32 bits | plus the length of the field itself, in octets. If the first 32 bits | |||
of the message are zeros (a non-ESP marker), then the contents co mprise an | of the message are zeros (a non-ESP marker), then the contents co mprise an | |||
IKE message. Otherwise, the contents comprise an ESP message. | IKE message. Otherwise, the contents comprise an ESP message. | |||
Authentication Header (AH) messages are not supported for TCP | AH messages are not supported for TCP | |||
encapsulation. | encapsulation. | |||
</t> | </t> | |||
<t>Although a TCP stream may be able to send very long messages, | ||||
<t>Although a TCP stream may be able to send very long messages, | implementations <bcp14>SHOULD</bcp14> limit message lengths to match the | |||
implementations SHOULD limit message lengths to match the lengths | lengths | |||
used for UDP encapsulation of ESP messages. | used for UDP encapsulation of ESP messages. | |||
The maximum message length is used as the effective MTU | The maximum message length is used as the effective MTU | |||
for connections that are being encrypted using ESP, | for connections that are being encrypted using ESP, | |||
so the maximum message length will influence characteristics of these | so the maximum message length will influence characteristics of these | |||
connections, such as the TCP Maximum Segment Size (MSS). | connections, such as the TCP Maximum Segment Size (MSS). | |||
</t> | </t> | |||
<t>Due to the fact that the Length field is 16 bits and includes both the | ||||
<t>Due to the fact that the Length field is 16-bit and includes both the | message length and the | |||
message length and the | ||||
length of the field itself, it is impossible to encapsulate messages gre ater than 65533 | length of the field itself, it is impossible to encapsulate messages gre ater than 65533 | |||
octets in length. In most cases, this is not a problem. Note also that a | octets in length. In most cases, this is not a problem. Note that a simi | |||
similar | lar | |||
limitation exists for encapsulation ESP in UDP <xref target="RFC3948" /> | limitation exists for encapsulation ESP in UDP <xref target="RFC3948" fo | |||
. | rmat="default"/>. | |||
</t> | </t> | |||
<t>The minimum size of an encapsulated message is 1 octet | ||||
<t>The minimum size of an encapsulated message is 1 octet | (for NAT-keepalive packets, see <xref target="nat-ka" format="default"/> | |||
(for NAT-keepalive packets, see <xref target="nat-ka" />). Empty message | ). Empty messages | |||
s | (where the Length field equals 2) <bcp14>MUST</bcp14> be silently ignore | |||
(where the Length field equals to 2) MUST be silently ignored by receive | d by receiver. | |||
r. | </t> | |||
</t> | <t>Note that this method of encapsulation will also work for placing IKE | |||
<t>Note that this method of encapsulation will also work for placing IKE | ||||
and ESP messages within any protocol that presents a stream | and ESP messages within any protocol that presents a stream | |||
abstraction, beyond TCP. | abstraction, beyond TCP. | |||
</t> | </t> | |||
<section anchor="format-ike" numbered="true" toc="default"> | ||||
<section title="TCP-Encapsulated IKE Message Format" anchor="format-ike" | <name>TCP-Encapsulated IKE Message Format</name> | |||
> | <figure anchor="f-format-ike"> | |||
<figure title="IKE message format for TCP encapsulation" anchor="f-for | <name>IKE Message Format for TCP Encapsulation</name> | |||
mat-ike"><artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
1 2 3 | 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Length | | | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Non-ESP Marker | | | Non-ESP Marker | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
~ IKE message [RFC7296] ~ | ~ IKE Message (RFC 7296) ~ | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> | </figure> | |||
</figure> | <t> The IKE message is preceded by a 16-bit Length field in network byte | |||
<t> The IKE message is preceded by a 16-bit Length field in network by | ||||
te | ||||
order that specifies the length of the IKE message (including the | order that specifies the length of the IKE message (including the | |||
non-ESP marker) within the TCP stream. As with IKE over UDP | non-ESP marker) within the TCP stream. As with IKE over UDP | |||
port 4500, a zeroed 32-bit non-ESP marker is inserted before the | port 4500, a zeroed 32-bit non-ESP marker is inserted before the | |||
start of the IKE header in order to differentiate the traffic from | start of the IKE header in order to differentiate the traffic from | |||
ESP traffic between the same addresses and ports. | ESP traffic between the same addresses and ports. | |||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | ||||
<t><list style="symbols"> | <dt>Length (2 octets, unsigned integer):</dt> <dd> Length of the IKE m | |||
<t>Length (2 octets, unsigned integer) - Length of the IKE message, | essage, | |||
including the Length field and non-ESP marker. The value in the Leng th | including the Length field and non-ESP marker. The value in the Leng th | |||
field MUST NOT be 0 or 1. The receiver MUST treat these v | field <bcp14>MUST NOT</bcp14> be 0 or 1. The receiver <bc | |||
alues as | p14>MUST</bcp14> treat these values as | |||
fatal errors and MUST close the TCP connection. | fatal errors and <bcp14>MUST</bcp14> close the TCP connec | |||
</t> | tion. | |||
<t>Non-ESP Marker (4 octets) - Four zero-valued bytes. | </dd> | |||
</t> | <dt>Non-ESP Marker (4 octets):</dt> <dd>Four zero-valued bytes.</dd> | |||
</list> | </dl> | |||
</t> | </section> | |||
<section anchor="format-esp" numbered="true" toc="default"> | ||||
</section> | <name>TCP-Encapsulated ESP Packet Format</name> | |||
<figure anchor="f-format-esp"> | ||||
<section title="TCP-Encapsulated ESP Packet Format" anchor="format-esp"> | <name>ESP Packet Format for TCP Encapsulation</name> | |||
<figure title="ESP packet format for TCP encapsulation" anchor="f-form | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
at-esp"><artwork><![CDATA[ | ||||
1 2 3 | 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Length | | | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
~ ESP packet [RFC4303] ~ | ~ ESP Packet (RFC 4303) ~ | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> | </figure> | |||
</figure> | <t>The ESP packet is preceded by a 16-bit Length field in network byte | |||
<t>The ESP packet is preceded by a 16-bit Length field in network byte | ||||
order that specifies the length of the ESP packet within the TCP | order that specifies the length of the ESP packet within the TCP | |||
stream.</t> | stream.</t> | |||
<t>The Security Parameter Index (SPI) field <xref target="RFC7296" forma | ||||
<t>The Security Parameter Index (SPI) field <xref target="RFC7296"/> i | t="default"/> in the ESP header | |||
n the ESP header | <bcp14>MUST NOT</bcp14> be a zero value.</t> | |||
MUST NOT be a zero value.</t> | <dl newline="false" spacing="normal"> | |||
<dt>Length (2 octets, unsigned integer):</dt> <dd>Length of the ESP | ||||
<t><list style="symbols"> | packet, including the Length field. The value in the Length field | |||
<t>Length (2 octets, unsigned integer) - Length of the ESP packet, | <bcp14>MUST NOT</bcp14> be 0 or 1. The receiver <bcp14>MUST</bcp14> | |||
including the Length field. The value in the Length | treat these values as fatal errors and <bcp14>MUST</bcp14> close TCP | |||
field MUST NOT be 0 or 1. The receiver MUST treat these v | connection.</dd> | |||
alues as | </dl> | |||
fatal errors and MUST close TCP connection.</t> | </section> | |||
</section> | ||||
</list> | <section anchor="prefix" numbered="true" toc="default"> | |||
</t> | <name>TCP-Encapsulated Stream Prefix</name> | |||
<t>Each stream of bytes used for IKE and IPsec encapsulation <bcp14>MUST</ | ||||
</section> | bcp14> begin | |||
</section> | with a fixed sequence of 6 bytes as a magic value, containing the | |||
<section title="TCP-Encapsulated Stream Prefix" anchor="prefix"> | ||||
<t>Each stream of bytes used for IKE and IPsec encapsulation MUST begin | ||||
with a fixed sequence of six bytes as a magic value, containing the | ||||
characters "IKETCP" as ASCII values. | characters "IKETCP" as ASCII values. | |||
</t> | </t> | |||
<figure anchor="f-prefix"> | ||||
<figure title="TCP-Encapsulated Stream Prefix" anchor="f-prefix"><artwor | <name>TCP-Encapsulated Stream Prefix</name> | |||
k><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
0 1 2 3 4 5 | 0 1 2 3 4 5 | |||
+------+------+------+------+------+------+ | +------+------+------+------+------+------+ | |||
| 0x49 | 0x4b | 0x45 | 0x54 | 0x43 | 0x50 | | | 0x49 | 0x4b | 0x45 | 0x54 | 0x43 | 0x50 | | |||
+------+------+------+------+------+------+ | +------+------+------+------+------+------+]]></artwork> | |||
]]></artwork> | </figure> | |||
</figure> | <t>This value is intended to | |||
<t>This value is intended to | ||||
identify and validate that the TCP connection is being used for TCP | identify and validate that the TCP connection is being used for TCP | |||
encapsulation as defined in this document, to avoid conflicts with | encapsulation as defined in this document, to avoid conflicts with | |||
the prevalence of previous non-standard protocols that used TCP | the prevalence of previous non-standard protocols that used TCP | |||
port 4500. This value is only sent once, by the TCP Originator only, | port 4500. This value is only sent once, by the TCP Originator only, | |||
at the beginning of the TCP stream of IKE and ESP messages. | at the beginning of the TCP stream of IKE and ESP messages. | |||
</t> | </t> | |||
<figure><artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Initiator Responder | Initiator Responder | |||
--------------------------------------------------------------------- | --------------------------------------------------------------------- | |||
<new TCP connection is established by Initiator> | <new TCP connection is established by Initiator> | |||
Stream Prefix|Length|non-ESP marker|IKE message --> | Stream Prefix|Length|non-ESP marker|IKE message --> | |||
<-- Length|non-ESP marker|IKE message | <-- Length|non-ESP marker|IKE message | |||
Length|non-ESP marker|IKE message --> | Length|non-ESP marker|IKE message --> | |||
<-- Length|non-ESP marker|IKE message | <-- Length|non-ESP marker|IKE message | |||
[...] | [...] | |||
Length|ESP packet -> | Length|ESP packet -> | |||
<- Length|ESP packet | <- Length|ESP packet]]></artwor | |||
]]></artwork> | k> | |||
</figure> | ||||
<t>If other framing protocols are used within TCP to further encapsulate | <t>If other framing protocols are used within TCP to further encapsulate | |||
or encrypt the stream of IKE and ESP messages, the stream prefix must | or encrypt the stream of IKE and ESP messages, the stream prefix must | |||
be at the start of the TCP Originator's IKE and ESP message stream | be at the start of the TCP Originator's IKE and ESP message stream | |||
within the added protocol layer (<xref target="tls" />). Although some framing | within the added protocol layer (<xref target="tls" format="default"/>). Although some framing | |||
protocols do support negotiating inner protocols, the stream prefix | protocols do support negotiating inner protocols, the stream prefix | |||
should always be used in order for implementations to be as generic | should always be used in order for implementations to be as generic | |||
as possible and not rely on other framing protocols on top of TCP. | as possible and not rely on other framing protocols on top of TCP. | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="applicability" numbered="true" toc="default"> | |||
<name>Applicability</name> | ||||
<section title="Applicability" anchor="applicability"> | <t>TCP encapsulation is applicable only when it has been configured to | |||
<t>TCP encapsulation is applicable only when it has been configured to | ||||
be used with specific IKE peers. If a Responder is configured to accept and is allowed to use | be used with specific IKE peers. If a Responder is configured to accept and is allowed to use | |||
TCP encapsulation, it MUST listen on the configured port(s) in case | TCP encapsulation, it <bcp14>MUST</bcp14> listen on the configured port( | |||
any peers will initiate new IKE sessions. Initiators MAY use TCP | s) in case | |||
any peers will initiate new IKE sessions. Initiators <bcp14>MAY</bcp14> | ||||
use TCP | ||||
encapsulation for any IKE session to a peer that is configured to | encapsulation for any IKE session to a peer that is configured to | |||
support TCP encapsulation, although it is recommended that Initiators | support TCP encapsulation, although it is recommended that Initiators | |||
only use TCP encapsulation when traffic over UDP is blocked. | only use TCP encapsulation when traffic over UDP is blocked. | |||
</t> | </t> | |||
<t>Since the support of TCP encapsulation is a configured property, not | ||||
<t>Since the support of TCP encapsulation is a configured property, not | ||||
a negotiated one, it is recommended that if there are multiple IKE | a negotiated one, it is recommended that if there are multiple IKE | |||
endpoints representing a single peer (such as multiple machines with | endpoints representing a single peer (such as multiple machines with | |||
different IP addresses when connecting by Fully Qualified Domain | different IP addresses when connecting by Fully Qualified Domain | |||
Name, or endpoints used with IKE redirection), all of the endpoints | Name (FQDN), or endpoints used with IKE redirection), all of the endpoin ts | |||
equally support TCP encapsulation. | equally support TCP encapsulation. | |||
</t> | </t> | |||
<t>If TCP encapsulation is being used for a specific IKE SA, all | ||||
<t>If TCP encapsulation is being used for a specific IKE SA, all | IKE messages for that IKE SA and ESP packets for its Child SAs <bcp14>MU | |||
IKE messages for that IKE SA and ESP packets for its Child SAs MUST be s | ST</bcp14> be sent over a TCP | |||
ent over a TCP | ||||
connection until the SA is deleted or IKEv2 Mobility and Multihoming | connection until the SA is deleted or IKEv2 Mobility and Multihoming | |||
(MOBIKE) is used to change the SA endpoints and/or the encapsulation | (MOBIKE) is used to change the SA endpoints and/or the encapsulation | |||
protocol. See <xref target="mobike"/> for more details on using MOBIKE to | protocol. See <xref target="mobike" format="default"/> for more details on using MOBIKE to | |||
transition between encapsulation modes. | transition between encapsulation modes. | |||
</t> | </t> | |||
<section anchor="fallback" numbered="true" toc="default"> | ||||
<section title="Recommended Fallback from UDP" anchor="fallback"> | <name>Recommended Fallback from UDP</name> | |||
<t>Since UDP is the preferred method of transport for IKE messages, | <t>Since UDP is the preferred method of transport for IKE messages, | |||
implementations that use TCP encapsulation should have an algorithm | implementations that use TCP encapsulation should have an algorithm | |||
for deciding when to use TCP after determining that UDP is unusable. | for deciding when to use TCP after determining that UDP is unusable. | |||
If an Initiator implementation has no prior knowledge about the | If an Initiator implementation has no prior knowledge about the | |||
network it is on and the status of UDP on that network, it SHOULD | network it is on and the status of UDP on that network, it <bcp14>SHOU LD</bcp14> | |||
always attempt to negotiate IKE over UDP first. IKEv2 defines how to | always attempt to negotiate IKE over UDP first. IKEv2 defines how to | |||
use retransmission timers with IKE messages and, specifically, | use retransmission timers with IKE messages and, specifically, | |||
IKE_SA_INIT messages <xref target="RFC7296"/>. Generally, this means that the | IKE_SA_INIT messages <xref target="RFC7296" format="default"/>. Gener ally, this means that the | |||
implementation will define a frequency of retransmission and the | implementation will define a frequency of retransmission and the | |||
maximum number of retransmissions allowed before marking the IKE SA | maximum number of retransmissions allowed before marking the IKE SA | |||
as failed. An implementation can attempt negotiation over TCP once | as failed. An implementation can attempt negotiation over TCP once | |||
it has hit the maximum retransmissions over UDP, or slightly before | it has hit the maximum retransmissions over UDP, or slightly before | |||
to reduce connection setup delays. It is recommended that the | to reduce connection setup delays. It is recommended that the | |||
initial message over UDP be retransmitted at least once before | initial message over UDP be retransmitted at least once before | |||
falling back to TCP, unless the Initiator knows beforehand that the | falling back to TCP, unless the Initiator knows beforehand that the | |||
network is likely to block UDP. | network is likely to block UDP. | |||
</t> | </t> | |||
<t>When switching from UDP to TCP, a new IKE_SA_INIT exchange <bcp14>MUS | ||||
<t>When switching from UDP to TCP, a new IKE_SA_INIT exchange MUST be | T</bcp14> be | |||
initiated with the Initiator's new SPI and with recalculated content o f | initiated with the Initiator's new SPI and with recalculated content o f | |||
NAT_DETECTION_*_IP notifications. | NAT_DETECTION_*_IP notifications. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Using TCP Encapsulation" anchor="tcp-encap"> | <section anchor="tcp-encap" numbered="true" toc="default"> | |||
<section title="Connection Establishment and Teardown" anchor="establish | <name>Using TCP Encapsulation</name> | |||
"> | <section anchor="establish" numbered="true" toc="default"> | |||
<t>When the IKE Initiator uses TCP encapsulation, it will initiate a T | <name>Connection Establishment and Teardown</name> | |||
CP | <t>When the IKE Initiator uses TCP encapsulation, it will initiate a TCP | |||
connection to the Responder using the Responder's preconfigured TCP po rt. The first | connection to the Responder using the Responder's preconfigured TCP po rt. The first | |||
bytes sent on the TCP stream MUST be the stream prefix value (<xref ta rget="prefix"/>). | bytes sent on the TCP stream <bcp14>MUST</bcp14> be the stream prefix value (<xref target="prefix" format="default"/>). | |||
After this prefix, encapsulated IKE messages will negotiate the IKE | After this prefix, encapsulated IKE messages will negotiate the IKE | |||
SA and initial Child SA <xref target="RFC7296"/>. After this point, b | SA and initial Child SA <xref target="RFC7296" format="default"/>. Af | |||
oth | ter this point, both | |||
encapsulated IKE (<xref target="f-format-ike" />) and ESP (<xref targe | encapsulated IKE (<xref target="f-format-ike" format="default"/>) and | |||
t="f-format-esp" />) | ESP (<xref target="f-format-esp" format="default"/>) | |||
messages will be sent over the TCP connection. The TCP Responder MUST | messages will be sent over the TCP connection. The TCP Responder <bcp | |||
wait for the entire | 14>MUST</bcp14> wait for the entire | |||
stream prefix to be received on the stream before trying to parse out | stream prefix to be received on the stream before trying to parse out | |||
any IKE or ESP messages. The stream prefix is sent only once, and | any IKE or ESP messages. The stream prefix is sent only once, and | |||
only by the TCP Originator. | only by the TCP Originator. | |||
</t> | </t> | |||
<t>In order to close an IKE session, either the Initiator or Responder | ||||
<t>In order to close an IKE session, either the Initiator or Responder | <bcp14>SHOULD</bcp14> gracefully tear down IKE SAs with DELETE payload | |||
SHOULD gracefully tear down IKE SAs with DELETE payloads. Once the | s. Once the | |||
SA has been deleted, the TCP Originator SHOULD close the TCP | SA has been deleted, the TCP Originator <bcp14>SHOULD</bcp14> close th | |||
e TCP | ||||
connection if it does not intend to use the connection for another | connection if it does not intend to use the connection for another | |||
IKE session to the TCP Responder. If the TCP connection is no longer | IKE session to the TCP Responder. If the TCP connection is no longer | |||
associated with any active IKE SA, the TCP Responder MAY close the con | associated with any active IKE SA, the TCP Responder <bcp14>MAY</bcp14 | |||
nection | > close the connection | |||
to clean up IKE resources if TCP Originator didn't close it within som | to clean up IKE resources if the TCP Originator didn't close it within | |||
e reasonable period of time (e.g., a few seconds). | some reasonable period of time (e.g., a few seconds). | |||
</t> | </t> | |||
<t>An unexpected FIN or a TCP Reset on the TCP connection may indicate a | ||||
<t>An unexpected FIN or a TCP Reset on the TCP connection may indicate | ||||
a | ||||
loss of connectivity, an attack, or some other error. If a DELETE | loss of connectivity, an attack, or some other error. If a DELETE | |||
payload has not been sent, both sides SHOULD maintain the state for | payload has not been sent, both sides <bcp14>SHOULD</bcp14> maintain t he state for | |||
their SAs for the standard lifetime or timeout period. The TCP | their SAs for the standard lifetime or timeout period. The TCP | |||
Originator is responsible for re-establishing the TCP connection if | Originator is responsible for re-establishing the TCP connection if | |||
it is torn down for any unexpected reason. Since new TCP connections | it is torn down for any unexpected reason. Since new TCP connections | |||
may use different IP addresses and/or ports due to NAT mappings or loc al address or port allocations | may use different IP addresses and/or ports due to NAT mappings or loc al address or port allocations | |||
changing, the TCP Responder MUST allow packets for existing SAs to be | changing, the TCP Responder <bcp14>MUST</bcp14> allow packets for exis ting SAs to be | |||
received from new source IP addresses and ports. Note that the | received from new source IP addresses and ports. Note that the | |||
IPv6 Flow-ID header MUST remain constant when new TCP connection is cre | IPv6 Flow-ID header <bcp14>MUST</bcp14> remain constant when a new TCP | |||
ated to avoid ECMP load balancing. | connection is created to avoid ECMP load balancing. | |||
</t> | ||||
<t>A peer MUST discard a partially received message due to a broken | </t> | |||
<t>A peer <bcp14>MUST</bcp14> discard a partially received message due t | ||||
o a broken | ||||
connection. | connection. | |||
</t> | </t> | |||
<t>Whenever the TCP Originator opens a new TCP connection to be used for | ||||
<t>Whenever the TCP Originator opens a new TCP connection to be used f | an existing IKE SA, it <bcp14>MUST</bcp14> send the stream prefix firs | |||
or | t, before any | |||
an existing IKE SA, it MUST send the stream prefix first, before any | ||||
IKE or ESP messages. This follows the same behavior as the initial | IKE or ESP messages. This follows the same behavior as the initial | |||
TCP connection. | TCP connection. | |||
</t> | </t> | |||
<t>Multiple IKE SAs <bcp14>MUST NOT</bcp14> share a single TCP connectio | ||||
<t>Multiple IKE SAs MUST NOT share a single TCP connection, unless one | n, unless one | |||
is a rekey of an existing IKE SA, in which case there will | is a rekey of an existing IKE SA, in which case there will | |||
temporarily be two IKE SAs on the same TCP connection. | temporarily be two IKE SAs on the same TCP connection. | |||
</t> | </t> | |||
<t>If a TCP connection is being used to continue an existing IKE/ESP | ||||
<t>If a TCP connection is being used to continue an existing IKE/ESP s | session, the TCP Responder can recognize the session using either the | |||
ession, | IKE SPI from an encapsulated IKE message or the ESP SPI from an | |||
the TCP Responder can recognize the session using either the IKE SPI | encapsulated ESP packet. If the session had been fully established | |||
from an encapsulated IKE message or the ESP SPI from an encapsulated | previously, it is suggested that the TCP Originator send an | |||
ESP packet. If the session had been fully established previously, | UPDATE_SA_ADDRESSES message if MOBIKE is supported and an | |||
it is suggested that the TCP Originator send an UPDATE_SA_ADDRESSES | empty informational message if it is not. | |||
message if MOBIKE is supported, or an empty informational message othe | </t> | |||
rwise. | <t>The TCP Responder <bcp14>MUST NOT</bcp14> accept any messages for the | |||
</t> | existing IKE | |||
<t>The TCP Responder MUST NOT accept any messages for the existing IKE | ||||
session on a new incoming connection, unless that connection begins | session on a new incoming connection, unless that connection begins | |||
with the stream prefix. If either the TCP Originator or TCP | with the stream prefix. If either the TCP Originator or TCP | |||
Responder detects corruption on a connection that was started with a | Responder detects corruption on a connection that was started with a | |||
valid stream prefix, it SHOULD close the TCP connection. The | valid stream prefix, it <bcp14>SHOULD</bcp14> close the TCP connection | |||
connection can be determined to be corrupted if there are too many | . The | |||
connection can be corrupted if there are too many | ||||
subsequent messages that cannot be parsed as valid IKE messages or | subsequent messages that cannot be parsed as valid IKE messages or | |||
ESP messages with known SPIs, or if the authentication check for an | ESP messages with known SPIs, or if the authentication check for an | |||
IKE message or ESP message with a known SPI fails. Implementations SH OULD NOT | IKE message or ESP message with a known SPI fails. Implementations <b cp14>SHOULD NOT</bcp14> | |||
tear down a connection if only a few consecutive ESP packets have unkn own | tear down a connection if only a few consecutive ESP packets have unkn own | |||
SPIs, since the SPI databases may be momentarily out of sync. If | SPIs since the SPI databases may be momentarily out of sync. If | |||
there is instead a syntax issue within an IKE message, an | there is instead a syntax issue within an IKE message, an | |||
implementation MUST send the INVALID_SYNTAX notify payload and | implementation <bcp14>MUST</bcp14> send the INVALID_SYNTAX notify payl oad and | |||
tear down the IKE SA as usual, rather than tearing down the TCP | tear down the IKE SA as usual, rather than tearing down the TCP | |||
connection directly. | connection directly. | |||
</t> | </t> | |||
<t>A TCP Originator <bcp14>SHOULD</bcp14> only open one TCP connection p | ||||
<t>A TCP Originator SHOULD only open one TCP connection per IKE SA, ov | er IKE SA, over | |||
er | ||||
which it sends all of the corresponding IKE and ESP messages. This | which it sends all of the corresponding IKE and ESP messages. This | |||
helps ensure that any firewall or NAT mappings allocated for the TCP | helps ensure that any firewall or NAT mappings allocated for the TCP | |||
connection apply to all of the traffic associated with the IKE SA | connection apply to all of the traffic associated with the IKE SA | |||
equally. | equally. | |||
</t> | </t> | |||
<t> As with TCP Originators, a TCP Responder <bcp14>SHOULD</bcp14> send | ||||
<t>Similarly, a TCP Responder SHOULD at any given time send packets fo | packets for an | |||
r | IKE SA and its Child SAs over only one TCP connection at any given | |||
an IKE SA and its Child SAs over only one TCP connection. It SHOULD | time. It <bcp14>SHOULD</bcp14> choose the TCP connection on which it last rec | |||
choose the TCP connection on which it last received a valid and | eived | |||
decryptable IKE or ESP message. In order to be considered valid for | a valid and decryptable IKE or ESP message. In order to be | |||
choosing a TCP connection, an IKE message must be successfully | considered valid for choosing a TCP connection, an IKE message must | |||
decrypted and authenticated, not be a retransmission of a previously | be successfully decrypted and authenticated, not be a retransmission | |||
received message, and be within the expected window for IKE | of a previously received message, and be within the expected window | |||
message IDs. Similarly, an ESP message must pass authentication | for IKE message IDs. Similarly, an ESP message must be successfully | |||
checks and be decrypted, and must not be a replay of a previous | decrypted and authenticated, and must not be a replay of a previous | |||
message. | message. | |||
</t> | </t> | |||
<t>Since a connection may be broken and a new connection re-established | ||||
<t>Since a connection may be broken and a new connection re-establishe | ||||
d | ||||
by the TCP Originator without the TCP Responder being aware, a TCP | by the TCP Originator without the TCP Responder being aware, a TCP | |||
Responder SHOULD accept receiving IKE and ESP messages on both old | Responder <bcp14>SHOULD</bcp14> accept receiving IKE and ESP messages on both old | |||
and new connections until the old connection is closed by the TCP | and new connections until the old connection is closed by the TCP | |||
Originator. A TCP Responder MAY close a TCP connection that it | Originator. A TCP Responder <bcp14>MAY</bcp14> close a TCP connection that it | |||
perceives as idle and extraneous (one previously used for IKE and ESP | perceives as idle and extraneous (one previously used for IKE and ESP | |||
messages that has been replaced by a new connection). | messages that has been replaced by a new connection). | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="retr" numbered="true" toc="default"> | |||
<name>Retransmissions</name> | ||||
<t><xref target="RFC7296" sectionFormat="of" section="2.1"/> describes h | ||||
ow IKEv2 deals with the unreliability | ||||
of the UDP protocol. | ||||
<section title="Retransmissions" anchor="retr" > | In brief, the exchange Initiator is responsible for retransmissions | |||
<t>Section 2.1 of <xref target="RFC7296" /> describes how IKEv2 deals | and must retransmit request messages until a response message is | |||
with the unreliability | received. If no reply is received after several | |||
of the UDP protocol. In brief, the exchange Initiator is responsible | ||||
for | ||||
retransmissions and must retransmit requests message until response | ||||
message is received. If no reply is received after several | ||||
retransmissions, the SA is deleted. The Responder never initiates ret ransmission, | retransmissions, the SA is deleted. The Responder never initiates ret ransmission, | |||
but must send a response message again in case it receives a retransmi | but it must send a response message again in case it receives a retran | |||
tted request. | smitted request. | |||
</t> | </t> | |||
<t>When IKEv2 uses a reliable transport protocol, like TCP, the retransm | ||||
ission rules are as follows: | ||||
</t> | ||||
<t>When IKEv2 uses a reliable transport protocol, like TCP, the retran | <ul spacing="normal"> | |||
smission rules are as follows: | <li>The exchange Initiator <bcp14>SHOULD NOT</bcp14> retransmit reques | |||
<list style="symbols" > | t message (*); if | |||
<t>The exchange Initiator SHOULD NOT retransmit request message (*); | ||||
if | ||||
no response is received within some reasonable period of time, the | no response is received within some reasonable period of time, the | |||
IKE SA is deleted. | IKE SA is deleted. | |||
</t> | </li> | |||
<t>If a new TCP connection for the IKE SA is established while the e | <li>If a new TCP connection for the IKE SA is established while the ex | |||
xchange | change | |||
Initiator is waiting for a response, the Initiator MUST | Initiator is waiting for a response, the Initiator <bcp14>MUST</bcp1 | |||
4> | ||||
retransmit its request over this connection and continue to wait for a response. | retransmit its request over this connection and continue to wait for a response. | |||
</t> | </li> | |||
<t>The exchange Responder does not change its behavior, but acts as | <li>The exchange Responder does not change its behavior, but acts as | |||
described in Section 2.1 of <xref target="RFC7296" />. | described in <xref target="RFC7296" sectionFormat="of" se | |||
</t> | ction="2.1"/>. | |||
</list> | </li> | |||
(*) This is an optimization, implementations may continue to use the r | </ul> | |||
etransmission logic from | <t> | |||
Section 2.1 of <xref target="RFC7296" /> for simplicity. | (*) This is an optimization; implementations may continue to use the r | |||
</t> | etransmission logic from | |||
</section> | <xref target="RFC7296" sectionFormat="of" section="2.1"/> for simplici | |||
ty. | ||||
<section title="Cookies and Puzzles" anchor="cookie-puzzle" > | </t> | |||
<t>IKEv2 provides a DoS attack protection mechanism through Cookies, w | </section> | |||
hich | <section anchor="cookie-puzzle" numbered="true" toc="default"> | |||
is described in Section 2.6 of <xref target="RFC7296" />. <xref targe | <name>Cookies and Puzzles</name> | |||
t="RFC8019" /> extends this | <t>IKEv2 provides a DoS attack protection mechanism through Cookies, whi | |||
ch | ||||
is described in <xref target="RFC7296" sectionFormat="of" section="2.6 | ||||
"/>. <xref target="RFC8019" format="default"/> extends this | ||||
mechanism for protection against DDoS attacks by means of Client | mechanism for protection against DDoS attacks by means of Client | |||
Puzzles. Both mechanisms allow the Responder to avoid keeping state u ntil | Puzzles. Both mechanisms allow the Responder to avoid keeping state u ntil | |||
the Initiator proves its IP address is legitimate (and after solving a puzzle if required). | the Initiator proves its IP address is legitimate (and after solving a puzzle if required). | |||
</t> | </t> | |||
<t>The connection-oriented nature of TCP transport brings additional | ||||
<t>The connection-oriented nature of TCP transport brings additional | ||||
considerations for using these mechanisms. | considerations for using these mechanisms. | |||
In general, Cookies provide less value in case of TCP encapsulation, | In general, Cookies provide less value in the case of TCP encapsulatio | |||
since by the time a Responder receives the IKE_SA_INIT request, the TC | n; by the time a Responder receives the IKE_SA_INIT request, the TCP | |||
P | ||||
session has already been established and the Initiator's IP address | session has already been established and the Initiator's IP address | |||
has been verified. Moreover, a TCP/IP stack creates state once | has been verified. Moreover, a TCP/IP stack creates state once | |||
a TCP SYN packet is received (unless SYN Cookies described in <xref ta rget="RFC4987" /> | a TCP SYN packet is received (unless SYN Cookies described in <xref ta rget="RFC4987" format="default"/> | |||
are employed), which contradicts the statelessness of IKEv2 Cookies. | are employed), which contradicts the statelessness of IKEv2 Cookies. | |||
In particular, with TCP, an attacker is able to mount a SYN flooding D oS attack | In particular, with TCP, an attacker is able to mount a SYN flooding D oS attack | |||
which an IKEv2 Responder cannot prevent using stateless IKEv2 Cookies. | that an IKEv2 Responder cannot prevent using stateless IKEv2 Cookies. | |||
Thus, when using TCP encapsulation, it makes little sense to send Cook ie requests without | Thus, when using TCP encapsulation, it makes little sense to send Cook ie requests without | |||
Puzzles unless the Responder is concerned with a possibility of TCP | Puzzles unless the Responder is concerned with a possibility of TCP | |||
Sequence Number attacks (see <xref target="RFC6528" /> for details). P uzzles, on | sequence number attacks (see <xref target="RFC6528"/> and <xref target ="RFC9293" format="default"/> for details). Puzzles, on | |||
the other hand, still remain useful (and their use requires usi ng Cookies). | the other hand, still remain useful (and their use requires usi ng Cookies). | |||
</t> | </t> | |||
<t>The following considerations are applicable for using Cookie and | ||||
<t>The following considerations are applicable for using Cookie and | Puzzle mechanisms in the case of TCP encapsulation: | |||
Puzzle mechanisms in case of TCP encapsulation: | </t> | |||
<list style="symbols" > | <ul spacing="normal"> | |||
<t>the exchange Responder SHOULD NOT send an IKEv2 Cookie request wi | <li>The exchange Responder <bcp14>SHOULD NOT</bcp14> send an IKEv2 Coo | |||
thout an accompanied Puzzle; | kie request without an accompanied Puzzle; | |||
implementations might choose to have exceptions to this for c | implementations might choose to have exceptions to this for c | |||
ases like mitigating TCP Sequence Number attacks. | ases like mitigating TCP sequence number attacks. | |||
</t> | </li> | |||
<t>if the Responder chooses to send a Cookie request (possibly along | <li>If the Responder chooses to send a Cookie request (possibly along | |||
with Puzzle request), then the TCP connection that the IKE_SA_INIT | with Puzzle request), then the TCP connection that the IKE_SA_INIT | |||
request message was received over SHOULD be closed after the Respond er sends its reply | request message was received over <bcp14>SHOULD</bcp14> be closed af ter the Responder sends its reply | |||
and no repeated requests are received within some short period of ti me | and no repeated requests are received within some short period of ti me | |||
to keep the Responder stateless (see <xref target="tradeoff" />). No te that the Responder MUST NOT | to keep the Responder stateless (see <xref target="tradeoff" format= "default"/>). Note that the Responder <bcp14>MUST NOT</bcp14> | |||
include the Initiator's TCP port into the Cookie | include the Initiator's TCP port into the Cookie | |||
calculation (*), since the Cookie can be returned over a new | calculation (*) since the Cookie can be returned over a n ew | |||
TCP connection with a different port. | TCP connection with a different port. | |||
</t> | </li> | |||
<t>the exchange Initiator acts as described in Section 2.6 of | <li>The exchange Initiator acts as described in <xref target="RFC7296" | |||
<xref target="RFC7296" /> and Section 7 of <xref target="RFC8019" /> | sectionFormat="of" section="2.6"/> and <xref target="RFC8019" sectionFormat="of | |||
, | " section="7"/>, i.e., using TCP encapsulation doesn't change the Initiator's be | |||
i.e. using TCP encapsulation doesn't change the Initiator's behavior | havior. | |||
. | </li> | |||
</t> | </ul> | |||
</list> | <t> | |||
(*) Examples of Cookie calculation methods are given in Section 2.6 | (*) Examples of Cookie calculation methods are given in <xref | |||
of <xref target="RFC7296" /> and in Section 7.1.1.3 of <xref target="R | target="RFC7296" sectionFormat="of" section="2.6"/> and in <xref | |||
FC8019" /> | target="RFC8019" sectionFormat="of" section="7.1.1.3"/>, and they don' | |||
and they don't include transport protocol ports. However these exampl | t | |||
es are given | include transport protocol ports. However, these examples are given | |||
for illustrative purposes, since Cookie generation algorithm is a | for illustrative purposes since the Cookie generation algorithm is a | |||
local matter and some implementations might include port numbers, | local matter and some implementations might include port numbers | |||
that won't work with TCP encapsulation. Note also that these | that won't work with TCP encapsulation. Note also that these | |||
examples include the Initiator's IP address in Cookie calculation. | examples include the Initiator's IP address in Cookie calculation. | |||
In general this address may change between two initial requests (with | In general, this address may change between two initial requests | |||
and without Cookies). | (with and without Cookies). This may happen due to NATs, which | |||
This may happen due to NATs, since NATs have more freedom to change so | have more freedom to change source IP addresses for new TCP | |||
urce IP addresses for new | connections than for UDP. In such cases, cookie verification might | |||
TCP connections than for UDP. In such cases cookie verification might | fail. | |||
fail. | </t> | |||
</t> | <section anchor="tradeoff" numbered="true" toc="default"> | |||
<name>Statelessness versus Delay of SA Establishment</name> | ||||
<section title="Statelessness versus Delay of SA Establishment" anchor | <t> | |||
="tradeoff" > | ||||
<t> | ||||
There is a trade-off in choosing the period of time after which | There is a trade-off in choosing the period of time after which | |||
the TCP connection is closed. If it is too short, then the proper In itiator | the TCP connection is closed. If it is too short, then the proper In itiator | |||
which repeats its request would need to re-establish the TCP connect ion | that repeats its request would need to re-establish the TCP connecti on, | |||
introducing additional delay. On the other hand, if it is too long, then | introducing additional delay. On the other hand, if it is too long, then | |||
the Responder's resources would be wasted in case the Initiator neve r comes back. | the Responder's resources would be wasted in case the Initiator neve r comes back. | |||
This document doesn't specify the duration of time, because it doesn | This document doesn't mandate the duration of time because it doesn' | |||
't affect interoperability, | t affect interoperability, | |||
but it is believed that 5-10 seconds is a good compromise. Note also | but it is believed that 5-10 seconds is a good compromise. Also, not | |||
, that if the Responder requests | e that if the Responder requests that | |||
the Initiator to solve a puzzle, then the Responder can estimate how | the Initiator solve a puzzle, then the Responder can estimate how lo | |||
long it would take the Initiator | ng it would take the Initiator | |||
to find a solution and adjust the time interval accordingly. | to find a solution and adjust the time interval accordingly. | |||
</t> | ||||
</section> | ||||
</section> | ||||
<section title="Error Handling in IKE_SA_INIT" anchor="errors" > | ||||
<t>Section 2.21.1 of <xref target="RFC7296" /> describes how error not | ||||
ifications | ||||
are handled in the IKE_SA_INIT exchange. In particular, it is | ||||
advised | ||||
that the Initiator should not act immediately after receiving an error | ||||
notification and should instead wait some time for valid response, | ||||
since the IKE_SA_INIT messages are completely unauthenticated. This | ||||
advice does not apply equally in case of TCP encapsulation. If the | ||||
Initiator receives a response message over TCP, then either this | ||||
message is genuine and was sent by the peer, or the TCP session was | ||||
hijacked and the message is forged. In this latter case, no genuine | ||||
messages from the Responder will be received. | ||||
</t> | </t> | |||
</section> | ||||
<t>Thus, in case of TCP encapsulation, an Initiator SHOULD NOT wait fo | </section> | |||
r | <section anchor="errors" numbered="true" toc="default"> | |||
<name>Error Handling in IKE_SA_INIT</name> | ||||
<t><xref target="RFC7296" sectionFormat="of" section="2.21.1"/> | ||||
describes how error notifications are handled in the IKE_SA_INIT | ||||
exchange. In particular, it is advised that the Initiator should not | ||||
act immediately after receiving an error notification; instead, it shoul | ||||
d | ||||
wait some time for a valid response since the IKE_SA_INIT | ||||
messages are completely unauthenticated. This advice does not apply | ||||
equally in the case of TCP encapsulation. If the Initiator receives a | ||||
response message over TCP, then either this message is genuine and was | ||||
sent by the peer or the TCP session was hijacked and the message is | ||||
forged. In the latter case, no genuine messages from the Responder | ||||
will be received. | ||||
</t> | ||||
<t>Thus, in the case of TCP encapsulation, an Initiator <bcp14>SHOULD NO | ||||
T</bcp14> wait for | ||||
additional messages in case it receives an error notification from the | additional messages in case it receives an error notification from the | |||
Responder in the IKE_SA_INIT exchange. | Responder in the IKE_SA_INIT exchange. | |||
</t> | </t> | |||
<t>In the IKE_SA_INIT exchange, if the Responder returns an error notifi | ||||
<t>If in the IKE_SA_INIT exchange the Responder returns an error notif | cation that implies | |||
ication that implies | ||||
a recovery action from the Initiator (such as INVALID_KE_PAYLOAD | a recovery action from the Initiator (such as INVALID_KE_PAYLOAD | |||
or INVALID_MAJOR_VERSION, see Section 2.21.1 of <xref target="RFC7296" | or INVALID_MAJOR_VERSION, see <xref target="RFC7296" sectionFormat="of | |||
/>) | " section="2.21.1"/>), | |||
then the Responder SHOULD NOT close the TCP connection immediately, in | then the Responder <bcp14>SHOULD NOT</bcp14> close the TCP connection | |||
anticipation | immediately in anticipation of the fact | |||
that the Initiator will repeat the request with corrected parameters. | that the Initiator will repeat the request with corrected parameters. | |||
See also <xref target="cookie-puzzle" />. | See also <xref target="cookie-puzzle" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="nat-det" numbered="true" toc="default"> | ||||
<section title="NAT Detection Payloads" anchor="nat-det"> | <name>NAT-Detection Payloads</name> | |||
<t>When negotiating over UDP, IKE_SA_INIT packets include | <t>When negotiating over UDP, IKE_SA_INIT packets include | |||
NAT_DETECTION_SOURCE_IP and NAT_DETECTION_DESTINATION_IP payloads to | NAT_DETECTION_SOURCE_IP and NAT_DETECTION_DESTINATION_IP payloads to | |||
determine if UDP encapsulation of IPsec packets should be used. | determine if UDP encapsulation of IPsec packets should be used. | |||
These payloads contain SHA-1 digests of the SPIs, IP addresses, and | These payloads contain SHA-1 digests of the SPIs, IP addresses, and | |||
ports as defined in <xref target="RFC7296"/>. IKE_SA_INIT packets sen | ports as defined in <xref target="RFC7296" format="default"/>. IKE_SA | |||
t on a TCP | _INIT packets sent on a TCP | |||
connection SHOULD include these payloads with the same content as | connection <bcp14>SHOULD</bcp14> include these payloads with the same | |||
when sending over UDP and SHOULD use the applicable TCP ports when | content as | |||
when sending over UDP and <bcp14>SHOULD</bcp14> use the applicable TCP | ||||
ports when | ||||
creating and checking the SHA-1 digests. | creating and checking the SHA-1 digests. | |||
</t> | </t> | |||
<t>If a NAT is detected due to the SHA-1 digests not matching the | ||||
<t>If a NAT is detected due to the SHA-1 digests not matching the | ||||
expected values, no change should be made for encapsulation of | expected values, no change should be made for encapsulation of | |||
subsequent IKE or ESP packets, since TCP encapsulation inherently | subsequent IKE or ESP packets since TCP encapsulation inherently | |||
supports NAT traversal. However, for the transport mode IPsec SAs, imp lementations | supports NAT traversal. However, for the transport mode IPsec SAs, imp lementations | |||
need to handle TCP and UDP packet checksum fixup during decapsulation, | need to handle TCP and UDP packet checksum fixup during decapsulation, | |||
as defined for UDP encapsulation in <xref target="RFC3948"/>. | as defined for UDP encapsulation in <xref target="RFC3948" format="def | |||
</t> | ault"/>. | |||
</t> | ||||
<t>Implementations MAY use the information that | <t>Implementations <bcp14>MAY</bcp14> use the information that | |||
a NAT is present to influence keepalive timer values. | a NAT is present to influence keepalive timer values. | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="nat-ka" numbered="true" toc="default"> | |||
<name>NAT-Keepalive Packets</name> | ||||
<section title="NAT-keepalive Packets" anchor="nat-ka"> | <t>Encapsulating IKE and IPsec inside of a TCP connection can impact the | |||
<t>Encapsulating IKE and IPsec inside of a TCP connection can impact th | ||||
e | ||||
strategy that implementations use to | strategy that implementations use to | |||
maintain middlebox port mappings. | maintain middlebox port mappings. | |||
</t> | </t> | |||
<t>In general, TCP port mappings are maintained by NATs longer than UDP | ||||
<t>In general, TCP port mappings are maintained by NATs longer than UDP | port mappings, so IPsec ESP NAT-keepalive packets <xref target="RFC394 | |||
port mappings, so IPsec ESP NAT-keepalive packets <xref target="RFC394 | 8" format="default"/> <bcp14>SHOULD NOT</bcp14> be | |||
8"/> SHOULD NOT be | ||||
sent when using TCP encapsulation. Any implementation using TCP | sent when using TCP encapsulation. Any implementation using TCP | |||
encapsulation MUST silently drop incoming NAT-keepalive packets | encapsulation <bcp14>MUST</bcp14> silently drop incoming NAT-keepalive packets | |||
and not treat them as errors. NAT-keepalive packets over a | and not treat them as errors. NAT-keepalive packets over a | |||
TCP-encapsulated IPsec connection will be sent as a one-octet-long pay | TCP-encapsulated IPsec connection will be sent as a 1-octet-long paylo | |||
load | ad | |||
with the value 0xFF, preceded by the two byte Length specifying a leng | with the value 0xFF, preceded by the 2-octet Length specifying a lengt | |||
th | h | |||
of 3 (since it includes the length of the Length field). | of 3 (since it includes the length of the Length field). | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="dpd" numbered="true" toc="default"> | |||
<name>Dead Peer Detection and Transport Keepalives</name> | ||||
<section title="Dead Peer Detection and Transport Keepalives" anchor="dpd | <t>Peer liveness should be checked | |||
"> | using IKE informational packets <xref target="RFC7296" format="default | |||
<t>Peer liveness should be checked | "/>. | |||
using IKE informational packets <xref target="RFC7296"/>. | </t> | |||
</t> | <t>Note that, depending on the configuration of TCP and TLS on the | |||
connection, TCP keep-alives <xref target="RFC1122" format="default"/> | ||||
<t>Note that, depending on the configuration of TCP and TLS on the | and TLS keep-alives <xref target="RFC6520" format="default"/> | |||
connection, TCP keep-alives <xref target="RFC1122"/> and TLS keep-aliv | <bcp14>MAY</bcp14> be used. These <bcp14>MUST NOT</bcp14> be used as | |||
es <xref target="RFC6520"/> | indications of IKE peer | |||
MAY be used. These MUST NOT be used as indications of IKE peer | ||||
liveness, for which purpose the standard IKEv2 mechanism of exchanging (usually empty) INFORMATIONAL messages is used | liveness, for which purpose the standard IKEv2 mechanism of exchanging (usually empty) INFORMATIONAL messages is used | |||
(see Section 1.4 of <xref target="RFC7296" />). | (see <xref target="RFC7296" sectionFormat="of" section="1.4"/>). | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="ipsec" numbered="true" toc="default"> | ||||
<section title="Implications of TCP Encapsulation on IPsec SA Processing | <name>Implications of TCP Encapsulation on IPsec SA Processing</name> | |||
" anchor="ipsec" > | <t>Using TCP encapsulation affects some aspects of IPsec SA processing. | |||
<t>Using TCP encapsulation affects some aspects of IPsec SA processing | </t> | |||
. | <ol spacing="normal" type="1"><li><xref target="RFC4301" sectionFormat=" | |||
<list style="numbers" > | of" section="8.1"/> requires all tunnel mode IPsec SAs to | |||
<t>Section 8.1 of <xref target="RFC4301"/> requires all tunnel mode | ||||
IPsec SAs to | ||||
be able to copy the Don't Fragment (DF) bit from inner IPv4 header t o | be able to copy the Don't Fragment (DF) bit from inner IPv4 header t o | |||
the outer (tunnel) one. With TCP encapsulation this is generally | the outer (tunnel) one. With TCP encapsulation, this is generally | |||
not possible, because the TCP/IP stack manages the DF bit in the out | not possible because the TCP/IP stack manages the DF bit in the oute | |||
er IPv4 | r IPv4 | |||
header, and usually the stack ensures that the DF bit is set for TCP | header, and usually the stack ensures that the DF bit is set for TCP | |||
packets to avoid IP fragmentation. Note, that this behavior is | packets to avoid IP fragmentation. Note, that this behavior is | |||
compliant with generic tunneling considerations, since the outer TCP header acts | compliant with generic tunneling considerations since the outer TCP header acts | |||
as a link-layer protocol and its fragmentation and reassembly have n o correlation with | as a link-layer protocol and its fragmentation and reassembly have n o correlation with | |||
the inner payload. | the inner payload. | |||
</t> | </li> | |||
<li>The other feature that is less applicable with TCP encapsulation i | ||||
<t>The other feature that is less applicable with TCP encapsulation | s an | |||
is an | ||||
ability to split traffic of different QoS classes into different | ability to split traffic of different QoS classes into different | |||
IPsec SAs, created by a single IKE SA. In this case the | IPsec SAs, created by a single IKE SA. In this case, the | |||
Differentiated Services Code Point (DSCP) field is usually copied | Differentiated Services Code Point (DSCP) field is usually copied | |||
from the inner IP header to the outer (tunnel) one, ensuring that | from the inner IP header to the outer (tunnel) one, ensuring that | |||
IPsec traffic of each SA receives the corresponding level of service . | IPsec traffic of each SA receives the corresponding level of service . | |||
With TCP encapsulation all IPsec SAs created by a single IKE SA will | With TCP encapsulation, all IPsec SAs created by a single IKE SA wil | |||
share a single TCP connection and thus will receive the same level o | l | |||
f | share a single TCP connection; thus, they will receive the same leve | |||
service (see <xref target="perf.3" />). If this functionality is ne | l of | |||
eded, | service (see <xref target="perf.3" format="default"/>). If this fun | |||
implementations should create several IKE SAs each over separate TCP | ctionality is needed, | |||
connection | implementations should create several IKE SAs each over separate TCP | |||
connections | ||||
and assign a corresponding DSCP value to each of them. | and assign a corresponding DSCP value to each of them. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <t>TCP encapsulation of IPsec packets may have implications | |||
<t>TCP encapsulation of IPsec packets may have implications | ||||
on performance of the encapsulated traffic. Performance considerations | on performance of the encapsulated traffic. Performance considerations | |||
are discussed in <xref target="perf" />. | are discussed in <xref target="perf" format="default"/>. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Interaction with IKEv2 Extensions" anchor="extensions" > | <section anchor="extensions" numbered="true" toc="default"> | |||
<section title="MOBIKE Protocol" anchor="mobike"> | <name>Interaction with IKEv2 Extensions</name> | |||
<t>The MOBIKE protocol, which allows SAs to migrate between IP | <section anchor="mobike" numbered="true" toc="default"> | |||
addresses, is defined in <xref target="RFC4555"/>, and <xref target="R | <name>MOBIKE Protocol</name> | |||
FC4621"/> further clarifies | <t>The MOBIKE protocol, which allows SAs to migrate between IP | |||
addresses, is defined in <xref target="RFC4555" format="default"/>; <x | ||||
ref target="RFC4621" format="default"/> further clarifies | ||||
the details of the protocol. When an IKE session that has negotiated M OBIKE is | the details of the protocol. When an IKE session that has negotiated M OBIKE is | |||
transitioning between networks, the Initiator of the transition may | transitioning between networks, the Initiator of the transition may | |||
switch between using TCP encapsulation, UDP encapsulation, or no | switch between using TCP encapsulation, UDP encapsulation, or no | |||
encapsulation. Implementations that implement both MOBIKE and TCP | encapsulation. Implementations that implement both MOBIKE and TCP | |||
encapsulation within the same connection configuration | encapsulation within the same connection configuration | |||
MUST support dynamically enabling and disabling TCP | <bcp14>MUST</bcp14> support dynamically enabling and disabling TCP | |||
encapsulation as interfaces change. | encapsulation as interfaces change. | |||
</t> | </t> | |||
<t>When a MOBIKE-enabled Initiator changes networks, the | ||||
<t>When a MOBIKE-enabled Initiator changes networks, the | INFORMATIONAL exchange with the UPDATE_SA_ADDRESSES notification <bcp1 | |||
INFORMATIONAL exchange with the UPDATE_SA_ADDRESSES notification SHOUL | 4>SHOULD</bcp14> be initiated | |||
D be initiated | ||||
first over UDP before attempting over TCP. If there is a response to the | first over UDP before attempting over TCP. If there is a response to the | |||
request sent over UDP, then the ESP packets should be sent directly ov er IP or over UDP port 4500 | request sent over UDP, then the ESP packets should be sent directly ov er IP or over UDP port 4500 | |||
(depending on if a NAT was detected), regardless of if a connection on a previous | (depending on if a NAT was detected), regardless of if a connection on a previous | |||
network was using TCP encapsulation. If no response is received withi n a certain period of time after | network was using TCP encapsulation. If no response is received withi n a certain period of time after | |||
several retransmissions, the Initiator ought to change its transport f or this exchange from | several retransmissions, the Initiator ought to change its transport f or this exchange from | |||
UDP to TCP and resend the request message. A new INFORMATIONAL exchang | UDP to TCP and resend the request message. A new INFORMATIONAL exchang | |||
e MUST | e <bcp14>MUST | |||
NOT be started in this situation. If the Responder only responds to th | NOT</bcp14> be started in this situation. If the Responder only respon | |||
e request sent over TCP, then | ds to the request sent over TCP, then | |||
the ESP packets should be sent over the TCP connection, regardless of | the ESP packets should be sent over the TCP connection, regardless of | |||
if a connection on a previous network did not use TCP encapsulation. | if a connection on a previous network did not use TCP encapsulation. | |||
</t> | </t> | |||
<t>The value of the timeout and the specific number of retransmissions b | ||||
<t>The value of the timeout and the specific number of retransmissions | efore switching to | |||
before switching to | ||||
TCP can vary depending on the Initiator's configuration. Implementatio ns ought to provide | TCP can vary depending on the Initiator's configuration. Implementatio ns ought to provide | |||
reasonable defaults to ensure that UDP attempts have a chance to succe ed, but can shorten | reasonable defaults to ensure that UDP attempts have a chance to succe ed, but can shorten | |||
the timeout based on historical data or metrics. | the timeout based on historical data or metrics. | |||
</t> | </t> | |||
<t>If the TCP transport was used for the previous network connection, th | ||||
<t>If the TCP transport was used for the previous network connection, | e old TCP | |||
the old TCP | connection <bcp14>SHOULD</bcp14> be closed by the Initiator once MOBIK | |||
connection SHOULD be closed by the Initiator once MOBIKE finishes migr | E finishes migration | |||
ation | ||||
to a new connection (either TCP or UDP). | to a new connection (either TCP or UDP). | |||
</t> | </t> | |||
<t>Since switching from UDP to TCP can happen during a single | ||||
<t>Since switching from UDP to TCP can happen during a single | ||||
INFORMATIONAL message exchange, the content of the NAT_DETECTIO N_*_IP | INFORMATIONAL message exchange, the content of the NAT_DETECTIO N_*_IP | |||
notifications will in most cases be incorrect (since UDP and TC P ports | notifications will in most cases be incorrect (since UDP and TC P ports | |||
will most likely be different), and the peer may incorrectly de tect | will most likely be different), and the peer may incorrectly de tect | |||
the presence of a NAT. Section 3.5 of <xref target="RFC4555" /> states that | the presence of a NAT. <xref target="RFC4555" sectionFormat="of " section="3.5"/> states that | |||
a new INFORMATIONAL exchange with the UPDATE_SA_ADDRESSES notify is in itiated | a new INFORMATIONAL exchange with the UPDATE_SA_ADDRESSES notify is in itiated | |||
in case the address (or transport) is changed while waiting for a resp onse. | in case the address (or transport) is changed while waiting for a resp onse. | |||
</t> | </t> | |||
<t><xref target="RFC4555" sectionFormat="of" section="3.5"/> also states | ||||
<t>Section 3.5 of <xref target="RFC4555" /> also states that | that | |||
once an IKE SA is switched to a new IP address, all outstanding reques ts in this SA | once an IKE SA is switched to a new IP address, all outstanding reques ts in this SA | |||
are immediately retransmitted using this address. See also <xref targe | are immediately retransmitted using this address. See also <xref targe | |||
t="retr" />. | t="retr" format="default"/>. | |||
</t> | </t> | |||
<t>The MOBIKE protocol defines the NO_NATS_ALLOWED notification that can | ||||
<t>The MOBIKE protocol defines the NO_NATS_ALLOWED notification that c | be | |||
an be | ||||
used to detect the presence of NAT between peer and to refuse to | used to detect the presence of NAT between peer and to refuse to | |||
communicate in this situation. In case of TCP the NO_NATS_ALLOWED | communicate in this situation. In the case of TCP, the NO_NATS_ALLOWE | |||
notification SHOULD be ignored because TCP generally has no problems | D | |||
notification <bcp14>SHOULD</bcp14> be ignored because TCP generally ha | ||||
s no problems | ||||
with NAT boxes. | with NAT boxes. | |||
</t> | </t> | |||
<t><xref target="RFC4555" sectionFormat="of" section="3.7"/> describes a | ||||
<t>Section 3.7 of <xref target="RFC4555"/> describes an additional opt | n additional optional step in the | |||
ional step in the | process of changing IP addresses called "Return Routability Check". I | |||
process of changing IP addresses called Return Routability Check. It | t | |||
is performed by Responders in order to be sure that the new | is performed by Responders in order to be sure that the new | |||
initiator's address is in fact routable. In case of TCP | Initiator's address is, in fact, routable. | |||
encapsulation this check has little value, since TCP handshake proves | In the case of TCP encapsulation, this check has little value since a | |||
routability of the TCP Originator's address. So, in case of TCP | TCP handshake proves the routability of the TCP Originator's address; | |||
encapsulation the Return Routability Check SHOULD NOT be performed. | thus, the Return Routability Check <bcp14>SHOULD NOT</bcp14> be performed. | |||
</t> | ||||
</section> | ||||
<section title="IKE Redirect" anchor="redirect" > | </t> | |||
<t>A redirect mechanism for IKEv2 is defined in <xref target="RFC5685" | </section> | |||
/>. This mechanism | <section anchor="redirect" numbered="true" toc="default"> | |||
<name>IKE Redirect</name> | ||||
<t>A redirect mechanism for IKEv2 is defined in <xref target="RFC5685" f | ||||
ormat="default"/>. This mechanism | ||||
allows security gateways to redirect clients to another gateway | allows security gateways to redirect clients to another gateway | |||
either during IKE SA establishment or after session setup. If a | either during IKE SA establishment or after session setup. If a | |||
client is connecting to a security gateway using TCP and | client is connecting to a security gateway using TCP and | |||
then is redirected to another security gateway, the client | then is redirected to another security gateway, the client | |||
needs to reset its transport selection. In other words, the client | needs to reset its transport selection. | |||
MUST again try first UDP and then fall back to TCP while establishing | ||||
a new IKE SA, regardless of the transport of the SA the redirect | ||||
notification was received over (unless the client's configuration | ||||
instructs it to instantly use TCP for the gateway it is redirected | ||||
to). | ||||
</t> | ||||
</section> | ||||
<section title="IKEv2 Session Resumption" anchor="resumption" > | In other words, with the next security gateway, the client <bcp14>MUST</bcp14> f | |||
<t>Session resumption for IKEv2 is defined in <xref target="RFC5723"/> | irst try UDP and then fall | |||
. Once an IKE SA is | back to TCP while establishing a new IKE SA, regardless of the transport of | |||
the SA the redirect notification was received over (unless the client's | ||||
configuration instructs it to instantly use TCP for the gateway it is | ||||
redirected to). | ||||
</t> | ||||
</section> | ||||
<section anchor="resumption" numbered="true" toc="default"> | ||||
<name>IKEv2 Session Resumption</name> | ||||
<t>Session resumption for IKEv2 is defined in <xref target="RFC5723" for | ||||
mat="default"/>. Once an IKE SA is | ||||
established, the server creates a resumption ticket where information | established, the server creates a resumption ticket where information | |||
about this SA is stored, and transfers this ticket to the client. | about this SA is stored and transfers this ticket to the client. | |||
The ticket may be later used to resume the IKE SA after it is deleted. | The ticket may be later used to resume the IKE SA after it is deleted. | |||
In the event of resumption the client presents the ticket in a new | In the event of resumption, the client presents the ticket in a new | |||
exchange, called IKE_SESSION_RESUME. Some parameters in the new SA | exchange, called IKE_SESSION_RESUME. Some parameters in the new SA | |||
are retrieved from the ticket and others are re-negotiated (more detai | are retrieved from the ticket and others are renegotiated (more detail | |||
ls | s | |||
are given in Section 5 of <xref target="RFC5723"/>). | are given in <xref target="RFC5723" sectionFormat="of" section="5"/>). | |||
</t> | </t> | |||
<t>Since network conditions may change while the client is inactive, | ||||
<t>Since network conditions may change while the client is inactive, | the fact that TCP encapsulation was used in an old SA <bcp14>SHOULD NO | |||
the fact that TCP encapsulation was used in an old SA SHOULD NOT affec | T</bcp14> affect which transport | |||
t which transport | ||||
is used during session resumption. In other words, the transport shoul d be | is used during session resumption. In other words, the transport shoul d be | |||
selected as if the IKE SA is being created from scratch. | selected as if the IKE SA is being created from scratch. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="ha" numbered="true" toc="default"> | ||||
<section title="IKEv2 Protocol Support for High Availability" anchor="ha | <name>IKEv2 Protocol Support for High Availability</name> | |||
" > | <t><xref target="RFC6311" format="default"/> defines a support for High | |||
<t><xref target="RFC6311"/> defines a support for High Availability in | Availability in IKEv2. | |||
IKEv2. | ||||
In case of cluster failover, a new active node | In case of cluster failover, a new active node | |||
must immediately initiate a special INFORMATION exchange containing th e | must immediately initiate a special INFORMATION exchange containing th e | |||
IKEV2_MESSAGE_ID_SYNC notification, which instructs the client to | IKEV2_MESSAGE_ID_SYNC notification, which instructs the client to | |||
skip some number of Message IDs that might not be synchronized yet | skip some number of Message IDs that might not be synchronized yet | |||
between nodes at the time of failover. | between nodes at the time of failover. | |||
</t> | </t> | |||
<t>Synchronizing states when using TCP encapsulation is much harder than | ||||
<t>Synchronizing states when using TCP encapsulation is much harder th | ||||
an | ||||
when using UDP; doing so requires access to TCP/IP stack internals, wh ich is | when using UDP; doing so requires access to TCP/IP stack internals, wh ich is | |||
not always available from an IKE/IPsec implementation. If a cluster | not always available from an IKE/IPsec implementation. If a cluster | |||
implementation doesn't synchronize TCP states between nodes, then | implementation doesn't synchronize TCP states between nodes, then | |||
after failover event the new active node will not have any TCP | after failover event the new active node will not have any TCP | |||
connection with the client, so the node cannot initiate the | connection with the client, so the node cannot initiate the | |||
INFORMATIONAL exchange as required by <xref target="RFC6311"/>. Since | INFORMATIONAL exchange as required by <xref target="RFC6311" format="d | |||
the cluster | efault"/>. Since the cluster | |||
usually acts as TCP Responder, the new active node cannot re- | usually acts as TCP Responder, the new active node cannot re- establis | |||
establish TCP connection, since only the TCP Originator can do it. | h TCP connection because only the TCP Originator can do it. | |||
For the client, the cluster failover event may remain | For the client, the cluster failover event may remain | |||
undetected for long time if it has no IKE or ESP traffic to send. Onc e | undetected for long time if it has no IKE or ESP traffic to send. Onc e | |||
the client sends an ESP or IKEv2 packet, the cluster node will reply | the client sends an ESP or IKEv2 packet, the cluster node will reply | |||
with TCP RST and the client (as TCP Originator) will reestablish the T CP | with TCP RST and the client (as TCP Originator) will reestablish the T CP | |||
connection so that the node will be able to initiate the | connection so that the node will be able to initiate the | |||
INFORMATIONAL exchange informing the client about the cluster | INFORMATIONAL exchange informing the client about the cluster | |||
failover. | failover. | |||
</t> | </t> | |||
<t>This document makes the following recommendation: if support for High | ||||
<t>This document makes the following recommendation: if support for Hi | ||||
gh | ||||
Availability in IKEv2 is negotiated and TCP transport is used, | Availability in IKEv2 is negotiated and TCP transport is used, | |||
a client that is a TCP Originator SHOULD periodically send | a client that is a TCP Originator <bcp14>SHOULD</bcp14> periodi | |||
IKEv2 messages (e.g. by initiating liveness check exchange) whenever | cally send | |||
IKEv2 messages (e.g., by initiating liveness check exchange) whenever | ||||
there is no IKEv2 or ESP traffic. This differs from the | there is no IKEv2 or ESP traffic. This differs from the | |||
recommendations given in Section 2.4 of <xref target="RFC7296"/> in th e following: | recommendations given in <xref target="RFC7296" sectionFormat="of" sec tion="2.4"/> in the following: | |||
the liveness check should be periodically performed even if the | the liveness check should be periodically performed even if the | |||
client has nothing to send over ESP. The frequency of sending such | client has nothing to send over ESP. The frequency of sending such | |||
messages should be high enough to allow quick detection and restoring | messages should be high enough to allow quick detection and restoratio n | |||
of broken TCP connections. | of broken TCP connections. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="frag" numbered="true" toc="default"> | ||||
<section title="IKEv2 Fragmentation" anchor="frag"> | <name>IKEv2 Fragmentation</name> | |||
<t>IKE message fragmentation <xref target="RFC7383"/> is not required | <t>IKE message fragmentation <xref target="RFC7383" format="default"/> i | |||
when using TCP | s not required when using TCP | |||
encapsulation, since a TCP stream already handles the fragmentation | encapsulation since a TCP stream already handles the fragmentation | |||
of its contents across packets. Since fragmentation is redundant in | of its contents across packets. Since fragmentation is redundant in | |||
this case, implementations might choose to not negotiate IKE | this case, implementations might choose to not negotiate IKE | |||
fragmentation. Even if fragmentation is negotiated, an | fragmentation. Even if fragmentation is negotiated, an | |||
implementation SHOULD NOT send fragments when going over a TCP | implementation <bcp14>SHOULD NOT</bcp14> send fragments when going ove | |||
connection, although it MUST support receiving fragments. | r a TCP | |||
</t> | connection, although it <bcp14>MUST</bcp14> support receiving fragment | |||
s. | ||||
<t>If an implementation supports both MOBIKE and IKE fragmentation, it | </t> | |||
SHOULD negotiate IKE fragmentation over a TCP-encapsulated session in | <t>If an implementation supports both MOBIKE and IKE fragmentation, it | |||
<bcp14>SHOULD</bcp14> negotiate IKE fragmentation over a TCP-encapsula | ||||
ted session in | ||||
case the session switches to UDP encapsulation on another network. | case the session switches to UDP encapsulation on another network. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Middlebox Considerations" anchor="middle"> | <section anchor="middle" numbered="true" toc="default"> | |||
<t>Many security networking devices, such as firewalls or intrusion | <name>Middlebox Considerations</name> | |||
<t>Many security networking devices, such as firewalls or intrusion | ||||
prevention systems, network optimization/acceleration devices, and | prevention systems, network optimization/acceleration devices, and | |||
NAT devices, keep the state of sessions that traverse through them. | NAT devices, keep the state of sessions that traverse through them. | |||
</t> | </t> | |||
<t>These devices commonly track the transport-layer and/or application- | ||||
<t>These devices commonly track the transport-layer and/or application- | ||||
layer data to drop traffic that is anomalous or malicious in nature. | layer data to drop traffic that is anomalous or malicious in nature. | |||
While many of these devices will be more likely to pass | While many of these devices will be more likely to pass | |||
TCP-encapsulated traffic as opposed to UDP-encapsulated traffic, some | TCP-encapsulated traffic as opposed to UDP-encapsulated traffic, some | |||
may still block or interfere with TCP-encapsulated IKE and IPsec | may still block or interfere with TCP-encapsulated IKE and IPsec | |||
traffic. | traffic. | |||
</t> | </t> | |||
<t>A network device that monitors the transport layer will track the | ||||
<t>A network device that monitors the transport layer will track the | ||||
state of TCP sessions, such as TCP sequence numbers. If the IKE impleme ntation | state of TCP sessions, such as TCP sequence numbers. If the IKE impleme ntation | |||
has its own minimal implementation of TCP, | has its own minimal implementation of TCP, | |||
it SHOULD still use common TCP behaviors to avoid being dropped by | it <bcp14>SHOULD</bcp14> still use common TCP behaviors to avoid being d ropped by | |||
middleboxes. | middleboxes. | |||
</t> | </t> | |||
<t>Operators that intentionally block IPsec because of security implicatio | ||||
<t>Operators that intentionally block IPsec because of security implicat | ns | |||
ions | ||||
might want to also block TCP port 4500 or use other methods to reject TC P encapsulated IPsec traffic | might want to also block TCP port 4500 or use other methods to reject TC P encapsulated IPsec traffic | |||
(e.g. filter out TCP connections that begin with the "IKETCP" stream pref | (e.g., filter out TCP connections that begin with the "IKETCP" stream pre | |||
ix). | fix). | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="perf" numbered="true" toc="default"> | ||||
<section title="Performance Considerations" anchor="perf"> | <name>Performance Considerations</name> | |||
<t>Several aspects of TCP encapsulation for IKE and IPsec packets may | <t>Several aspects of TCP encapsulation for IKE and IPsec packets may | |||
negatively impact the performance of connections within a tunnel-mode | negatively impact the performance of connections within a tunnel-mode | |||
IPsec SA. Implementations should be aware of these performance | IPsec SA. Implementations should be aware of these performance | |||
impacts and take these into consideration when determining when to | impacts and take these into consideration when determining when to | |||
use TCP encapsulation. Implementations MUST favor using direct ESP | use TCP encapsulation. Implementations <bcp14>MUST</bcp14> favor using direct ESP | |||
or UDP encapsulation over TCP encapsulation whenever possible. | or UDP encapsulation over TCP encapsulation whenever possible. | |||
</t> | </t> | |||
<section anchor="perf.1" numbered="true" toc="default"> | ||||
<section title="TCP-in-TCP" anchor="perf.1"> | <name>TCP-in-TCP</name> | |||
<t>If the outer connection between IKE peers is over TCP, inner TCP | <t>If the outer connection between IKE peers is over TCP, inner TCP | |||
connections may suffer negative effects from using TCP within TCP. | connections may suffer negative effects from using TCP within TCP. | |||
Running TCP within TCP is discouraged, since the TCP algorithms | Running TCP within TCP is discouraged since the TCP algorithms | |||
generally assume that they are running over an unreliable datagram | generally assume that they are running over an unreliable datagram | |||
layer. | layer. | |||
</t> | </t> | |||
<t>If the outer (tunnel) TCP connection experiences packet loss, this | ||||
<t>If the outer (tunnel) TCP connection experiences packet loss, this | loss will be hidden from any inner TCP connections since the outer | |||
loss will be hidden from any inner TCP connections, since the outer | ||||
connection will retransmit to account for the losses. Since the | connection will retransmit to account for the losses. Since the | |||
outer TCP connection will deliver the inner messages in order, any | outer TCP connection will deliver the inner messages in order, any | |||
messages after a lost packet may have to wait until the loss is | messages after a lost packet may have to wait until the loss is | |||
recovered. This means that loss on the outer connection will be | recovered. This means that loss on the outer connection will be | |||
interpreted only as delay by inner connections. The burstiness of | interpreted only as delay by inner connections. The burstiness of | |||
inner traffic can increase, since a large number of inner packets may | inner traffic can increase since a large number of inner packets may | |||
be delivered across the tunnel at once. The inner TCP connection may | be delivered across the tunnel at once. The inner TCP connection may | |||
interpret a long period of delay as a transmission problem, | interpret a long period of delay as a transmission problem, | |||
triggering a retransmission timeout, which will cause spurious | triggering a retransmission timeout, which will cause spurious | |||
retransmissions. The sending rate of the inner connection may be | retransmissions. The sending rate of the inner connection may be | |||
unnecessarily reduced if the retransmissions are not detected as | unnecessarily reduced if the retransmissions are not detected as | |||
spurious in time. | spurious in time. | |||
</t> | </t> | |||
<t>The inner TCP connection's round-trip-time estimation will be | ||||
<t>The inner TCP connection's round-trip-time estimation will be | ||||
affected by the burstiness of the outer TCP connection if there are | affected by the burstiness of the outer TCP connection if there are | |||
long delays when packets are retransmitted by the outer TCP | long delays when packets are retransmitted by the outer TCP | |||
connection. This will make the congestion control loop of the inner | connection. This will make the congestion control loop of the inner | |||
TCP traffic less reactive, potentially permanently leading to a lower | TCP traffic less reactive, potentially permanently leading to a lower | |||
sending rate than the outer TCP would allow for. | sending rate than the outer TCP would allow for. | |||
</t> | </t> | |||
<t> TCP-in-TCP can also lead to "TCP meltdown", where stacked instances | ||||
<t> TCP-in-TCP can also lead to "TCP meltdown", where stacked instance | ||||
s | ||||
of TCP can result in significant impacts to performance | of TCP can result in significant impacts to performance | |||
<xref target="TCP-MELTDOWN" />. This can occur when losses in the lowe r TCP (closer to the link) | <xref target="TCP-MELTDOWN" format="default"/>. This can occur when lo sses in the lower TCP (closer to the link) | |||
increase delays seen by the higher TCP (closer to the application) tha t create | increase delays seen by the higher TCP (closer to the application) tha t create | |||
timeouts, which in turn cause retransmissions that can then cause loss es in | timeouts, which, in turn, cause retransmissions that can then cause lo sses in | |||
the lower TCP by overrunning its buffer. The very mechanism intended t o avoid loss | the lower TCP by overrunning its buffer. The very mechanism intended t o avoid loss | |||
(retransmission) interacts between the two layers to increase loss. To limit this effect, | (retransmission) interacts between the two layers to increase loss. To limit this effect, | |||
the timeouts of the two TCP layers need to be carefully managed, e.g., such that | the timeouts of the two TCP layers need to be carefully managed, e.g., such that | |||
the higher layer has a much longer timeout than the lower layer. | the higher layer has a much longer timeout than the lower layer. | |||
</t> | </t> | |||
<t>Note that any negative effects will be shared among all flows going | ||||
<t>Note that any negative effects will be shared among all flows going | ||||
through the outer TCP connection. This is of particular concern for | through the outer TCP connection. This is of particular concern for | |||
any latency-sensitive or real-time applications using the tunnel. If | any latency-sensitive or real-time applications using the tunnel. If | |||
such traffic is using a TCP-encapsulated IPsec connection, it is | such traffic is using a TCP-encapsulated IPsec connection, it is | |||
recommended that the number of inner connections sharing the tunnel | recommended that the number of inner connections sharing the tunnel | |||
be limited as much as possible. | be limited as much as possible. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="perf.2" numbered="true" toc="default"> | ||||
<section title="Added Reliability for Unreliable Protocols" anchor="perf | <name>Added Reliability for Unreliable Protocols</name> | |||
.2"> | <t>Since ESP is an unreliable protocol, transmitting ESP packets over a | |||
<t>Since ESP is an unreliable protocol, transmitting ESP packets over | ||||
a | ||||
TCP connection will change the fundamental behavior of the packets. | TCP connection will change the fundamental behavior of the packets. | |||
Some application-level protocols that prefer packet loss to delay | Some application-level protocols that prefer packet loss to delay | |||
(such as Voice over IP or other real-time protocols) may be | (such as Voice over IP or other real-time protocols) may be | |||
negatively impacted if their packets are retransmitted by the TCP | negatively impacted if their packets are retransmitted by the TCP | |||
connection due to packet loss. | connection due to packet loss. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="perf.3" numbered="true" toc="default"> | ||||
<section title="Quality-of-Service Markings" anchor="perf.3"> | <name>Quality-of-Service Markings</name> | |||
<t>Quality-of-Service (QoS) markings, such as the Differentiated | <t>Quality-of-Service (QoS) markings, such as the Differentiated | |||
Services Code Point (DSCP) and Traffic Class, should be used with | Services Code Point (DSCP) and Traffic Class, should be used with | |||
care on TCP connections used for encapsulation. Individual packets | care on TCP connections used for encapsulation. Individual packets | |||
SHOULD NOT use different markings than the rest of the connection, | <bcp14>SHOULD NOT</bcp14> use different markings than the rest of the connection | |||
since packets with different priorities may be routed differently and | since packets with different priorities may be routed differently and | |||
cause unnecessary delays in the connection. | cause unnecessary delays in the connection. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="perf.4" numbered="true" toc="default"> | ||||
<section title="Maximum Segment Size" anchor="perf.4"> | <name>Maximum Segment Size</name> | |||
<t>A TCP connection used for IKE encapsulation SHOULD negotiate its MS | <t>A TCP connection used for IKE encapsulation <bcp14>SHOULD</bcp14> neg | |||
S | otiate its MSS | |||
in order to avoid unnecessary fragmentation of packets. | in order to avoid unnecessary fragmentation of packets. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="perf.5" numbered="true" toc="default"> | ||||
<name>Tunneling ECN in TCP</name> | ||||
<section title="Tunneling ECN in TCP" anchor="perf.5"> | <t>Since there is not a one-to-one relationship between outer IP packets | |||
<t>Since there is not a one-to-one relationship between outer IP packe | ||||
ts | ||||
and inner ESP/IP messages when using TCP encapsulation, the markings | and inner ESP/IP messages when using TCP encapsulation, the markings | |||
for Explicit Congestion Notification (ECN) <xref target="RFC3168"/> ca nnot be simply | for Explicit Congestion Notification (ECN) <xref target="RFC3168" form at="default"/> cannot easily be | |||
mapped. However, any ECN Congestion Experienced (CE) marking on | mapped. However, any ECN Congestion Experienced (CE) marking on | |||
inner headers should be preserved through the tunnel. | inner headers should be preserved through the tunnel. | |||
</t> | </t> | |||
<t>Implementations <bcp14>SHOULD</bcp14> follow the ECN compatibility mo | ||||
<t>Implementations SHOULD follow the ECN compatibility mode for tunnel | de for tunnel | |||
ingress as described in <xref target="RFC6040"/>. In compatibility mo | ingress as described in <xref target="RFC6040" format="default"/>. In | |||
de, the outer | compatibility mode, the outer | |||
tunnel TCP connection marks its packet headers as not ECN-capable. | tunnel TCP connection marks its packet headers as not ECN-capable. | |||
</t> | </t> | |||
<t>Upon egress, if the arriving outer header is marked with CE, the | ||||
<t>If upon egress, the arriving outer header is marked with CE, the | implementation will drop the inner packet since there is not a | |||
implementation will drop the inner packet, since there is not a | ||||
distinct inner packet header onto which to translate the ECN | distinct inner packet header onto which to translate the ECN | |||
markings. | markings. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Security Considerations" anchor="security"> | <section anchor="security" numbered="true" toc="default"> | |||
<t>IKE Responders that support TCP encapsulation may become vulnerable | <name>Security Considerations</name> | |||
<t>IKE Responders that support TCP encapsulation may become vulnerable | ||||
to new Denial-of-Service (DoS) attacks that are specific to TCP, such | to new Denial-of-Service (DoS) attacks that are specific to TCP, such | |||
as SYN-flooding attacks. TCP Responders should be aware of this addition al attack surface. | as SYN-flooding attacks. TCP Responders should be aware of this addition al attack surface. | |||
</t> | </t> | |||
<t>TCP connections are also susceptible to RST and other spoofing attacks | ||||
<t>TCP connections are also susceptible to RST and other spoofing attack | <xref target="RFC4953" format="default"/>. | |||
s <xref target="RFC4953" />. | ||||
This specification makes IPsec tolerant of sudden TCP connection drops, but if an attacker | This specification makes IPsec tolerant of sudden TCP connection drops, but if an attacker | |||
is able to tear down TCP connections, IPsec connection's performance can suffer, | is able to tear down TCP connections, IPsec connection's performance can suffer, | |||
effectively making this a DoS attack. | effectively making this a DoS attack. | |||
</t> | </t> | |||
<t>TCP data injection attacks have no effect on application data since IPs | ||||
<t>TCP data injection attacks have no effect on application data since I | ec provides data integrity. | |||
Psec provides data integrity. | ||||
However, they can have some effect, mostly by creating DoS attacks: | However, they can have some effect, mostly by creating DoS attacks: | |||
<list style="symbols"> | </t> | |||
<t>if an attacker alters the content of the Length field that separate | <ul spacing="normal"> | |||
s packets, | <li>If an attacker alters the content of the Length field that separates | |||
then the receiver will incorrectly identify the boundaries of the foll | packets, | |||
owing packets and | then the Receiver will incorrectly identify the boundaries of the foll | |||
owing packets and | ||||
will drop all of them or even tear down the TCP connection if the cont ent of the | will drop all of them or even tear down the TCP connection if the cont ent of the | |||
Length field happens to be 0 or 1 (see <xref target="format"/>) | Length field happens to be 0 or 1 (see <xref target="format" format="d | |||
</t> | efault"/>). | |||
<t>if the content of an IKE message is altered, then it will be droppe | </li> | |||
d by the receiver; | <li>If the content of an IKE message is altered, then it will be dropped | |||
if the dropped message is the IKE request message, then the initiator | by the receiver; | |||
will tear | if the dropped message is the IKE request message, then the Initiator | |||
down the IKE SA after some timeout, since in most cases the request me | will tear | |||
ssage will not be retransmitted | down the IKE SA after some timeout since, in most cases, the request m | |||
(as advised in <xref target="retr"/>) and thus the response will never | essage will not be retransmitted | |||
be received | (as advised in <xref target="retr" format="default"/>); thus, the resp | |||
</t> | onse will never be received. | |||
<t>if an attacker alters the non-ESP marker then IKE packets will be d | </li> | |||
ispatched to ESP | ||||
and sometimes visa versa, those packets will be dropped | ||||
</t> | ||||
<t>if an attacker modifies TCP-Encapsulated stream prefix or unencrypt | ||||
ed IKE messages before IKE SA is established, | ||||
then in most cases this will result in failure to establish IKE SA, of | ||||
ten with false "authentication failed" diagnostics | ||||
</t> | ||||
</list> | ||||
<xref target="RFC5961" /> discusses how TCP injection attacks can be mit | ||||
igated. | ||||
</t> | ||||
<t>Note that data injection attacks are also possible on IP level (e.g. | <li>If an attacker alters the non-ESP marker, then IKE packets will be d | |||
when IP fragmentation is used), | ispatched to ESP | |||
(and sometimes visa versa) and those packets will be dropped. | ||||
</li> | ||||
<li>If an attacker modifies TCP-Encapsulated stream prefix or unencrypte | ||||
d IKE messages before IKE SA is established, | ||||
then in most cases this will result in failure to establish IKE SA, of | ||||
ten with false "authentication failed" diagnostics. | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
<xref target="RFC5961" format="default"/> discusses how TCP injection at | ||||
tacks can be mitigated. | ||||
</t> | ||||
<t>Note that data injection attacks are also possible on IP level (e.g., w | ||||
hen IP fragmentation is used), | ||||
resulting in DoS attacks even if TCP encapsulation is not used. On the o ther hand, TCP injection attacks are easier to mount | resulting in DoS attacks even if TCP encapsulation is not used. On the o ther hand, TCP injection attacks are easier to mount | |||
than the IP fragmentation injection attacks, because TCP keeps a long re | than the IP fragmentation injection attacks because TCP keeps a long rec | |||
ceive window open that’s a sitting target for such attacks. | eive window open that's a sitting target for such attacks. | |||
</t> | </t> | |||
<t>If an attacker successfully mounts an injection attack on a TCP connect | ||||
<t>If an attacker successfully mounts an injection attack on a TCP conne | ion used for encapsulating IPsec traffic | |||
ction used for encapsulating IPsec traffic | ||||
and modifies a Length field, the receiver might not be able to correctly identify the boundaries of the following packets in the stream | and modifies a Length field, the receiver might not be able to correctly identify the boundaries of the following packets in the stream | |||
since it will try to parse arbitrary data as an ESP or IKE header. | since it will try to parse arbitrary data as an ESP or IKE header. | |||
After such a parsing failure, all following packets will be dropped. Com munication will eventually recover, but this might | After such a parsing failure, all following packets will be dropped. Com munication will eventually recover, but this might | |||
take several minutes and can result in IKE SA deletion and re-creation. | take several minutes and can result in IKE SA deletion and re-creation. | |||
</t> | </t> | |||
<t>To speed up the recovery from such attacks, implementations are advised | ||||
<t>To speed up the recovery from such attacks, implementations are advis | to follow recommendations in <xref target="establish" format="default"/> and cl | |||
ed to follow recommendations in <xref target="establish" /> and close | ose | |||
the TCP connection if incoming packets contain SPIs that don't match any known SAs. | the TCP connection if incoming packets contain SPIs that don't match any known SAs. | |||
Once the TCP connection is closed it will be re-created by the TCP Origi | Once the TCP connection is closed, it will be re-created by the TCP Orig | |||
nator as described in <xref target="establish" />. | inator as described in <xref target="establish" format="default"/>. | |||
</t> | </t> | |||
<t>To avoid performance degradation caused by closing and re-creating TCP | ||||
<t>To avoid performance degradation caused by closing and re-creating TC | connections, | |||
P connection, | implementations <bcp14>MAY</bcp14> alternatively try to resync after they | |||
implementations MAY alternatively try to re-sync after they receive unkno | receive unknown SPIs by searching the TCP stream | |||
wn SPIs by searching the TCP stream | ||||
for a 64-bit binary vector consisting of a known SPI in the first 32 bit s and a valid Sequence Number for this SPI in the | for a 64-bit binary vector consisting of a known SPI in the first 32 bit s and a valid Sequence Number for this SPI in the | |||
second 32 bits, and then validate the ICV of this packet candidate by ta | second 32 bits. Then, they can validate the Integrity Check Value (ICV) | |||
king the preceding 16 bits as the Length field. | of this packet candidate by taking the preceding 16 bits as the Length field. | |||
They can also search for 4 bytes of zero (non-ESP marker) followed by 12 | ||||
8 bits of IKE SPIs of IKE SA associated with this TCP connection | ||||
and then validate ICV of this IKE message candidate by taking the 16 bit | ||||
s preceding the non-ESP marker as the Length field. | ||||
Implementations SHOULD limit the attempts to resync, since if the inject | ||||
ion attack is ongoing | ||||
then there is a high probability that the resync process will not succee | ||||
d, or quickly | ||||
come under attack again. | ||||
</t> | ||||
<t>An attacker capable of blocking UDP traffic can force peers to use TC | They can also search for 4 bytes of zero (non-ESP marker) followed by | |||
P encapsulation, | 128 bits of IKE SPIs of the IKE SA(s) associated with this TCP connection and | |||
thus degrading the performance and making the connection more vulnerable | then validate the ICV of this IKE message candidate by taking the 16 bits | |||
to DoS attacks. | preceding the non-ESP marker as the Length field. | |||
Note that an attacker able to modify packets on the wire or to block the | ||||
m can | ||||
prevent peers to communicate regardless of the transport being used. | ||||
</t> | ||||
<t>TCP Responders should be careful to ensure that the stream prefix | Implementations <bcp14>SHOULD</bcp14> limit the attempts to resync, becau | |||
se if the | ||||
injection attack is ongoing, then there is a high probability that | ||||
the resync process will not succeed or will quickly come under attack | ||||
again. | ||||
</t> | ||||
<t>An attacker capable of blocking UDP traffic can force peers to use TCP | ||||
encapsulation, | ||||
thus, degrading the performance and making the connection more vulnerabl | ||||
e to DoS attacks. | ||||
Note that an attacker that is able to modify packets on the wire or to b | ||||
lock them can | ||||
prevent peers from communicating regardless of the transport being used. | ||||
</t> | ||||
<t>TCP Responders should be careful to ensure that the stream prefix | ||||
"IKETCP" uniquely identifies incoming streams as streams that use the | "IKETCP" uniquely identifies incoming streams as streams that use the | |||
TCP encapsulation protocol. | TCP encapsulation protocol. | |||
</t> | </t> | |||
<t>Attackers may be able to disrupt the TCP connection by sending | ||||
<t>Attackers may be able to disrupt the TCP connection by sending | spurious TCP Reset packets. Therefore, implementations <bcp14>SHOULD</b | |||
spurious TCP Reset packets. Therefore, implementations SHOULD make | cp14> make | |||
sure that IKE session state persists even if the underlying TCP | sure that IKE session state persists even if the underlying TCP | |||
connection is torn down. | connection is torn down. | |||
</t> | </t> | |||
<t>If MOBIKE is being used, all of the security considerations outlined | ||||
<t>If MOBIKE is being used, all of the security considerations outlined | for MOBIKE apply <xref target="RFC4555" format="default"/>. | |||
for MOBIKE apply <xref target="RFC4555"/>. | </t> | |||
</t> | <t>Similar to MOBIKE, TCP encapsulation requires a TCP Responder to | |||
<t>Similarly to MOBIKE, TCP encapsulation requires a TCP Responder to | ||||
handle changes to source address and port due to network or | handle changes to source address and port due to network or | |||
connection disruption. The successful delivery of valid new IKE or ESP | connection disruption. The successful delivery of valid new IKE or ESP | |||
messages over a new TCP connection is used by the TCP Responder to | messages over a new TCP connection is used by the TCP Responder to | |||
determine where to send subsequent responses. If an attacker is able | determine where to send subsequent responses. If an attacker is able | |||
to send packets on a new TCP connection that pass the validation | to send packets on a new TCP connection that pass the validation | |||
checks of the TCP Responder, it can influence which path future | checks of the TCP Responder, it can influence which path future | |||
packets will take. For this reason, the validation of messages on | packets will take. For this reason, the validation of messages on | |||
the TCP Responder must include decryption, authentication, and replay | the TCP Responder must include decryption, authentication, and replay | |||
checks. | checks. | |||
</t> | </t> | |||
</section> | ||||
<section anchor="iana" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<t>TCP port 4500 is already allocated to IPsec for NAT traversal in the "S | ||||
ervice Name and Transport Protocol Port Number Registry". This | ||||
port <bcp14>SHOULD</bcp14> be used for TCP-encapsulated IKE and ESP as d | ||||
escribed in | ||||
this document. | ||||
</t> | ||||
<t>This document updates the reference for TCP port 4500 from RFC 8229 to | ||||
itself: | ||||
</t> | ||||
</section> | <dl newline="false" spacing="compact"> | |||
<dt>Service Name:</dt> | ||||
<dd>ipsec-nat-t</dd> | ||||
<dt>Port Number / Transport Protocol:</dt> | ||||
<dd>4500/tcp</dd> | ||||
<dt>Description:</dt> | ||||
<dd>IPsec NAT-Traversal</dd> | ||||
<dt>Reference:</dt> | ||||
<dd>RFC 9329</dd> | ||||
</dl> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<section title="IANA Considerations" anchor="iana"> | <displayreference target="I-D.ietf-ipsecme-ike-tcp" to="IPSECME-IKE-TCP"/> | |||
<t>TCP port 4500 is already allocated to IPsec for NAT traversal. This | ||||
port SHOULD be used for TCP-encapsulated IKE and ESP as described in | ||||
this document. | ||||
</t> | ||||
<t>This document updates the reference for TCP port 4500 from RFC 8229 t | <references> | |||
o itself: | <name>References</name> | |||
</t> | <references> | |||
<name>Normative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
119.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
948.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
301.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
303.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
040.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
296.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
019.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
174.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<figure><artwork><![CDATA[ | <!-- [I-D.ietf-ipsecme-ike-tcp]; IESG state Expired as of 10/3/22 --> | |||
Keyword Decimal Description Reference | ||||
----------- -------- ------------------- --------- | ||||
ipsec-nat-t 4500/tcp IPsec NAT-Traversal [RFCXXXX] | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | ||||
</middle> | ||||
<back> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D | |||
<references title='Normative References'> | .ietf-ipsecme-ike-tcp.xml"/> | |||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.2119.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.3948.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.4301.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.4303.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.6040.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.7296.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.8019.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.8174.xml" ?> | ||||
</references> | ||||
<references title='Informative References'> | <!-- [I-D.ietf-uta-rfc7525bis]; In AUTH48-DONE as of 11/28/22 --> | |||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference | ||||
.I-D.ietf-ipsecme-ike-tcp.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference | ||||
.I-D.ietf-uta-rfc7525bis.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.1122.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.2817.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.3168.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.4555.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.4621.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.4953.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.4987.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.5246.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.5685.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.5723.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.5961.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.6311.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.6520.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.6528.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.7383.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.8229.xml" ?> | ||||
<?rfc include="https://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
RFC.8446.xml" ?> | ||||
<reference anchor="TCP-MELTDOWN" target="https://doi.org/10.1117/12. | ||||
630496"> | ||||
<front> | ||||
<title>Understanding TCP over TCP: effects of TCP tunneling | ||||
on end-to-end throughput and latency</title> | ||||
<author fullname="Osamu Honda" /> | ||||
<author fullname="Hiroyuki Ohsaki" /> | ||||
<author fullname="Makoto Imase" /> | ||||
<author fullname="Mika Ishizuka" /> | ||||
<author fullname="Junichi Murayama" /> | ||||
<date year="2005"/> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
<section title="Using TCP Encapsulation with TLS" anchor="tls"> | <reference anchor="RFC9325" target="https://www.rfc-editor.org/info/rfc9325"> | |||
<t>This section provides recommendations on how to use TLS in addition | <front> | |||
to TCP encapsulation. | <title>Recommendations for Secure Use of Transport Layer Security (TLS) an | |||
</t> | d Datagram Transport Layer Security (DTLS)</title> | |||
<author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"> | ||||
<organization>Intuit</organization> | ||||
</author> | ||||
<author initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre"> | ||||
<organization>independent</organization> | ||||
</author> | ||||
<author initials="T." surname="Fossati" fullname="Thomas Fossati"> | ||||
<organization>arm</organization> | ||||
</author> | ||||
<date month="November" year="2022" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9325" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9325"/> | ||||
</reference> | ||||
<t>When using TCP encapsulation, implementations may choose to use TLS | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1 | |||
1.2 | 122.xml"/> | |||
<xref target="RFC5246"/> or TLS 1.3 <xref target="RFC8446"/> on the TC | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
P connection | 817.xml"/> | |||
to be able to traverse middleboxes, which may otherwise block the traf | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
fic. | 168.xml"/> | |||
</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
555.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
621.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
953.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
987.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
246.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
685.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
723.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
961.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
311.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
520.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
528.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | ||||
293.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
383.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
229.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
446.xml"/> | ||||
<t>If a web proxy is applied to the ports used for the TCP connection | <reference anchor="TCP-MELTDOWN" target="https://doi.org/10.1117/12.6304 | |||
96"> | ||||
<front> | ||||
<title>Understanding TCP over TCP: effects of TCP tunneling on end-t | ||||
o-end throughput and latency</title> | ||||
<author fullname="Osamu Honda"/> | ||||
<author fullname="Hiroyuki Ohsaki"/> | ||||
<author fullname="Makoto Imase"/> | ||||
<author fullname="Mika Ishizuka"/> | ||||
<author fullname="Junichi Murayama"/> | ||||
<date month="October" year="2005"/> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
</references> | ||||
<section anchor="tls" numbered="true" toc="default"> | ||||
<name>Using TCP Encapsulation with TLS</name> | ||||
<t>This section provides recommendations on how to use TLS in addition | ||||
to TCP encapsulation. | ||||
</t> | ||||
<t>When using TCP encapsulation, implementations may choose to use TLS 1.2 | ||||
<xref target="RFC5246" format="default"/> or TLS 1.3 <xref target="RFC | ||||
8446" format="default"/> on the TCP connection | ||||
to be able to traverse middleboxes, which may otherwise block the traf | ||||
fic. | ||||
</t> | ||||
<t>If a web proxy is applied to the ports used for the TCP connection | ||||
and TLS is being used, the TCP Originator can send an HTTP CONNECT | and TLS is being used, the TCP Originator can send an HTTP CONNECT | |||
message to establish an SA through the proxy <xref target="RFC2817"/>. | message to establish an SA through the proxy <xref target="RFC2817" fo | |||
</t> | rmat="default"/>. | |||
</t> | ||||
<t>The use of TLS should be configurable on the peers, and may be used | <t>The use of TLS should be configurable on the peers and may be used | |||
as the default when using TCP encapsulation or may be used as a | as the default when using TCP encapsulation or may be used as a | |||
fallback when basic TCP encapsulation fails. The TCP Responder may | fallback when basic TCP encapsulation fails. The TCP Responder may | |||
expect to read encapsulated IKE and ESP packets directly from the TCP | expect to read encapsulated IKE and ESP packets directly from the TCP | |||
connection, or it may expect to read them from a stream of TLS data | connection, or it may expect to read them from a stream of TLS data | |||
packets. The TCP Originator should be pre-configured to use TLS | packets. The TCP Originator should be preconfigured regarding whether | |||
or not when communicating with a given port on the TCP Responder. | or not to use TLS | |||
</t> | when communicating with a given port on the TCP Responder. | |||
</t> | ||||
<t>When new TCP connections are re-established due to a broken | <t>When new TCP connections are re-established due to a broken | |||
connection, TLS must be renegotiated. TLS session resumption is | connection, TLS must be renegotiated. TLS session resumption is | |||
recommended to improve efficiency in this case. | recommended to improve efficiency in this case. | |||
</t> | </t> | |||
<t>The security of the IKE session is entirely derived from the IKE | ||||
<t>The security of the IKE session is entirely derived from the IKE | negotiation and key establishment and not from the TLS session (which, | |||
negotiation and key establishment and not from the TLS session (which | in this context, is only used for encapsulation purposes); therefore, | |||
in this context is only used for encapsulation purposes); therefore, | ||||
when TLS is used on the TCP connection, both the TCP Originator and | when TLS is used on the TCP connection, both the TCP Originator and | |||
the TCP Responder SHOULD allow the NULL cipher to be selected for | the TCP Responder <bcp14>SHOULD</bcp14> allow the NULL cipher to be se | |||
performance reasons. Note, that TLS 1.3 only supports AEAD algorithms | lected for | |||
performance reasons. Note that TLS 1.3 only supports AEAD algorithms | ||||
and at the time of writing this document there was no recommended ciph er suite | and at the time of writing this document there was no recommended ciph er suite | |||
for TLS 1.3 with the NULL cipher. It is RECOMMENDED to follow | for TLS 1.3 with the NULL cipher. It is <bcp14>RECOMMENDED</bcp14> to | |||
<xref target="I-D.ietf-uta-rfc7525bis" /> when selecting parameters fo | follow | |||
r TLS. | <xref target="RFC9325" format="default"/> when selecting parameters fo | |||
</t> | r TLS. | |||
</t> | ||||
<t>Implementations should be aware that the use of TLS introduces | <t>Implementations should be aware that the use of TLS introduces | |||
another layer of overhead requiring more bytes to transmit a given | another layer of overhead requiring more bytes to transmit a given | |||
IKE and IPsec packet. For this reason, direct ESP, UDP | IKE and IPsec packet. For this reason, direct ESP, UDP | |||
encapsulation, or TCP encapsulation without TLS should be preferred | encapsulation, or TCP encapsulation without TLS should be preferred | |||
in situations in which TLS is not required in order to traverse | in situations in which TLS is not required in order to traverse | |||
middleboxes. | middleboxes. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="tls-example" numbered="true" toc="default"> | ||||
<section title="Example Exchanges of TCP Encapsulation with TLS 1.3" anc | <name>Example Exchanges of TCP Encapsulation with TLS 1.3</name> | |||
hor="tls-example"> | <t>This appendix contains examples of data flows in cases where TCP encaps | |||
<section title="Establishing an IKE Session" anchor="tls-example-1"> | ulation of IKE and IPsec packets | |||
<figure><artwork><![CDATA[ | is used with TLS 1.3. The examples below are provided for illustrative pu | |||
rpose only; | ||||
readers should refer to the main body of the document for details.</t> | ||||
<section anchor="tls-example-1" numbered="true" toc="default"> | ||||
<name>Establishing an IKE Session</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
Client Server | Client Server | |||
---------- ---------- | ---------- ---------- | |||
1) -------------------- TCP Connection ------------------- | 1) -------------------- TCP Connection ------------------- | |||
(IP_I:Port_I -> IP_R:Port_R) | (IP_I:Port_I -> IP_R:Port_R) | |||
TcpSyn -------> | TcpSyn -------> | |||
<------- TcpSyn,Ack | <------- TcpSyn,Ack | |||
TcpAck -------> | TcpAck -------> | |||
2) --------------------- TLS Session --------------------- | 2) --------------------- TLS Session --------------------- | |||
ClientHello -------> | ClientHello -------> | |||
ServerHello | ServerHello | |||
skipping to change at line 1342 ¶ | skipping to change at line 1297 ¶ | |||
IKE_AUTH (repeat 1..N times) | IKE_AUTH (repeat 1..N times) | |||
HDR SK {EAP} | HDR SK {EAP} | |||
Length + Non-ESP Marker -------> | Length + Non-ESP Marker -------> | |||
final IKE_AUTH | final IKE_AUTH | |||
HDR, SK {AUTH} | HDR, SK {AUTH} | |||
<------- Length + Non-ESP Marker | <------- Length + Non-ESP Marker | |||
final IKE_AUTH | final IKE_AUTH | |||
HDR, SK {AUTH, CP(CFG_REPLY), | HDR, SK {AUTH, CP(CFG_REPLY), | |||
SA, TSi, TSr, ...} | SA, TSi, TSr, ...} | |||
-------------- IKE and IPsec SAs Established ------------ | -------------- IKE and IPsec SAs Established ------------ | |||
Length + ESP Frame -------> | Length + ESP Frame ------->]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t><list style="numbers"> | <ol spacing="normal" type="1"><li>The client establishes a TCP connection | |||
<t>The client establishes a TCP connection with the server on | with the server on | |||
port 4500 or on an alternate pre-configured port that the server | port 4500 or on an alternate preconfigured port that the server | |||
is listening on. | is listening on. | |||
</t> | </li> | |||
<li>If configured to use TLS, the client initiates a TLS handshake. | ||||
<t>If configured to use TLS, the client initiates a TLS handshake. | During the TLS handshake, the server <bcp14>SHOULD NOT</bcp14> req | |||
During the TLS handshake, the server SHOULD NOT request the | uest the | |||
client's certificate, since authentication is handled as part of | client's certificate since authentication is handled as part of | |||
IKE negotiation.</t> | IKE negotiation.</li> | |||
<li>The client sends the stream prefix for TCP-encapsulated IKE | ||||
<t>The client sends the stream prefix for TCP-encapsulated IKE | (<xref target="prefix" format="default"/>) traffic to signal the b | |||
(<xref target="prefix"/>) traffic to signal the beginning of IKE n | eginning of IKE negotiation.</li> | |||
egotiation.</t> | <li>The client and server establish an IKE connection. This example | |||
<t>The client and server establish an IKE connection. This exampl | ||||
e | ||||
shows EAP-based authentication, although any authentication type | shows EAP-based authentication, although any authentication type | |||
may be used.</t> | may be used.</li> | |||
</list> | </ol> | |||
</t> | </section> | |||
</section> | <section anchor="tls-example-2" numbered="true" toc="default"> | |||
<name>Deleting an IKE Session</name> | ||||
<section title="Deleting an IKE Session" anchor="tls-example-2"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<figure><artwork><![CDATA[ | ||||
Client Server | Client Server | |||
---------- ---------- | ---------- ---------- | |||
1) ----------------------- IKE Session --------------------- | 1) ----------------------- IKE Session --------------------- | |||
Length + Non-ESP Marker -------> | Length + Non-ESP Marker -------> | |||
INFORMATIONAL | INFORMATIONAL | |||
HDR, SK {[N,] [D,] | HDR, SK {[N,] [D,] | |||
[CP,] ...} | [CP,] ...} | |||
<------- Length + Non-ESP Marker | <------- Length + Non-ESP Marker | |||
INFORMATIONAL | INFORMATIONAL | |||
HDR, SK {[N,] [D,] | HDR, SK {[N,] [D,] | |||
[CP], ...} | [CP], ...} | |||
2) --------------------- TLS Session --------------------- | 2) --------------------- TLS Session --------------------- | |||
close_notify -------> | close_notify -------> | |||
<------- close_notify | <------- close_notify | |||
3) -------------------- TCP Connection ------------------- | 3) -------------------- TCP Connection ------------------- | |||
TcpFin -------> | TcpFin -------> | |||
<------- Ack | <------- Ack | |||
<------- TcpFin | <------- TcpFin | |||
Ack -------> | Ack -------> | |||
-------------------- IKE SA Deleted ------------------- | -------------------- IKE SA Deleted -------------------]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t><list style="numbers"> | ||||
<t>The client and server exchange informational messages to notify | ||||
IKE SA deletion.</t> | ||||
<t>The client and server negotiate TLS session deletion using TLS | ||||
CLOSE_NOTIFY.</t> | ||||
<t>The TCP connection is torn down.</t> | ||||
</list> | ||||
</t> | ||||
<t>The deletion of the IKE SA should lead to the disposal of the | <ol spacing="normal" type="1"><li>The client and server exchange informa | |||
tional messages to notify | ||||
IKE SA deletion.</li> | ||||
<li>The client and server negotiate TLS session deletion using TLS | ||||
CLOSE_NOTIFY.</li> | ||||
<li>The TCP connection is torn down.</li> | ||||
</ol> | ||||
<t>The deletion of the IKE SA should lead to the disposal of the | ||||
underlying TLS and TCP state.</t> | underlying TLS and TCP state.</t> | |||
</section> | </section> | |||
<section anchor="tls-example-3" numbered="true" toc="default"> | ||||
<name>Re-establishing an IKE Session</name> | ||||
<section title="Re-establishing an IKE Session" anchor="tls-example-3" | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
> | ||||
<figure><artwork><![CDATA[ | ||||
Client Server | Client Server | |||
---------- ---------- | ---------- ---------- | |||
1) -------------------- TCP Connection ------------------- | 1) -------------------- TCP Connection ------------------- | |||
(IP_I:Port_I -> IP_R:Port_R) | (IP_I:Port_I -> IP_R:Port_R) | |||
TcpSyn -------> | TcpSyn -------> | |||
<------- TcpSyn,Ack | <------- TcpSyn,Ack | |||
TcpAck -------> | TcpAck -------> | |||
2) --------------------- TLS Session --------------------- | 2) --------------------- TLS Session --------------------- | |||
ClientHello -------> | ClientHello -------> | |||
ServerHello | ServerHello | |||
{EncryptedExtensions} | {EncryptedExtensions} | |||
<------- {Finished} | <------- {Finished} | |||
{Finished} -------> | {Finished} -------> | |||
3) ---------------------- Stream Prefix -------------------- | 3) ---------------------- Stream Prefix -------------------- | |||
"IKETCP" -------> | "IKETCP" -------> | |||
4) <---------------------> IKE/ESP Flow <------------------> | 4) <---------------------> IKE/ESP Flow <------------------>]]></artwork> | |||
]]></artwork> | ||||
</figure> | <ol spacing="normal" type="1"><li>If a previous TCP connection was broke | |||
<t><list style="numbers"> | n (for example, due to a | |||
<t>If a previous TCP connection was broken (for example, due to a | ||||
TCP Reset), the client is responsible for re-initiating the TCP | TCP Reset), the client is responsible for re-initiating the TCP | |||
connection. The TCP Originator's address and port (IP_I and | connection. The TCP Originator's address and port (IP_I and | |||
Port_I) may be different from the previous connection's address | Port_I) may be different from the previous connection's address | |||
and port. | and port. | |||
</t> | </li> | |||
<li>The client <bcp14>SHOULD</bcp14> attempt TLS session resumption if | ||||
<t>The client SHOULD attempt TLS session resumption if it | it | |||
has previously established a session with the server. | has previously established a session with the server. | |||
</t> | </li> | |||
<li>After TCP and TLS are complete, the client sends the stream | ||||
<t>After TCP and TLS are complete, the client sends the stream | prefix for TCP-encapsulated IKE traffic (<xref target="prefix" for | |||
prefix for TCP-encapsulated IKE traffic (<xref target="prefix"/>). | mat="default"/>). | |||
</t> | </li> | |||
<li>The IKE and ESP packet flow can resume. If MOBIKE is being used, | ||||
<t>The IKE and ESP packet flow can resume. If MOBIKE is being use | the Initiator <bcp14>SHOULD</bcp14> send an UPDATE_SA_ADDRESSES me | |||
d, | ssage. | |||
the Initiator SHOULD send an UPDATE_SA_ADDRESSES message. | </li> | |||
</t> | </ol> | |||
</section> | ||||
</list> | <section anchor="tls-example-4" numbered="true" toc="default"> | |||
</t> | <name>Using MOBIKE between UDP and TCP Encapsulation</name> | |||
</section> | ||||
<section title="Using MOBIKE between UDP and TCP Encapsulation" anchor | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
="tls-example-4"> | ||||
<figure><artwork><![CDATA[ | ||||
Client Server | Client Server | |||
---------- ---------- | ---------- ---------- | |||
1) --------------------- IKE_session ---------------------- | 1) --------------------- IKE_session ---------------------- | |||
(IP_I1:UDP500 -> IP_R:UDP500) | (IP_I1:UDP500 -> IP_R:UDP500) | |||
IKE_SA_INIT -------> | IKE_SA_INIT -------> | |||
HDR, SAi1, KEi, Ni, | HDR, SAi1, KEi, Ni, | |||
[N(NAT_DETECTION_SOURCE_IP)], | [N(NAT_DETECTION_SOURCE_IP)], | |||
[N(NAT_DETECTION_DESTINATION_IP)] | [N(NAT_DETECTION_DESTINATION_IP)] | |||
<------- IKE_SA_INIT | <------- IKE_SA_INIT | |||
HDR, SAr1, KEr, Nr, | HDR, SAr1, KEr, Nr, | |||
skipping to change at line 1498 ¶ | skipping to change at line 1435 ¶ | |||
TcpAck -------> | TcpAck -------> | |||
4) --------------------- TLS Session --------------------- | 4) --------------------- TLS Session --------------------- | |||
ClientHello -------> | ClientHello -------> | |||
ServerHello | ServerHello | |||
{EncryptedExtensions} | {EncryptedExtensions} | |||
{Certificate*} | {Certificate*} | |||
{CertificateVerify*} | {CertificateVerify*} | |||
<------- {Finished} | <------- {Finished} | |||
{Finished} -------> | {Finished} -------> | |||
5) ---------------------- Stream Prefix -------------------- | 5) ---------------------- Stream Prefix -------------------- | |||
"IKETCP" -------> | "IKETCP" ------->]]></artwork> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
6) ------------ Retransmit Message from step 2 ------------- | 6) ------------ Retransmit Message from step 2 ------------- | |||
Length + Non-ESP Marker -------> | Length + Non-ESP Marker -------> | |||
INFORMATIONAL | INFORMATIONAL | |||
HDR, SK { N(UPDATE_SA_ADDRESSES), | HDR, SK { N(UPDATE_SA_ADDRESSES), | |||
N(NAT_DETECTION_SOURCE_IP), | N(NAT_DETECTION_SOURCE_IP), | |||
N(NAT_DETECTION_DESTINATION_IP) } | N(NAT_DETECTION_DESTINATION_IP) } | |||
<------- Length + Non-ESP Marker | <------- Length + Non-ESP Marker | |||
INFORMATIONAL | INFORMATIONAL | |||
HDR, SK { N(NAT_DETECTION_SOURCE_IP), | HDR, SK { N(NAT_DETECTION_SOURCE_IP), | |||
N(NAT_DETECTION_DESTINATION_IP) } | N(NAT_DETECTION_DESTINATION_IP) } | |||
7) -- New Exchange with recalculated NAT_DETECTION_*_IP --- | 7) -- New Exchange with recalculated NAT_DETECTION_*_IP --- | |||
Length + Non-ESP Marker -------> | Length + Non-ESP Marker -------> | |||
INFORMATIONAL | INFORMATIONAL | |||
HDR, SK { N(UPDATE_SA_ADDRESSES), | HDR, SK { N(UPDATE_SA_ADDRESSES), | |||
N(NAT_DETECTION_SOURCE_IP), | N(NAT_DETECTION_SOURCE_IP), | |||
N(NAT_DETECTION_DESTINATION_IP) } | N(NAT_DETECTION_DESTINATION_IP) } | |||
<------- Length + Non-ESP Marker | <------- Length + Non-ESP Marker | |||
INFORMATIONAL | INFORMATIONAL | |||
HDR, SK { N(NAT_DETECTION_SOURCE_IP), | HDR, SK { N(NAT_DETECTION_SOURCE_IP), | |||
N(NAT_DETECTION_DESTINATION_IP) } | N(NAT_DETECTION_DESTINATION_IP) } | |||
8) <---------------------> IKE/ESP Flow <------------------> | 8) <---------------------> IKE/ESP Flow <------------------>]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t><list style="numbers"> | ||||
<t>During the IKE_AUTH exchange, the client and server exchange | ||||
MOBIKE_SUPPORTED notify payloads to indicate support for MOBIKE. | ||||
</t> | ||||
<t>The client changes its point of attachment to the network and | <ol spacing="normal" type="1"><li>During the IKE_AUTH exchange, the clie | |||
nt and server exchange | ||||
MOBIKE_SUPPORTED notify payloads to indicate support for MOBIKE. | ||||
</li> | ||||
<li>The client changes its point of attachment to the network and | ||||
receives a new IP address. The client attempts to re-establish | receives a new IP address. The client attempts to re-establish | |||
the IKE session using the UPDATE_SA_ADDRESSES notify payload, but | the IKE session using the UPDATE_SA_ADDRESSES notify payload, but | |||
the server does not respond because the network blocks UDP | the server does not respond because the network blocks UDP | |||
traffic. | traffic. | |||
</t> | </li> | |||
<li>The client brings up a TCP connection to the server in order to | ||||
<t>The client brings up a TCP connection to the server in order to | ||||
use TCP encapsulation. | use TCP encapsulation. | |||
</t> | </li> | |||
<li>The client initiates a TLS handshake with the server.</li> | ||||
<t>The client initiates a TLS handshake with the server.</t> | <li>The client sends the stream prefix for TCP-encapsulated IKE | |||
traffic (<xref target="prefix" format="default"/>). | ||||
<t>The client sends the stream prefix for TCP-encapsulated IKE | </li> | |||
traffic (<xref target="prefix"/>). | <li>The client sends the UPDATE_SA_ADDRESSES notify payload in the | |||
</t> | ||||
<t>The client sends the UPDATE_SA_ADDRESSES notify payload in the | ||||
INFORMATIONAL exchange on the | INFORMATIONAL exchange on the | |||
TCP-encapsulated connection. Note that this IKE message is the | TCP-encapsulated connection. Note that this IKE message is the | |||
same as the one sent over UDP in step 2; it should have the same | same as the one sent over UDP in step 2; it should have the same | |||
message ID and contents. | message ID and contents. | |||
</t> | </li> | |||
<li>Once the client receives a response on the | ||||
<t>Once the client receives a response on the | ||||
TCP-encapsulated connection, it immediately starts a new INFORMATI ONAL | TCP-encapsulated connection, it immediately starts a new INFORMATI ONAL | |||
exchange with an UPDATE_SA_ADDRESSES notify payload and recalculat ed | exchange with an UPDATE_SA_ADDRESSES notify payload and recalculat ed | |||
NAT_DETECTION_*_IP notify payloads in order to get correct informa tion about the presence | NAT_DETECTION_*_IP notify payloads in order to get correct informa tion about the presence | |||
of NATs. | of NATs. | |||
</t> | </li> | |||
<li>The IKE and ESP packet flow can resume.</li> | ||||
<t>The IKE and ESP packet flow can resume.</t> | </ol> | |||
</list> | </section> | |||
</t> | </section> | |||
<section numbered="false" anchor="acknowledgments" toc="default"> | ||||
</section> | <name>Acknowledgments</name> | |||
<t>Thanks to the authors of RFC 8229 (<contact fullname="Tommy | ||||
</section> | Pauly"/>, <contact fullname="Samy Touati"/>, and <contact fullname="Ravi | |||
Mantha"/>). Since this document clarifies and obsoletes RFC 8229, most of | ||||
<section title="Acknowledgments" numbered="no" anchor="acknowledgments"> | its text was borrowed from the original document. | |||
<t>Thanks to the original authors of RFC 8229, Tommy Pauly, Samy Touat | </t> | |||
i, and Ravi Mantha. | <t>The following people provided valuable feedback and advice while | |||
Since this document updates and obsoletes RFC 8229, most of its text w | preparing RFC 8229: <contact fullname="Stuart Cheshire"/>, <contact | |||
as borrowed | fullname="Delziel Fernandes"/>, <contact fullname="Yoav Nir"/>, <contact | |||
from the original document. | fullname="Christoph Paasch"/>, <contact fullname="Yaron Sheffer"/>, | |||
</t> | <contact fullname="David Schinazi"/>, <contact fullname="Graham | |||
Bartlett"/>, <contact fullname="Byju Pularikkal"/>, <contact | ||||
<t>The following people provided valuable feedback and advices while p | fullname="March Wu"/>, <contact fullname="Kingwel Xie"/>, <contact | |||
reparing RFC8229: | fullname="Valery Smyslov"/>, <contact fullname="Jun Hu"/>, and <contact | |||
Stuart Cheshire, Delziel Fernandes, Yoav Nir, Christoph Paasch, Yaron | fullname="Tero Kivinen"/>. Special thanks to <contact fullname="Eric | |||
Sheffer, David Schinazi, Graham Bartlett, Byju Pularikkal, March Wu, | Kinnear"/> for his implementation work. | |||
Kingwel Xie, Valery Smyslov, Jun Hu, and Tero Kivinen. Special | </t> | |||
thanks to Eric Kinnear for his implementation work. | <t>The authors would like to thank <contact fullname="Tero Kivinen"/>, | |||
</t> | <contact fullname="Paul Wouters"/>, <contact fullname="Joseph Touch"/>, | |||
and <contact fullname="Christian Huitema"/> for their valuable comments | ||||
<t>The authors would like to thank Tero Kivinen, Paul Wouters, Joseph | while preparing this document. | |||
Touch, and Christian Huitema for their | </t> | |||
valuable comments while preparing this document. | </section> | |||
</t> | </back> | |||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 235 change blocks. | ||||
1159 lines changed or deleted | 1110 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |