<?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.5.17 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-masque-connect-ip-00" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.11.1 -->
  <front>
    <title abbrev="HTTP IP Proxy">IP Proxying Support for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-ip-00"/>
    <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="2021" month="November" day="30"/>
    <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" numbered="true" toc="default">
      <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" format="default"/> and <xref target="EXT-CONNECT3" format="default"/>.
When using HTTP/1.x, IP proxying uses HTTP Upgrade as defined in <xref section="7.8" sectionFormat="of" target="SEMANTICS" format="default"/>. This protocol is similar to CONNECT-UDP
<xref target="CONNECT-UDP" format="default"/>, but allows transmitting arbitrary
IP packets, without being limited to just TCP like CONNECT <xref target="SEMANTICS" format="default"/> 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" format="default"/>.</t>
    </section>
    <section anchor="conventions-and-definitions" numbered="true" toc="default">
      <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" format="default"/> <xref target="RFC8174" format="default"/>
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" format="default"/>) between the client and the proxy,
those are referred to as "intermediaries" in this document.</t>
    </section>
    <section anchor="client-config" numbered="true" toc="default">
      <name>Configuration of Clients</name>
      <t>Clients are configured to use IP Proxying over HTTP via an URI Template
<xref target="TEMPLATE" format="default"/>. 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 name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
      <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" format="default"/>.</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" format="default"/>.</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" format="default"/>. 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" format="default"/>.</li>
      </ul>
      <t>Along with a request, the client can send a REGISTER_DATAGRAM_CONTEXT capsule
<xref target="HTTP-DGRAM" format="default"/> to negotiate support for sending IP packets in HTTP Datagrams
(<xref target="packet-handling" format="default"/>).</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" format="default"/>). The client can
also assign addresses and advertise routes to the proxy for network-to-network
routing.</t>
      <section anchor="scope" numbered="true" toc="default">
        <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" format="default"/>) 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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
          <name>ADDRESS_ASSIGN Capsule</name>
          <t>The ADDRESS_ASSIGN capsule (see <xref target="iana-types" format="default"/> 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 name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
          <name>ADDRESS_REQUEST Capsule</name>
          <t>The ADDRESS_REQUEST capsule (see <xref target="iana-types" format="default"/> 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 name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
          <name>ROUTE_ADVERTISEMENT Capsule</name>
          <t>The ROUTE_ADVERTISEMENT capsule (see <xref target="iana-types" format="default"/> 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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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="packet-handling" numbered="true" toc="default">
      <name>Transmitting IP Packets using HTTP Datagrams</name>
      <t>IP packets are encoded using HTTP Datagrams <xref target="HTTP-DGRAM" format="default"/> with the IP_PACKET
HTTP Datagram Format Type (see value in <xref target="iana-format-type" format="default"/>). When using the
IP_PACKET HTTP Datagram Format Type, full IP packets (from the IP Version field
until the last byte of the IP Payload) are sent unmodified in the "HTTP
Datagram Payload" field of an HTTP Datagram.</t>
      <t>In order to use HTTP Datagrams, the client will first decide whether or not it
will attempt to use HTTP Datagram Contexts and then register its context ID (or
lack thereof) using the corresponding registration capsule, see <xref target="HTTP-DGRAM" format="default"/>.</t>
      <t>When sending a registration capsule using the "Datagram Format Type" set to
IP_PACKET, the "Datagram Format Additional Data" field SHALL be empty. Servers
MUST NOT register contexts using the IP_PACKET HTTP Datagram Format Type.
Clients MUST NOT register more than one context using the IP_PACKET HTTP
Datagram Format Type. Endpoints MUST NOT close contexts using the IP_PACKET
HTTP Datagram Format Type. If an endpoint detects a violation of any of these
requirements, it MUST abort the stream.</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>Extensions to this mechanism MAY define new HTTP Datagram Format Types in order
to use different semantics or encodings for IP payloads. For example, an
extension could define a new HTTP Datagram Format Type which enables
compression of IP header fields.</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" format="default"/>.</t>
      <t>Endpoints MAY implement additional filtering policies on the IP packets they
forward.</t>
    </section>
    <section anchor="examples" numbered="true" toc="default">
      <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" numbered="true" toc="default">
        <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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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

STREAM(44): CAPSULE
Capsule Type = REGISTER_DATAGRAM_CONTEXT
Context ID = 0
Context Extension = {}

                              STREAM(44): HEADERS
                              :status = 200

                              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 name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
        <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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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

STREAM(52): CAPSULE
Capsule Type = REGISTER_DATAGRAM_CONTEXT
Context ID = 0
Context Extension = {}

                              STREAM(52): HEADERS
                              :status = 200

                              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" numbered="true" toc="default">
        <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" format="default"/>. 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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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

STREAM(44): CAPSULE
Capsule Type = REGISTER_DATAGRAM_CONTEXT
Context ID = 0
Context Extension = {}

                              STREAM(44): HEADERS
                              :status = 200

                              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" numbered="true" toc="default">
      <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" format="default"/> 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" format="default"/> to help prevent denial of service
attacks.</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="connect-ip-http-upgrade-token" numbered="true" toc="default">
        <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-format-type" numbered="true" toc="default">
        <name>Datagram Format Type</name>
        <t>This document will request IANA to register IP_PACKET in the "HTTP Datagram
Format Types" registry established by <xref target="HTTP-DGRAM" format="default"/>.</t>
        <table anchor="iana-format-type-table" align="center">
          <name>Registered Datagram Format Type</name>
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Value</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">IP_PACKET</td>
              <td align="left">0xff8b00</td>
              <td align="left">This Document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-types" numbered="true" toc="default">
        <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" format="default"/>:</t>
        <table anchor="iana-capsules-table" align="center">
          <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="9" month="September" year="2021"/>
            <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 needs to
   be separately registered.  This document describes the mechanism for
   HTTP/3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-h3-websockets-00"/>
        </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="25" month="October" year="2021"/>
            <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 when the application protocol running over QUIC is
   HTTP/3.  It associates datagrams with client-initiated bidirectional
   streams and defines an optional additional demultiplexing layer.
   Additionally, this document defines how to convey datagrams over
   prior versions of HTTP.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-h3-datagram-05"/>
        </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="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="25" month="October" year="2021"/>
            <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-06"/>
        </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" toc="default">
      <name>Acknowledgments</name>
      <t>The design of this method was inspired by discussions in the MASQUE working
group around <xref target="PROXY-REQS" format="default"/>. The authors would
like to thank participants in those discussions for their feedback.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAExlpmEAA+1dfXPbuNH/H58CVWZau5Xk11xSt+6dYisXTxPHtZRrOzc3
GUqELNYUqRKUHdfnfvbuG0CQerFzvWvnOvUzT88mCWCx2JffLhZIp9NRZVKm
5ki3zi70RZF/ukuyKz1YzOd5UepJXug3w+FFS0WjUWFu4DP8U7tvWyrOx1k0
g/ZxEU3KTmLKSWcW2b8vTGecZ5kZw7N5Z3dXjaPSXOXF3ZG2ZaxUMi+OdFks
bLm/u/vb3X0VFSY60sPBN+o2L66vinwxP9LveoM/fegrZcsoiz9GaZ7BSHfG
KjuLivLj3xd5aeyRznI1T470t2U+bmsLhBdmYuG3uxn+8p1S0aKc5sWR0h2l
4SfJoNGwqy+iRXpHT3gOw3w2uwueFjlyxsRJmRf0IC+uoiz5R1QmeXake/N5
avRZNu7SSzOLkhQmNcf2X0X4sjvOZ7VBT7t6MJ4mWfSPJBj3NLpJ4vqL+khf
5/kVDPX27Uk4UmylRRfZ/tUVPl0asdfVJ1NTZHfR9TS/sdfhfHup+bTq7VMG
j8bc7qsrer007ruu/uPCTFNzm2RxMOa7pPhb1HxVH7BfJGNr8ywcbobNute+
2VdGPlo18J+NLU2RLuoDR1fZwjbfPWFkate99e3qQ6ssL2bQ/MaAeOlB/13v
fHh2MjjSZ51TWpfOtCzno8R2LHSYldBUqU6no6ORLYtoXCo1nCZWgyItZiYr
dWzsuEhGxupIzwzIbazziZ471QTVm0fja1Nand8YVs+uxi4UfAMakKcaurPJ
LEmjQpe5Pnl/ft4/GXY+nF609WhR6ihN81sL2hdldpaUJXYbFaMEHhR3MICS
Adr6NoHxocXI4Dcp9FmaGPv8GyiuHp5cwLNr40YAZmoYpPYMR+3yhGdJHKdG
qWegMmWRx4sxMv1Hmf6fpybTCwsfKHyws6/FcO0ctKmJa76w0DGZsP6n0mQx
zMYRH1k/dgySpO7vf9H/y7Ajr/ePL1+fvDw83Ht40GCLdP3twfHSak8POrdm
ZHOi9eGhqyoambK97qd1tH2YXxVRbJikSZIRQTDkwBDL9IvuSwVM8cIG3ZME
6MclAKb1ZfBnRXfDaC/i+cPDE8RFVQvy2eICE6pmIMKjVgjPcGrqfBnm18BL
xxp0UiXOfmbGU1BmO8Pptyr30wLKpsl4Co9VlNpcg1cwRcGkAY/daDAVYHMZ
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
bQAA

-->

</rfc>
