<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.6.2 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-masque-connect-ip-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title abbrev="HTTP IP Proxy">IP Proxying Support for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-ip-01"/>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="D." surname="Schinazi" fullname="David Schinazi">
      <organization>Google LLC</organization>
      <address>
        <email>dschinazi.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Chernyakhovsky" fullname="Alex Chernyakhovsky">
      <organization>Google LLC</organization>
      <address>
        <email>achernya@google.com</email>
      </address>
    </author>
    <author initials="M." surname="Kuehlewind" fullname="Mirja Kuehlewind">
      <organization>Ericsson</organization>
      <address>
        <email>mirja.kuehlewind@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Westerlund" fullname="Magnus Westerlund">
      <organization>Ericsson</organization>
      <address>
        <email>magnus.westerlund@ericsson.com</email>
      </address>
    </author>
    <date year="2022" month="March" day="05"/>
    <area>TSV</area>
    <workgroup>MASQUE</workgroup>
    <abstract>
      <t>This document describes a method of proxying IP packets over HTTP. This
protocol is similar to CONNECT-UDP, but allows transmitting arbitrary IP
packets, without being limited to just TCP like CONNECT or UDP like CONNECT-UDP.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Multiplexed Application Substrate over QUIC Encryption Working Group mailing list (masque@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/masque/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/tfpauly/draft-age-masque-connect-ip"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes a method of proxying IP packets over HTTP. When using
HTTP/2 or HTTP/3, IP proxying uses HTTP Extended CONNECT as described in
<xref target="EXT-CONNECT2"/> and <xref target="EXT-CONNECT3"/>.
When using HTTP/1.x, IP proxying uses HTTP Upgrade as defined in <xref section="7.8" sectionFormat="of" target="SEMANTICS"/>. This protocol is similar to CONNECT-UDP
<xref target="CONNECT-UDP"/>, but allows transmitting arbitrary
IP packets, without being limited to just TCP like CONNECT <xref target="SEMANTICS"/> or UDP
like CONNECT-UDP.</t>
      <t>The HTTP Upgrade Token defined for this mechanism is "connect-ip", which is
also referred to as CONNECT-IP in this document.</t>
      <t>The CONNECT-IP protocol allows endpoints to set up a tunnel for proxying IP
packets using an HTTP proxy. This can be used for various solutions that
include general-purpose packet tunnelling, such as for a point-to-point or
point-to-network VPN, or for limited forwarding of packets to specific hosts.</t>
      <t>Forwarded IP packets can be sent efficiently via the proxy using HTTP Datagram
support <xref target="HTTP-DGRAM"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
      <t>In this document, we use the term "proxy" to refer to the HTTP server that
responds to the CONNECT-IP request. If there are HTTP intermediaries (as
defined in <xref section="3.7" sectionFormat="of" target="SEMANTICS"/>) between the client and the proxy,
those are referred to as "intermediaries" in this document.</t>
    </section>
    <section anchor="client-config">
      <name>Configuration of Clients</name>
      <t>Clients are configured to use IP Proxying over HTTP via an URI Template
<xref target="TEMPLATE"/>. The URI template MAY contain two variables: "target" and
"ip_proto". Examples are shown below:</t>
      <figure anchor="fig-template-examples">
        <name>URI Template Examples</name>
        <artwork><![CDATA[
https://masque.example.org/{target}/{ip_proto}/
https://proxy.example.org:4443/masque?t={target}&p={ip_proto}
https://proxy.example.org:4443/masque{?target,ip_proto}
https://masque.example.org/?user=bob
]]></artwork>
      </figure>
    </section>
    <section anchor="the-connect-ip-protocol">
      <name>The CONNECT-IP Protocol</name>
      <t>This document defines the "connect-ip" HTTP Upgrade Token. "connect-ip" uses
the Capsule Protocol as defined in <xref target="HTTP-DGRAM"/>.</t>
      <t>When sending its IP proxying request, the client SHALL perform URI template
expansion to determine the path and query of its request, see <xref target="client-config"/>.</t>
      <t>When using HTTP/2 or HTTP/3, the following requirements apply to requests:</t>
      <ul spacing="normal">
        <li>The ":method" pseudo-header field SHALL be set to "CONNECT".</li>
        <li>The ":protocol" pseudo-header field SHALL be set to "connect-ip".</li>
        <li>The ":authority" pseudo-header field SHALL contain the host and port of the
proxy, not an individual endpoint with which a connection is desired.</li>
        <li>The contents of the ":path" pseudo-header SHALL be determined by the URI
template expansion, see <xref target="client-config"/>. Variables in the URI template can
determine the scope of the request, such as requesting full-tunnel IP packet
forwarding, or a specific proxied flow, see <xref target="scope"/>.</li>
      </ul>
      <t>The client SHOULD also include the "Capsule-Protocol" header with a value of "?1"
to negotiate support for sending and receiving HTTP capsules (<xref target="HTTP-DGRAM"/>).</t>
      <t>Any 2xx (Successful) response indicates that the proxy is willing to open an IP
forwarding tunnel between it and the client. Any response other than a
successful response indicates that the tunnel has not been formed.</t>
      <t>A proxy MUST NOT send any Transfer-Encoding or Content-Length header fields in
a 2xx (Successful) response to the IP Proxying request. A client MUST treat a
successful response containing any Content-Length or Transfer-Encoding header
fields as malformed.</t>
      <t>The lifetime of the forwarding tunnel is tied to the CONNECT stream. Closing
the stream (in HTTP/3 via the FIN bit on a QUIC STREAM frame, or a QUIC
RESET_STREAM frame) closes the associated forwarding tunnel.</t>
      <t>Along with a successful response, the proxy can send capsules to assign
addresses and advertise routes to the client (<xref target="capsules"/>). The client can
also assign addresses and advertise routes to the proxy for network-to-network
routing.</t>
      <section anchor="scope">
        <name>Limiting Request Scope</name>
        <t>Unlike CONNECT-UDP requests, which require specifying a target host, CONNECT-IP
requests can allow endpoints to send arbitrary IP packets to any host. The
client can choose to restrict a given request to a specific host or IP protocol
by adding parameters to its request. When the server knows that a request is
scoped to a target host or protocol, it can leverage this information to
optimize its resource allocation; for example, the server can assign the same
public IP address to two CONNECT-IP requests that are scoped to different hosts
and/or different protocols.</t>
        <t>CONNECT-IP uses URI template variables (<xref target="client-config"/>) to determine the
scope of the request for packet proxying. All variables defined here are
optional, and have default values if not included.</t>
        <t>The defined variables are:</t>
        <dl>
          <dt>target:</dt>
          <dd>
            <t>The variable "target" contains a hostname or IP address of a specific host to
which the client wants to proxy packets. If the "target" variable is not
specified, the client is requesting to communicate with any allowable host. If
the target is an IP address, the request will only support a single IP version.
If the target is a hostname, the server is expected to perform DNS resolution
to determine which route(s) to advertise to the client. The server SHOULD
send a ROUTE_ADVERTISEMENT capsule that includes routes for all usable
resolved addresses for the requested hostname.</t>
          </dd>
          <dt>ipproto:</dt>
          <dd>
            <t>The variable "ipproto" contains an IP protocol number, as defined in the
"Assigned Internet Protocol Numbers" IANA registry. If present, it specifies
that a client only wants to proxy a specific IP protocol for this request. If
the value is 0, or the variable is not included, the client is requesting to
use any IP protocol.</t>
          </dd>
        </dl>
      </section>
      <section anchor="capsules">
        <name>Capsules</name>
        <t>This document defines multiple new capsule types that allow endpoints to
exchange IP configuration information. Both endpoints MAY send any number of
these new capsules.</t>
        <section anchor="addressassign-capsule">
          <name>ADDRESS_ASSIGN Capsule</name>
          <t>The ADDRESS_ASSIGN capsule (see <xref target="iana-types"/> for the value of the capsule
type) allows an endpoint to inform its peer that it has assigned an IP address
or prefix to it. The ADDRESS_ASSIGN capsule allows assigning a prefix which can
contain multiple addresses. Any of these addresses can be used as the source
address on IP packets originated by the receiver of this capsule.</t>
          <figure anchor="addr-assign-format">
            <name>ADDRESS_ASSIGN Capsule Format</name>
            <artwork><![CDATA[
ADDRESS_ASSIGN Capsule {
  Type (i) = ADDRESS_ASSIGN,
  Length (i),
  IP Version (8),
  IP Address (32..128),
  IP Prefix Length (8),
}
]]></artwork>
          </figure>
          <dl>
            <dt>IP Version:</dt>
            <dd>
              <t>IP Version of this address assignment. MUST be either 4 or 6.</t>
            </dd>
            <dt>IP Address:</dt>
            <dd>
              <t>Assigned IP address. If the IP Version field has value 4, the IP Address
field SHALL have a length of 32 bits. If the IP Version field has value 6, the
IP Address field SHALL have a length of 128 bits.</t>
            </dd>
            <dt>IP Prefix Length:</dt>
            <dd>
              <t>The number of bits in the IP Address that are used to define the prefix that
is being assigned. This MUST be less than or equal to the length of the IP
Address field, in bits. If the prefix length is equal to the length of the IP
Address, the receiver of this capsule is only allowed to send packets from a
single source address. If the prefix length is less than the length of the IP
address, the receiver of this capsule is allowed to send packets from any source
address that falls within the prefix.</t>
            </dd>
          </dl>
          <t>If an endpoint receives multiple ADDRESS_ASSIGN capsules, all of the assigned
addresses or prefixes can be used. For example, multiple ADDRESS_ASSIGN
capsules are necessary to assign both IPv4 and IPv6 addresses.</t>
        </section>
        <section anchor="addressrequest-capsule">
          <name>ADDRESS_REQUEST Capsule</name>
          <t>The ADDRESS_REQUEST capsule (see <xref target="iana-types"/> for the value of the capsule
type) allows an endpoint to request assignment of an IP address from its peer.
This capsule is not required for simple client/proxy communication where the
client only expects to receive one address from the proxy. The capsule allows
the endpoint to optionally indicate a preference for which address it would get
assigned.</t>
          <figure anchor="addr-req-format">
            <name>ADDRESS_REQUEST Capsule Format</name>
            <artwork><![CDATA[
ADDRESS_REQUEST Capsule {
  Type (i) = ADDRESS_REQUEST,
  Length (i),
  IP Version (8),
  IP Address (32..128),
  IP Prefix Length (8),
}
]]></artwork>
          </figure>
          <dl>
            <dt>IP Version:</dt>
            <dd>
              <t>IP Version of this address request. MUST be either 4 or 6.</t>
            </dd>
            <dt>IP Address:</dt>
            <dd>
              <t>Requested IP address. If the IP Version field has value 4, the IP Address
field SHALL have a length of 32 bits. If the IP Version field has value 6, the
IP Address field SHALL have a length of 128 bits.</t>
            </dd>
            <dt>IP Prefix Length:</dt>
            <dd>
              <t>Length of the IP Prefix requested, in bits. MUST be lesser or equal to the
length of the IP Address field, in bits.</t>
            </dd>
          </dl>
          <t>Upon receiving the ADDRESS_REQUEST capsule, an endpoint SHOULD assign an IP
address to its peer, and then respond with an ADDRESS_ASSIGN capsule to inform
the peer of the assignment.</t>
        </section>
        <section anchor="routeadvertisement-capsule">
          <name>ROUTE_ADVERTISEMENT Capsule</name>
          <t>The ROUTE_ADVERTISEMENT capsule (see <xref target="iana-types"/> for the value of the
capsule type) allows an endpoint to communicate to its peer that it is willing
to route traffic to a set of IP address ranges. This indicates that the sender
has an existing route to each address range, and notifies its peer that if the
receiver of the ROUTE_ADVERTISEMENT capsule sends IP packets for one of these
ranges in HTTP Datagrams, the sender of the capsule will forward them along its
preexisting route. Any address which is in one of the address ranges can be
used as the destination address on IP packets originated by the receiver of
this capsule.</t>
          <figure anchor="route-adv-format">
            <name>ROUTE_ADVERTISEMENT Capsule Format</name>
            <artwork><![CDATA[
ROUTE_ADVERTISEMENT Capsule {
  Type (i) = ROUTE_ADVERTISEMENT,
  Length (i),
  IP Address Range (..) ...,
}
]]></artwork>
          </figure>
          <t>The ROUTE_ADVERTISEMENT capsule contains a sequence of IP Address Ranges.</t>
          <figure anchor="addr-range-format">
            <name>IP Address Range Format</name>
            <artwork><![CDATA[
IP Address Range {
  IP Version (8),
  Start IP Address (32..128),
  End IP Address (32..128),
  IP Protocol (8),
}
]]></artwork>
          </figure>
          <dl>
            <dt>IP Version:</dt>
            <dd>
              <t>IP Version of this range. MUST be either 4 or 6.</t>
            </dd>
            <dt>Start IP Address and End IP Address:</dt>
            <dd>
              <t>Inclusive start and end IP address of the advertised range. If the IP Version
field has value 4, these fields SHALL have a length of 32 bits. If the IP
Version field has value 6, these fields SHALL have a length of 128 bits. The
Start IP Address MUST be lesser or equal to the End IP Address.</t>
            </dd>
            <dt>IP Protocol:</dt>
            <dd>
              <t>The Internet Protocol Number for traffic that can be sent to this range. If
the value is 0, all protocols are allowed.</t>
            </dd>
          </dl>
          <t>Upon receiving the ROUTE_ADVERTISEMENT capsule, an endpoint MAY start routing
IP packets in these ranges to its peer.</t>
          <t>Each ROUTE_ADVERTISEMENT contains the full list of address ranges. If multiple
ROUTE_ADVERTISEMENT capsules are sent in one direction, each
ROUTE_ADVERTISEMENT capsule supersedes prior ones. In other words, if a given
address range was present in a prior capsule but the most recently received
ROUTE_ADVERTISEMENT capsule does not contain it, the receiver will consider
that range withdrawn.</t>
          <t>If multiple ranges using the same IP protocol were to overlap, some routing
table implementations might reject them. To prevent overlap, the ranges are
ordered; this places the burden on the sender and makes verification by the
receiver much simpler. If an IP Address Range A precedes an IP address range B
in the same ROUTE_ADVERTISEMENT capsule, they MUST follow these requirements:</t>
          <ul spacing="normal">
            <li>IP Version of A MUST be lesser or equal than IP Version of B</li>
            <li>If the IP Version of A and B are equal, the IP Protocol of A MUST be lesser
or equal than IP Protocol of B.</li>
            <li>If the IP Version and IP Protocol of A and B are both equal, the End IP
Address of A MUST be strictly lesser than the Start IP Address of B.</li>
          </ul>
          <t>If an endpoint received a ROUTE_ADVERTISEMENT capsule that does not meet these
requirements, it MUST abort the stream.</t>
        </section>
      </section>
    </section>
    <section anchor="context-identifiers">
      <name>Context Identifiers</name>
      <t>This protocol allows future extensions to exchange HTTP Datagrams which carry
different semantics from IP packets. For example, an extension could define
a way to send compressed IP header fields. In order to allow for this
extensibility, all HTTP Datagrams associated with IP proxying request streams
start with a context ID, see <xref target="payload-format"/>.</t>
      <t>Context IDs are 62-bit integers (0 to 2<sup>62</sup>-1). Context IDs are encoded
as variable-length integers, see <xref section="16" sectionFormat="of" target="QUIC"/>. The context ID
value of 0 is reserved for IP packets, while non-zero values are dynamically
allocated: non-zero even-numbered context IDs are client-allocated, and odd-numbered
context IDs are server-allocated. The context ID namespace is tied to a given
HTTP request: it is possible for a context ID with the same numeric value to be
simultaneously assigned different semantics in distinct requests, potentially
with different semantics. Context IDs MUST NOT be re-allocated within a given
HTTP namespace but MAY be allocated in any order. Once allocated, any context ID
can be used by both client and server - only allocation carries separate
namespaces to avoid requiring synchronization.</t>
      <t>Registration is the action by which an endpoint informs its peer of the
semantics and format of a given context ID. This document does not define how
registration occurs. Depending on the method being used, it is possible for
datagrams to be received with Context IDs which have not yet been registered,
for instance due to reordering of the datagram and the registration packets
during transmission.</t>
    </section>
    <section anchor="payload-format">
      <name>HTTP Datagram Payload Format</name>
      <t>When associated with IP proxying request streams, the HTTP Datagram Payload
field of HTTP Datagrams (see <xref target="HTTP-DGRAM"/>) has the format defined in
<xref target="dgram-format"/>. Note that when HTTP Datagrams are encoded using QUIC DATAGRAM
frames, the Context ID field defined below directly follows the Quarter Stream
ID field which is at the start of the QUIC DATAGRAM frame payload:</t>
      <figure anchor="dgram-format">
        <name>IP Proxying HTTP Datagram Format</name>
        <artwork><![CDATA[
IP Proxying HTTP Datagram Payload {
  Context ID (i),
  Payload (..),
}
]]></artwork>
      </figure>
      <dl>
        <dt>Context ID:</dt>
        <dd>
          <t>A variable-length integer that contains the value of the Context ID. If an
HTTP/3 datagram which carries an unknown Context ID is received, the receiver
SHALL either drop that datagram silently or buffer it temporarily (on the order
of a round trip) while awaiting the registration of the corresponding Context ID.</t>
        </dd>
        <dt>Payload:</dt>
        <dd>
          <t>The payload of the datagram, whose semantics depend on value of the previous
field. Note that this field can be empty.</t>
        </dd>
      </dl>
      <t>IP packets are encoded using HTTP Datagrams with the Context ID set to zero.
When the Context ID is set to zero, the Payload field contains a full IP
packet (from the IP Version field until the last byte of the IP Payload).</t>
      <t>Clients MAY optimistically start sending proxied IP packets before receiving
the response to its IP proxying request, noting however that those may not be
processed by the proxy if it responds to the request with a failure, or if the
datagrams are received by the proxy before the request.</t>
      <t>When a CONNECT-IP endpoint receives an HTTP Datagram containing an IP packet,
it will parse the packet's IP header, perform any local policy checks (e.g.,
source address validation), check their routing table to pick an outbound
interface, and then send the IP packet on that interface.</t>
      <t>In the other direction, when a CONNECT-IP endpoint receives an IP packet, it
checks to see if the packet matches the routes mapped for a CONNECT-IP
forwarding tunnel, and performs the same forwarding checks as above before
transmitting the packet over HTTP Datagrams.</t>
      <t>Note that CONNECT-IP endpoints will decrement the IP Hop Count (or TTL) upon
encapsulation but not decapsulation. In other words, the Hop Count is
decremented right before an IP packet is transmitted in an HTTP Datagram. This
prevents infinite loops in the presence of routing loops, and matches the
choices in IPsec <xref target="IPSEC"/>.</t>
      <t>Endpoints MAY implement additional filtering policies on the IP packets they
forward.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>CONNECT-IP enables many different use cases that can benefit from IP packet
proxying and tunnelling. These examples are provided to help illustrate some of
the ways in which CONNECT-IP can be used.</t>
      <section anchor="remote-access-vpn">
        <name>Remote Access VPN</name>
        <t>The following example shows a point-to-network VPN setup, where a client
receives a set of local addresses, and can send to any remote server through
the proxy. Such VPN setups can be either full-tunnel or split-tunnel.</t>
        <figure anchor="diagram-tunnel">
          <name>VPN Tunnel Setup</name>
          <artwork><![CDATA[
+--------+ IP A         IP B +--------+              +---> IP D
|        |-------------------|        | IP C         |
| Client | IP Subnet C <-> * | Server |--------------+---> IP E
|        |-------------------|        |              |
+--------+                   +--------+              +---> IP ...

]]></artwork>
        </figure>
        <t>In this case, the client does not specify any scope in its request. The server
assigns the client an IPv4 address to the client (192.0.2.11) and a full-tunnel
route of all IPv4 addresses (0.0.0.0/0). The client can then send to any IPv4
host using a source address in its assigned prefix.</t>
        <figure anchor="fig-full-tunnel">
          <name>VPN Full-Tunnel Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From Server ]]

SETTINGS
H3_DATAGRAM = 1

                              SETTINGS
                              SETTINGS_ENABLE_CONNECT_PROTOCOL = 1
                              H3_DATAGRAM = 1

STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /vpn
:authority = server.example.com
capsule-protocol = ?1

                              STREAM(44): HEADERS
                              :status = 200
                              capsule-protocol = ?1

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 4
                              IP Address = 192.0.2.11
                              IP Prefix Length = 32

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 4
                               Start IP Address = 0.0.0.0
                               End IP Address = 255.255.255.255
                               IP Protocol = 0) // Any

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IP Packet

                              DATAGRAM
                              Quarter Stream ID = 11
                              Context ID = 0
                              Payload = Encapsulated IP Packet
]]></artwork>
        </figure>
        <t>A setup for a split-tunnel VPN (the case where the client can only access a
specific set of private subnets) is quite similar. In this case, the advertised
route is restricted to 192.0.2.0/24, rather than 0.0.0.0/0.</t>
        <figure anchor="fig-split-tunnel">
          <name>VPN Split-Tunnel Capsule Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From Server ]]

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 4
                              IP Address = 192.0.2.42
                              IP Prefix Length = 32

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 4
                               Start IP Address = 192.0.2.0
                               End IP Address = 192.0.2.255
                               IP Protocol = 0) // Any
]]></artwork>
        </figure>
      </section>
      <section anchor="ip-flow-forwarding">
        <name>IP Flow Forwarding</name>
        <t>The following example shows an IP flow forwarding setup, where a client
requests to establish a forwarding tunnel to target.example.com using SCTP (IP
protocol 132), and receives a single local address and remote address it can
use for transmitting packets. A similar approach could be used for any other IP
protocol that isn't easily proxied with existing HTTP methods, such as ICMP,
ESP, etc.</t>
        <figure anchor="diagram-flow">
          <name>Proxied Flow Setup</name>
          <artwork><![CDATA[
+--------+ IP A         IP B +--------+
|        |-------------------|        | IP C
| Client |    IP C <-> D     | Server |---------> IP D
|        |-------------------|        |
+--------+                   +--------+

]]></artwork>
        </figure>
        <t>In this case, the client specfies both a target hostname and an IP protocol
number in the scope of its request, indicating that it only needs to
communicate with a single host. The proxy server is able to perform DNS
resolution on behalf of the client and allocate a specific outbound socket for
the client instead of allocating an entire IP address to the client. In this
regard, the request is similar to a traditional CONNECT proxy request.</t>
        <t>The server assigns a single IPv6 address to the client (2001:db8::1234:1234)
and a route to a single IPv6 host (2001:db8::3456), scoped to SCTP. The client
can send and recieve SCTP IP packets to the remote host.</t>
        <figure anchor="fig-flow">
          <name>Proxied SCTP Flow Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From Server ]]

SETTINGS
H3_DATAGRAM = 1
                              SETTINGS
                              SETTINGS_ENABLE_CONNECT_PROTOCOL = 1
                              H3_DATAGRAM = 1

STREAM(52): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /proxy?target=target.example.com&ipproto=132
:authority = server.example.com
capsule-protocol = ?1

                              STREAM(52): HEADERS
                              :status = 200
                              capsule-protocol = ?1

                              STREAM(52): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 6
                              IP Address = 2001:db8::1234:1234
                              IP Prefix Length = 128

                              STREAM(52): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 6
                               Start IP Address = 2001:db8::3456
                               End IP Address = 2001:db8::3456
                               IP Protocol = 132)

DATAGRAM
Quarter Stream ID = 13
Context ID = 0
Payload = Encapsulated SCTP/IP Packet

                              DATAGRAM
                              Quarter Stream ID = 13
                              Context ID = 0
                              Payload = Encapsulated SCTP/IP Packet
]]></artwork>
        </figure>
      </section>
      <section anchor="proxied-connection-racing">
        <name>Proxied Connection Racing</name>
        <t>The following example shows a setup where a client is proxying UDP packets
through a CONNECT-IP proxy in order to control connection establishement racing
through a proxy, as defined in Happy Eyeballs <xref target="HEv2"/>. This example
is a variant of the proxied flow, but highlights how IP-level proxying can
enable new capabilities even for TCP and UDP.</t>
        <figure anchor="diagram-racing">
          <name>Proxied Connection Racing Setup</name>
          <artwork><![CDATA[
+--------+ IP A         IP B +--------+ IP C
|        |-------------------|        |<------------> IP E
| Client |  IP C<->E, D<->F  | Server |
|        |-------------------|        |<------------> IP F
+--------+                   +--------+ IP D

]]></artwork>
        </figure>
        <t>As with proxied flows, the client specfies both a target hostname and an IP
protocol number in the scope of its request. When the proxy server performs DNS
resolution on behalf of the client, it can send the various remote address
options to the client as separate routes. It can also ensure that the client
has both IPv4 and IPv6 addresses assigned.</t>
        <t>The server assigns the client both an IPv4 address (192.0.2.3) and an IPv6
address (2001:db8::1234:1234) to the client, as well as an IPv4 route
(198.51.100.2) and an IPv6 route (2001:db8::3456), which represent the resolved
addresses of the target hostname, scoped to UDP. The client can send and
recieve UDP IP packets to the either of the server addresses to enable Happy
Eyeballs through the proxy.</t>
        <figure anchor="fig-listen">
          <name>Proxied Connection Racing Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From Server ]]

SETTINGS
H3_DATAGRAM = 1

                              SETTINGS
                              SETTINGS_ENABLE_CONNECT_PROTOCOL = 1
                              H3_DATAGRAM = 1

STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /proxy?ipproto=17
:authority = server.example.com
capsule-protocol = ?1

                              STREAM(44): HEADERS
                              :status = 200
                              capsule-protocol = ?1

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 4
                              IP Address = 192.0.2.3
                              IP Prefix Length = 32

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 6
                              IP Address = 2001:db8::1234:1234
                              IP Prefix Length = 128

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 4
                               Start IP Address = 198.51.100.2
                               End IP Address = 198.51.100.2
                               IP Protocol = 17),
                              (IP Version = 6
                               Start IP Address = 2001:db8::3456
                               End IP Address = 2001:db8::3456
                               IP Protocol = 17)
...

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IPv6 Packet

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IPv4 Packet

]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>There are significant risks in allowing arbitrary clients to establish a tunnel
to arbitrary servers, as that could allow bad actors to send traffic and have
it attributed to the proxy. Proxies that support CONNECT-IP SHOULD restrict its
use to authenticated users. The HTTP Authorization header <xref target="AUTH"/> MAY
be used to authenticate clients. More complex authentication schemes are out of
scope for this document but can be implemented using CONNECT-IP extensions.</t>
      <t>Since CONNECT-IP endpoints can proxy IP packets send by their peer, they SHOULD
follow the guidance in <xref target="BCP38"/> to help prevent denial of service
attacks.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="connect-ip-http-upgrade-token">
        <name>CONNECT-IP HTTP Upgrade Token</name>
        <t>This document will request IANA to register "connect-ip" in the HTTP Upgrade
Token Registry maintained at
&lt;<eref target="https://www.iana.org/assignments/http-upgrade-tokens"/>&gt;.</t>
        <dl>
          <dt>Value:</dt>
          <dd>
            <t>connect-ip</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>The CONNECT-IP Protocol</t>
          </dd>
          <dt>Expected Version Tokens:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>References:</dt>
          <dd>
            <t>This document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-types">
        <name>Capsule Type Registrations</name>
        <t>This document will request IANA to add the following values to the "HTTP
Capsule Types" registry created by <xref target="HTTP-DGRAM"/>:</t>
        <table anchor="iana-capsules-table">
          <name>New Capsules</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0xfff100</td>
              <td align="left">ADDRESS_ASSIGN</td>
              <td align="left">Address Assignment</td>
              <td align="left">This Document</td>
            </tr>
            <tr>
              <td align="left">0xfff101</td>
              <td align="left">ADDRESS_REQUEST</td>
              <td align="left">Address Request</td>
              <td align="left">This Document</td>
            </tr>
            <tr>
              <td align="left">0xfff102</td>
              <td align="left">ROUTE_ADVERTISEMENT</td>
              <td align="left">Route Advertisement</td>
              <td align="left">This Document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="SEMANTICS">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="Roy T. Fielding">
              <organization>Adobe</organization>
            </author>
            <author fullname="Mark Nottingham">
              <organization>Fastly</organization>
            </author>
            <author fullname="Julian Reschke">
              <organization>greenbytes GmbH</organization>
            </author>
            <date day="12" month="September" year="2021"/>
            <abstract>
              <t>   The Hypertext Transfer Protocol (HTTP) is a stateless application-
   level protocol for distributed, collaborative, hypertext information
   systems.  This document describes the overall architecture of HTTP,
   establishes common terminology, and defines aspects of the protocol
   that are shared by all versions.  In this definition are core
   protocol elements, extensibility mechanisms, and the "http" and
   "https" Uniform Resource Identifier (URI) schemes.

   This document updates RFC 3864 and obsoletes RFC 2818, RFC 7231, RFC
   7232, RFC 7233, RFC 7235, RFC 7538, RFC 7615, RFC 7694, and portions
   of RFC 7230.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-semantics-19"/>
        </reference>
        <reference anchor="EXT-CONNECT2">
          <front>
            <title>Bootstrapping WebSockets with HTTP/2</title>
            <author fullname="P. McManus" initials="P." surname="McManus">
              <organization/>
            </author>
            <date month="September" year="2018"/>
            <abstract>
              <t>This document defines a mechanism for running the WebSocket Protocol (RFC 6455) over a single stream of an HTTP/2 connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8441"/>
          <seriesInfo name="DOI" value="10.17487/RFC8441"/>
        </reference>
        <reference anchor="EXT-CONNECT3">
          <front>
            <title>Bootstrapping WebSockets with HTTP/3</title>
            <author fullname="Ryan Hamilton">
              <organization>Google</organization>
            </author>
            <date day="8" month="February" year="2022"/>
            <abstract>
              <t>   The mechanism for running the WebSocket Protocol over a single stream
   of an HTTP/2 connection is equally applicable to HTTP/3, but the HTTP
   version-specific details need to be specified.  This document
   describes how the mechanism is adapted for HTTP/3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-h3-websockets-04"/>
        </reference>
        <reference anchor="HTTP-DGRAM">
          <front>
            <title>Using Datagrams with HTTP</title>
            <author fullname="David Schinazi">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Lucas Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="March" year="2022"/>
            <abstract>
              <t>   The QUIC DATAGRAM extension provides application protocols running
   over QUIC with a mechanism to send unreliable data while leveraging
   the security and congestion-control properties of QUIC.  However,
   QUIC DATAGRAM frames do not provide a means to demultiplex
   application contexts.  This document describes how to use QUIC
   DATAGRAM frames with HTTP/3 by association with HTTP requests.
   Additionally, this document defines the Capsule Protocol that can
   convey datagrams over prior versions of HTTP.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-h3-datagram-06"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="TEMPLATE">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Hadley" initials="M." surname="Hadley">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="D. Orchard" initials="D." surname="Orchard">
              <organization/>
            </author>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol.  QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances.  Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="BCP38">
          <front>
            <title>Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing</title>
            <author fullname="P. Ferguson" initials="P." surname="Ferguson">
              <organization/>
            </author>
            <author fullname="D. Senie" initials="D." surname="Senie">
              <organization/>
            </author>
            <date month="May" year="2000"/>
            <abstract>
              <t>This paper discusses a simple, effective, and straightforward method for using ingress traffic filtering to prohibit DoS (Denial of Service) attacks which use forged IP addresses to be propagated from 'behind' an Internet Service Provider's (ISP) aggregation point.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="38"/>
          <seriesInfo name="RFC" value="2827"/>
          <seriesInfo name="DOI" value="10.17487/RFC2827"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="CONNECT-UDP">
          <front>
            <title>UDP Proxying Support for HTTP</title>
            <author fullname="David Schinazi">
              <organization>Google LLC</organization>
            </author>
            <date day="4" month="March" year="2022"/>
            <abstract>
              <t>   This document describes how to proxy UDP over HTTP.  Similar to how
   the CONNECT method allows proxying TCP over HTTP, this document
   defines a new mechanism to proxy UDP.  It is built using HTTP
   Extended CONNECT.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-udp-07"/>
        </reference>
        <reference anchor="IPSEC">
          <front>
            <title>Security Architecture for the Internet Protocol</title>
            <author fullname="S. Kent" initials="S." surname="Kent">
              <organization/>
            </author>
            <author fullname="K. Seo" initials="K." surname="Seo">
              <organization/>
            </author>
            <date month="December" year="2005"/>
            <abstract>
              <t>This document describes an updated version of the "Security Architecture for IP", which is designed to provide security services for traffic at the IP layer.  This document obsoletes RFC 2401 (November 1998).  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4301"/>
          <seriesInfo name="DOI" value="10.17487/RFC4301"/>
        </reference>
        <reference anchor="HEv2">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <date month="December" year="2017"/>
            <abstract>
              <t>Many communication protocols operating over the modern Internet use hostnames.  These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics.  Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly.  This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs".  This document obsoletes the original algorithm description in RFC 6555.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8305"/>
          <seriesInfo name="DOI" value="10.17487/RFC8305"/>
        </reference>
        <reference anchor="AUTH">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Authentication</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypermedia information systems.  This document defines the HTTP Authentication framework.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7235"/>
          <seriesInfo name="DOI" value="10.17487/RFC7235"/>
        </reference>
        <reference anchor="PROXY-REQS">
          <front>
            <title>Requirements for a MASQUE Protocol to Proxy IP Traffic</title>
            <author fullname="Alex Chernyakhovsky">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Dallas McCall">
              <organization>Google LLC</organization>
            </author>
            <author fullname="David Schinazi">
              <organization>Google LLC</organization>
            </author>
            <date day="27" month="August" year="2021"/>
            <abstract>
              <t>   There is interest among MASQUE working group participants in
   designing a protocol that can proxy IP traffic over HTTP.  This
   document describes the set of requirements for such a protocol.

   Discussion of this work is encouraged to happen on the MASQUE IETF
   mailing list masque@ietf.org or on the GitHub repository which
   contains the draft: https://github.com/ietf-wg-masque/draft-ietf-
   masque-ip-proxy-reqs.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-ip-proxy-reqs-03"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The design of this method was inspired by discussions in the MASQUE working
group around <xref target="PROXY-REQS"/>. The authors would
like to thank participants in those discussions for their feedback.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAKyrImIAA+1de3PjtrX/H58CdWZau5Xk5z7ixt1obW3Wc3e9rqVN28lk
digRslhTpEqQ9irO9rPf8wIIUvJj0ySdduo7t/GSBHBwcB6/c3AAd7tdVSZl
ag71xum5Pi/yj8sku9TDarHIi1JP80K/Ho3ON1Q0HhfmGj7Df2r37YaK80kW
zaF9XETTspuYctqdR/YflelO8iwzE3i26O7sqklUmsu8WB5qW8ZKJYviUJdF
Zcu9nZ0vd/ZUVJjoUI+G36qbvLi6LPJqcajf9od/fj9QypZRFn+I0jyDkZbG
KjuPivLDP6q8NPZQZ7laJIf6uzKfdLQFwgsztfDbco6/fK9UVJWzvDhUuqs0
/CQZNBr19HlUpUt6wnMY5fP5Mnha5MgZEydlXtCDvLiMsuSHqEzy7FD3F4vU
6NNs0qOXZh4lKUxqge2/jvBlb5LPG4Oe9PRwMkuy6IckGPckuk7i5ovmSN/k
+SUM9ebNcThSbKVFD9n+9SU+XRmx39PHM1Nky+hqll/bq3C+/dR8XPf2MYNH
E2739SW9Xhn3bU//X2VmqblJsjgY821S/D1qv2oOOCiSibV5Fg43x2a9K9/s
ayMfrRv4L8aWpkir5sDRZVbZ9rtHjEzteje+XXNoleXFHJpfGxAvPRy87Z+N
To+Hh/q0e0Lr0p2V5WKc2K6FDrMSmirV7XZ1NLZlEU1KpUazxGpQpGpuslLH
xk6KZGysjvTcgNzGOp/qhVNNUL1FNLkypdX5tWH17GnsQsE3oAF5qqE7m8yT
NCp0mevjd2dng+NR9/3JeUePq1JHaZrfWNC+KLPzpCyx26gYJ/CgWMIASgbo
6JsExocWY4PfpNBnaWLs8++guHp0fA7ProwbAZipYZDGMxy1xxOeJ3GcGqW+
AJUpizyuJsj0n2X6f5mZTFcWPlD4YHtPi+Ha3u9QE9e8stAxmbDBx9JkMczG
ER9ZP3YMkqRub38z+OuoK6/3ji5eHT8/ONj99EmDLdLNt/tHK6s92+/emLHN
idZPn3qqppEp2+19vIu294vLIooNkzRNMiIIhhwaYpl+1nuugCle2KB7kgD9
sATAtF4E/6zpbhntKl58+vQIcVH1gny2uMCE6hmI8Kg1wjOamSZfRvkV8NKx
Bp1UibOfm8kMlNnOcfobtfvZAMpmyWQGj1WU2lyDVzBFwaQBj91oMBVgcxmK
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
A6ERefg5cQAA

-->

</rfc>
