summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9298.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9298.txt')
-rw-r--r--doc/rfc/rfc9298.txt819
1 files changed, 819 insertions, 0 deletions
diff --git a/doc/rfc/rfc9298.txt b/doc/rfc/rfc9298.txt
new file mode 100644
index 0000000..c383a43
--- /dev/null
+++ b/doc/rfc/rfc9298.txt
@@ -0,0 +1,819 @@
+
+
+
+
+Internet Engineering Task Force (IETF) D. Schinazi
+Request for Comments: 9298 Google LLC
+Category: Standards Track August 2022
+ISSN: 2070-1721
+
+
+ Proxying UDP in HTTP
+
+Abstract
+
+ This document describes how to proxy UDP in HTTP, similar to how the
+ HTTP CONNECT method allows proxying TCP in HTTP. More specifically,
+ this document defines a protocol that allows an HTTP client to create
+ a tunnel for UDP communications through an HTTP server that acts as a
+ proxy.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9298.
+
+Copyright Notice
+
+ Copyright (c) 2022 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Conventions and Definitions
+ 2. Client Configuration
+ 3. Tunneling UDP over HTTP
+ 3.1. UDP Proxy Handling
+ 3.2. HTTP/1.1 Request
+ 3.3. HTTP/1.1 Response
+ 3.4. HTTP/2 and HTTP/3 Requests
+ 3.5. HTTP/2 and HTTP/3 Responses
+ 4. Context Identifiers
+ 5. HTTP Datagram Payload Format
+ 6. Performance Considerations
+ 6.1. MTU Considerations
+ 6.2. Tunneling of ECN Marks
+ 7. Security Considerations
+ 8. IANA Considerations
+ 8.1. HTTP Upgrade Token
+ 8.2. Well-Known URI
+ 9. References
+ 9.1. Normative References
+ 9.2. Informative References
+ Acknowledgments
+ Author's Address
+
+1. Introduction
+
+ While HTTP provides the CONNECT method (see Section 9.3.6 of [HTTP])
+ for creating a TCP [TCP] tunnel to a proxy, it lacked a method for
+ doing so for UDP [UDP] traffic prior to this specification.
+
+ This document describes a protocol for tunneling UDP to a server
+ acting as a UDP-specific proxy over HTTP. UDP tunnels are commonly
+ used to create an end-to-end virtual connection, which can then be
+ secured using QUIC [QUIC] or another protocol running over UDP.
+ Unlike the HTTP CONNECT method, the UDP proxy itself is identified
+ with an absolute URL containing the traffic's destination. Clients
+ generate those URLs using a URI Template [TEMPLATE], as described in
+ Section 2.
+
+ This protocol supports all existing versions of HTTP by using HTTP
+ Datagrams [HTTP-DGRAM]. When using HTTP/2 [HTTP/2] or HTTP/3
+ [HTTP/3], it uses HTTP Extended CONNECT as described in
+ [EXT-CONNECT2] and [EXT-CONNECT3]. When using HTTP/1.x [HTTP/1.1],
+ it uses HTTP Upgrade as defined in Section 7.8 of [HTTP].
+
+1.1. Conventions and Definitions
+
+ 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 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ In this document, we use the term "UDP proxy" to refer to the HTTP
+ server that acts upon the client's UDP tunneling request to open a
+ UDP socket to a target server and that generates the response to this
+ request. If there are HTTP intermediaries (as defined in Section 3.7
+ of [HTTP]) between the client and the UDP proxy, those are referred
+ to as "intermediaries" in this document.
+
+ Note that, when the HTTP version in use does not support multiplexing
+ streams (such as HTTP/1.1), any reference to "stream" in this
+ document represents the entire connection.
+
+2. Client Configuration
+
+ HTTP clients are configured to use a UDP proxy with a URI Template
+ [TEMPLATE] that has the variables "target_host" and "target_port".
+ Examples are shown below:
+
+ https://example.org/.well-known/masque/udp/{target_host}/{target_port}/
+ https://proxy.example.org:4443/masque?h={target_host}&p={target_port}
+ https://proxy.example.org:4443/masque{?target_host,target_port}
+
+ Figure 1: URI Template Examples
+
+ The following requirements apply to the URI Template:
+
+ * The URI Template MUST be a level 3 template or lower.
+
+ * The URI Template MUST be in absolute form and MUST include non-
+ empty scheme, authority, and path components.
+
+ * The path component of the URI Template MUST start with a slash
+ ("/").
+
+ * All template variables MUST be within the path or query components
+ of the URI.
+
+ * The URI Template MUST contain the two variables "target_host" and
+ "target_port" and MAY contain other variables.
+
+ * The URI Template MUST NOT contain any non-ASCII Unicode characters
+ and MUST only contain ASCII characters in the range 0x21-0x7E
+ inclusive (note that percent-encoding is allowed; see Section 2.1
+ of [URI]).
+
+ * The URI Template MUST NOT use Reserved Expansion ("+" operator),
+ Fragment Expansion ("#" operator), Label Expansion with Dot-
+ Prefix, Path Segment Expansion with Slash-Prefix, nor Path-Style
+ Parameter Expansion with Semicolon-Prefix.
+
+ Clients SHOULD validate the requirements above; however, clients MAY
+ use a general-purpose URI Template implementation that lacks this
+ specific validation. If a client detects that any of the
+ requirements above are not met by a URI Template, the client MUST
+ reject its configuration and abort the request without sending it to
+ the UDP proxy.
+
+ The original HTTP CONNECT method allowed for the conveyance of the
+ target host and port, but not the scheme, proxy authority, path, or
+ query. Thus, clients with proxy configuration interfaces that only
+ allow the user to configure the proxy host and the proxy port exist.
+ Client implementations of this specification that are constrained by
+ such limitations MAY attempt to access UDP proxying capabilities
+ using the default template, which is defined as
+ "https://$PROXY_HOST:$PROXY_PORT/.well-known/masque/
+ udp/{target_host}/{target_port}/", where $PROXY_HOST and $PROXY_PORT
+ are the configured host and port of the UDP proxy, respectively. UDP
+ proxy deployments SHOULD offer service at this location if they need
+ to interoperate with such clients.
+
+3. Tunneling UDP over HTTP
+
+ To allow negotiation of a tunnel for UDP over HTTP, this document
+ defines the "connect-udp" HTTP upgrade token. The resulting UDP
+ tunnels use the Capsule Protocol (see Section 3.2 of [HTTP-DGRAM])
+ with HTTP Datagrams in the format defined in Section 5.
+
+ To initiate a UDP tunnel associated with a single HTTP stream, a
+ client issues a request containing the "connect-udp" upgrade token.
+ The target of the tunnel is indicated by the client to the UDP proxy
+ via the "target_host" and "target_port" variables of the URI
+ Template; see Section 2.
+
+ "target_host" supports using DNS names, IPv6 literals and IPv4
+ literals. Note that IPv6 scoped addressing zone identifiers are not
+ supported. Using the terms IPv6address, IPv4address, reg-name, and
+ port from [URI], the "target_host" and "target_port" variables MUST
+ adhere to the format in Figure 2, using notation from [ABNF].
+ Additionally:
+
+ * both the "target_host" and "target_port" variables MUST NOT be
+ empty.
+
+ * if "target_host" contains an IPv6 literal, the colons (":") MUST
+ be percent-encoded. For example, if the target host is
+ "2001:db8::42", it will be encoded in the URI as
+ "2001%3Adb8%3A%3A42".
+
+ * "target_port" MUST represent an integer between 1 and 65535
+ inclusive.
+
+ target_host = IPv6address / IPv4address / reg-name
+ target_port = port
+
+ Figure 2: URI Template Variable Format
+
+ When sending its UDP proxying request, the client SHALL perform URI
+ Template expansion to determine the path and query of its request.
+
+ If the request is successful, the UDP proxy commits to converting
+ received HTTP Datagrams into UDP packets, and vice versa, until the
+ tunnel is closed.
+
+ By virtue of the definition of the Capsule Protocol (see Section 3.2
+ of [HTTP-DGRAM]), UDP proxying requests do not carry any message
+ content. Similarly, successful UDP proxying responses also do not
+ carry any message content.
+
+3.1. UDP Proxy Handling
+
+ Upon receiving a UDP proxying request:
+
+ * if the recipient is configured to use another HTTP proxy, it will
+ act as an intermediary by forwarding the request to another HTTP
+ server. Note that such intermediaries may need to re-encode the
+ request if they forward it using a version of HTTP that is
+ different from the one used to receive it, as the request encoding
+ differs by version (see below).
+
+ * otherwise, the recipient will act as a UDP proxy. It extracts the
+ "target_host" and "target_port" variables from the URI it has
+ reconstructed from the request headers, decodes their percent-
+ encoding, and establishes a tunnel by directly opening a UDP
+ socket to the requested target.
+
+ Unlike TCP, UDP is connectionless. The UDP proxy that opens the UDP
+ socket has no way of knowing whether the destination is reachable.
+ Therefore, it needs to respond to the request without waiting for a
+ packet from the target. However, if the "target_host" is a DNS name,
+ the UDP proxy MUST perform DNS resolution before replying to the HTTP
+ request. If errors occur during this process, the UDP proxy MUST
+ reject the request and SHOULD send details using an appropriate
+ Proxy-Status header field [PROXY-STATUS]. For example, if DNS
+ resolution returns an error, the proxy can use the dns_error Proxy
+ Error Type from Section 2.3.2 of [PROXY-STATUS].
+
+ UDP proxies can use connected UDP sockets if their operating system
+ supports them, as that allows the UDP proxy to rely on the kernel to
+ only send it UDP packets that match the correct 5-tuple. If the UDP
+ proxy uses a non-connected socket, it MUST validate the IP source
+ address and UDP source port on received packets to ensure they match
+ the client's request. Packets that do not match MUST be discarded by
+ the UDP proxy.
+
+ The lifetime of the socket is tied to the request stream. The UDP
+ proxy MUST keep the socket open while the request stream is open. If
+ a UDP proxy is notified by its operating system that its socket is no
+ longer usable, it MUST close the request stream. For example, this
+ can happen when an ICMP Destination Unreachable message is received;
+ see Section 3.1 of [ICMP6]. UDP proxies MAY choose to close sockets
+ due to a period of inactivity, but they MUST close the request stream
+ when closing the socket. UDP proxies that close sockets after a
+ period of inactivity SHOULD NOT use a period lower than two minutes;
+ see Section 4.3 of [BEHAVE].
+
+ A successful response (as defined in Sections 3.3 and 3.5) indicates
+ that the UDP proxy has opened a socket to the requested target and is
+ willing to proxy UDP payloads. Any response other than a successful
+ response indicates that the request has failed; thus, the client MUST
+ abort the request.
+
+ UDP proxies MUST NOT introduce fragmentation at the IP layer when
+ forwarding HTTP Datagrams onto a UDP socket; overly large datagrams
+ are silently dropped. In IPv4, the Don't Fragment (DF) bit MUST be
+ set, if possible, to prevent fragmentation on the path. Future
+ extensions MAY remove these requirements.
+
+ Implementers of UDP proxies will benefit from reading the guidance in
+ [UDP-USAGE].
+
+3.2. HTTP/1.1 Request
+
+ When using HTTP/1.1 [HTTP/1.1], a UDP proxying request will meet the
+ following requirements:
+
+ * the method SHALL be "GET".
+
+ * the request SHALL include a single Host header field containing
+ the origin of the UDP proxy.
+
+ * the request SHALL include a Connection header field with value
+ "Upgrade" (note that this requirement is case-insensitive as per
+ Section 7.6.1 of [HTTP]).
+
+ * the request SHALL include an Upgrade header field with value
+ "connect-udp".
+
+ A UDP proxying request that does not conform to these restrictions is
+ malformed. The recipient of such a malformed request MUST respond
+ with an error and SHOULD use the 400 (Bad Request) status code.
+
+ For example, if the client is configured with URI Template
+ "https://example.org/.well-known/masque/
+ udp/{target_host}/{target_port}/" and wishes to open a UDP proxying
+ tunnel to target 192.0.2.6:443, it could send the following request:
+
+ GET https://example.org/.well-known/masque/udp/192.0.2.6/443/ HTTP/1.1
+ Host: example.org
+ Connection: Upgrade
+ Upgrade: connect-udp
+ Capsule-Protocol: ?1
+
+ Figure 3: Example HTTP/1.1 Request
+
+ In HTTP/1.1, this protocol uses the GET method to mimic the design of
+ the WebSocket Protocol [WEBSOCKET].
+
+3.3. HTTP/1.1 Response
+
+ The UDP proxy SHALL indicate a successful response by replying with
+ the following requirements:
+
+ * the HTTP status code on the response SHALL be 101 (Switching
+ Protocols).
+
+ * the response SHALL include a Connection header field with value
+ "Upgrade" (note that this requirement is case-insensitive as per
+ Section 7.6.1 of [HTTP]).
+
+ * the response SHALL include a single Upgrade header field with
+ value "connect-udp".
+
+ * the response SHALL meet the requirements of HTTP responses that
+ start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM].
+
+ If any of these requirements are not met, the client MUST treat this
+ proxying attempt as failed and abort the connection.
+
+ For example, the UDP proxy could respond with:
+
+ HTTP/1.1 101 Switching Protocols
+ Connection: Upgrade
+ Upgrade: connect-udp
+ Capsule-Protocol: ?1
+
+ Figure 4: Example HTTP/1.1 Response
+
+3.4. HTTP/2 and HTTP/3 Requests
+
+ When using HTTP/2 [HTTP/2] or HTTP/3 [HTTP/3], UDP proxying requests
+ use HTTP Extended CONNECT. This requires that servers send an HTTP
+ Setting as specified in [EXT-CONNECT2] and [EXT-CONNECT3] and that
+ requests use HTTP pseudo-header fields with the following
+ requirements:
+
+ * The :method pseudo-header field SHALL be "CONNECT".
+
+ * The :protocol pseudo-header field SHALL be "connect-udp".
+
+ * The :authority pseudo-header field SHALL contain the authority of
+ the UDP proxy.
+
+ * The :path and :scheme pseudo-header fields SHALL NOT be empty.
+ Their values SHALL contain the scheme and path from the URI
+ Template after the URI Template expansion process has been
+ completed.
+
+ A UDP proxying request that does not conform to these restrictions is
+ malformed (see Section 8.1.1 of [HTTP/2] and Section 4.1.2 of
+ [HTTP/3]).
+
+ For example, if the client is configured with URI Template
+ "https://example.org/.well-known/masque/
+ udp/{target_host}/{target_port}/" and wishes to open a UDP proxying
+ tunnel to target 192.0.2.6:443, it could send the following request:
+
+ HEADERS
+ :method = CONNECT
+ :protocol = connect-udp
+ :scheme = https
+ :path = /.well-known/masque/udp/192.0.2.6/443/
+ :authority = example.org
+ capsule-protocol = ?1
+
+ Figure 5: Example HTTP/2 Request
+
+3.5. HTTP/2 and HTTP/3 Responses
+
+ The UDP proxy SHALL indicate a successful response by replying with
+ the following requirements:
+
+ * the HTTP status code on the response SHALL be in the 2xx
+ (Successful) range.
+
+ * the response SHALL meet the requirements of HTTP responses that
+ start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM].
+
+ If any of these requirements are not met, the client MUST treat this
+ proxying attempt as failed and abort the request.
+
+ For example, the UDP proxy could respond with:
+
+ HEADERS
+ :status = 200
+ capsule-protocol = ?1
+
+ Figure 6: Example HTTP/2 Response
+
+4. Context Identifiers
+
+ The mechanism for proxying UDP in HTTP defined in this document
+ allows future extensions to exchange HTTP Datagrams that carry
+ different semantics from UDP payloads. Some of these extensions can
+ augment UDP payloads with additional data, while others can exchange
+ data that is completely separate from UDP payloads. In order to
+ accomplish this, all HTTP Datagrams associated with UDP Proxying
+ request streams start with a Context ID field; see Section 5.
+
+ Context IDs are 62-bit integers (0 to 2^62-1). Context IDs are
+ encoded as variable-length integers; see Section 16 of [QUIC]. The
+ Context ID value of 0 is reserved for UDP payloads, while non-zero
+ values are dynamically allocated. Non-zero even-numbered Context IDs
+ are client-allocated, and odd-numbered Context IDs are proxy-
+ 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 allocated 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. The Context
+ ID allocation restrictions to the use of even-numbered and odd-
+ numbered Context IDs exist in order to avoid the need for
+ synchronization between endpoints. However, once a Context ID has
+ been allocated, those restrictions do not apply to the use of the
+ Context ID; it can be used by any client or UDP proxy, independent of
+ which endpoint initially allocated it.
+
+ 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. Future extensions MAY use HTTP
+ header fields or capsules to register Context IDs. Depending on the
+ method being used, it is possible for datagrams to be received with
+ Context IDs that have not yet been registered. For instance, this
+ can be due to reordering of the packet containing the datagram and
+ the packet containing the registration message during transmission.
+
+5. HTTP Datagram Payload Format
+
+ When HTTP Datagrams (see Section 2 of [HTTP-DGRAM]) are associated
+ with UDP Proxying request streams, the HTTP Datagram Payload field
+ has the format defined in Figure 7, using notation from Section 1.3
+ of [QUIC]. Note that when HTTP Datagrams are encoded using QUIC
+ DATAGRAM frames [QUIC-DGRAM], the Context ID field defined below
+ directly follows the Quarter Stream ID field, which is at the start
+ of the QUIC DATAGRAM frame payload; see Section 2.1 of [HTTP-DGRAM].
+
+ UDP Proxying HTTP Datagram Payload {
+ Context ID (i),
+ UDP Proxying Payload (..),
+ }
+
+ Figure 7: UDP Proxying HTTP Datagram Format
+
+ Context ID: A variable-length integer (see Section 16 of [QUIC])
+ that contains the value of the Context ID. If an HTTP/3 Datagram
+ that 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.
+ UDP Proxying Payload: The payload of the datagram, whose semantics
+ depend on the value of the previous field. Note that this field
+ can be empty.
+
+ UDP packets are encoded using HTTP Datagrams with the Context ID
+ field set to zero. When the Context ID field is set to zero, the UDP
+ Proxying Payload field contains the unmodified payload of a UDP
+ packet (referred to as data octets in [UDP]).
+
+ By virtue of the definition of the UDP header [UDP], it is not
+ possible to encode UDP payloads longer than 65527 bytes. Therefore,
+ endpoints MUST NOT send HTTP Datagrams with a UDP Proxying Payload
+ field longer than 65527 using Context ID zero. An endpoint that
+ receives an HTTP Datagram using Context ID zero whose UDP Proxying
+ Payload field is longer than 65527 MUST abort the corresponding
+ stream. If a UDP proxy knows it can only send out UDP packets of a
+ certain length due to its underlying link MTU, it has no choice but
+ to discard incoming HTTP Datagrams using Context ID zero whose UDP
+ Proxying Payload field is longer than that limit. If the discarded
+ HTTP Datagram was transported by a DATAGRAM capsule, the receiver
+ SHOULD discard that capsule without buffering the capsule contents.
+
+ If a UDP proxy receives an HTTP Datagram before it has received the
+ corresponding request, it SHALL either drop that HTTP Datagram
+ silently or buffer it temporarily (on the order of a round trip)
+ while awaiting the corresponding request.
+
+ Note that buffering datagrams (either because the request was not yet
+ received or because the Context ID is not yet known) consumes
+ resources. Receivers that buffer datagrams SHOULD apply buffering
+ limits in order to reduce the risk of resource exhaustion occurring.
+ For example, receivers can limit the total number of buffered
+ datagrams or the cumulative size of buffered datagrams on a per-
+ stream, per-context, or per-connection basis.
+
+ A client MAY optimistically start sending UDP packets in HTTP
+ Datagrams before receiving the response to its UDP proxying request.
+ However, implementers should note that such proxied packets may not
+ be processed by the UDP proxy if it responds to the request with a
+ failure or if the proxied packets are received by the UDP proxy
+ before the request and the UDP proxy chooses to not buffer them.
+
+6. Performance Considerations
+
+ Bursty traffic can often lead to temporally correlated packet losses;
+ in turn, this can lead to suboptimal responses from congestion
+ controllers in protocols running over UDP. To avoid this, UDP
+ proxies SHOULD strive to avoid increasing burstiness of UDP traffic;
+ they SHOULD NOT queue packets in order to increase batching.
+
+ When the protocol running over UDP that is being proxied uses
+ congestion control (e.g., [QUIC]), the proxied traffic will incur at
+ least two nested congestion controllers. The underlying HTTP
+ connection MUST NOT disable congestion control unless it has an out-
+ of-band way of knowing with absolute certainty that the inner traffic
+ is congestion-controlled.
+
+ If a client or UDP proxy with a connection containing a UDP Proxying
+ request stream disables congestion control, it MUST NOT signal
+ Explicit Congestion Notification (ECN) [ECN] support on that
+ connection. That is, it MUST mark all IP headers with the Not-ECT
+ codepoint. It MAY continue to report ECN feedback via QUIC ACK_ECN
+ frames or the TCP ECE bit, as the peer may not have disabled
+ congestion control.
+
+ When the protocol running over UDP that is being proxied uses loss
+ recovery (e.g., [QUIC]), and the underlying HTTP connection runs over
+ TCP, the proxied traffic will incur at least two nested loss recovery
+ mechanisms. This can reduce performance as both can sometimes
+ independently retransmit the same data. To avoid this, UDP proxying
+ SHOULD be performed over HTTP/3 to allow leveraging the QUIC DATAGRAM
+ frame.
+
+6.1. MTU Considerations
+
+ When using HTTP/3 with the QUIC Datagram extension [QUIC-DGRAM], UDP
+ payloads are transmitted in QUIC DATAGRAM frames. Since those cannot
+ be fragmented, they can only carry payloads up to a given length
+ determined by the QUIC connection configuration and the Path MTU
+ (PMTU). If a UDP proxy is using QUIC DATAGRAM frames and it receives
+ a UDP payload from the target that will not fit inside a QUIC
+ DATAGRAM frame, the UDP proxy SHOULD NOT send the UDP payload in a
+ DATAGRAM capsule, as that defeats the end-to-end unreliability
+ characteristic that methods such as Datagram Packetization Layer PMTU
+ Discovery (DPLPMTUD) depend on [DPLPMTUD]. In this scenario, the UDP
+ proxy SHOULD drop the UDP payload and send an ICMP Packet Too Big
+ message to the target; see Section 3.2 of [ICMP6].
+
+6.2. Tunneling of ECN Marks
+
+ UDP proxying does not create an IP-in-IP tunnel, so the guidance in
+ [ECN-TUNNEL] about transferring ECN marks between inner and outer IP
+ headers does not apply. There is no inner IP header in UDP proxying
+ tunnels.
+
+ In this specification, note that UDP proxying clients do not have the
+ ability to control the ECN codepoints on UDP packets the UDP proxy
+ sends to the target, nor can UDP proxies communicate the markings of
+ each UDP packet from target to UDP proxy.
+
+ A UDP proxy MUST ignore ECN bits in the IP header of UDP packets
+ received from the target, and it MUST set the ECN bits to Not-ECT on
+ UDP packets it sends to the target. These do not relate to the ECN
+ markings of packets sent between client and UDP proxy in any way.
+
+7. Security Considerations
+
+ There are significant risks in allowing arbitrary clients to
+ establish a tunnel to arbitrary targets, as that could allow bad
+ actors to send traffic and have it attributed to the UDP proxy. HTTP
+ servers that support UDP proxying ought to restrict its use to
+ authenticated users.
+
+ There exist software and network deployments that perform access
+ control checks based on the source IP address of incoming requests.
+ For example, some software allows unauthenticated configuration
+ changes if they originated from 127.0.0.1. Such software could be
+ running on the same host as the UDP proxy or in the same broadcast
+ domain. Proxied UDP traffic would then be received with a source IP
+ address belonging to the UDP proxy. If this source address is used
+ for access control, UDP proxying clients could use the UDP proxy to
+ escalate their access privileges beyond those they might otherwise
+ have. This could lead to unauthorized access by UDP proxying clients
+ unless the UDP proxy disallows UDP proxying requests to vulnerable
+ targets, such as the UDP proxy's own addresses and localhost, link-
+ local, multicast, and broadcast addresses. UDP proxies can use the
+ destination_ip_prohibited Proxy Error Type from Section 2.3.5 of
+ [PROXY-STATUS] when rejecting such requests.
+
+ UDP proxies share many similarities with TCP CONNECT proxies when
+ considering them as infrastructure for abuse to enable denial-of-
+ service (DoS) attacks. Both can obfuscate the attacker's source
+ address from the attack target. In the case of a stateless
+ volumetric attack (e.g., a TCP SYN flood or a UDP flood), both types
+ of proxies pass the traffic to the target host. With stateful
+ volumetric attacks (e.g., HTTP flooding) being sent over a TCP
+ CONNECT proxy, the proxy will only send data if the target has
+ indicated its willingness to accept data by responding with a TCP
+ SYN-ACK. Once the path to the target is flooded, the TCP CONNECT
+ proxy will no longer receive replies from the target and will stop
+ sending data. Since UDP does not establish shared state between the
+ UDP proxy and the target, the UDP proxy could continue sending data
+ to the target in such a situation. While a UDP proxy could
+ potentially limit the number of UDP packets it is willing to forward
+ until it has observed a response from the target, that provides
+ limited protection against DoS attacks when attacks target open UDP
+ ports where the protocol running over UDP would respond and that
+ would be interpreted as willingness to accept UDP by the UDP proxy.
+ Such a packet limit could also cause issues for valid traffic.
+
+ The security considerations described in Section 4 of [HTTP-DGRAM]
+ also apply here. Since it is possible to tunnel IP packets over UDP,
+ the guidance in [TUNNEL-SECURITY] can apply.
+
+8. IANA Considerations
+
+8.1. HTTP Upgrade Token
+
+ IANA has registered "connect-udp" in the "HTTP Upgrade Tokens"
+ registry maintained at <https://www.iana.org/assignments/http-
+ upgrade-tokens>.
+
+ Value: connect-udp
+ Description: Proxying of UDP Payloads
+ Expected Version Tokens: None
+ Reference: RFC 9298
+
+8.2. Well-Known URI
+
+ IANA has registered "masque" in the "Well-Known URIs" registry
+ maintained at <https://www.iana.org/assignments/well-known-uris>.
+
+ URI Suffix: masque
+ Change Controller: IETF
+ Reference: RFC 9298
+ Status: permanent
+ Related Information: Includes all resources identified with the path
+ prefix "/.well-known/masque/udp/"
+
+9. References
+
+9.1. Normative References
+
+ [ABNF] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 2234, DOI 10.17487/RFC2234,
+ November 1997, <https://www.rfc-editor.org/info/rfc2234>.
+
+ [ECN] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition
+ of Explicit Congestion Notification (ECN) to IP",
+ RFC 3168, DOI 10.17487/RFC3168, September 2001,
+ <https://www.rfc-editor.org/info/rfc3168>.
+
+ [EXT-CONNECT2]
+ McManus, P., "Bootstrapping WebSockets with HTTP/2",
+ RFC 8441, DOI 10.17487/RFC8441, September 2018,
+ <https://www.rfc-editor.org/info/rfc8441>.
+
+ [EXT-CONNECT3]
+ Hamilton, R., "Bootstrapping WebSockets with HTTP/3",
+ RFC 9220, DOI 10.17487/RFC9220, June 2022,
+ <https://www.rfc-editor.org/info/rfc9220>.
+
+ [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Semantics", STD 97, RFC 9110,
+ DOI 10.17487/RFC9110, June 2022,
+ <https://www.rfc-editor.org/info/rfc9110>.
+
+ [HTTP-DGRAM]
+ Schinazi, D. and L. Pardue, "HTTP Datagrams and the
+ Capsule Protocol", RFC 9297, DOI 10.17487/RFC9297, August
+ 2022, <https://www.rfc-editor.org/info/rfc9297>.
+
+ [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112,
+ June 2022, <https://www.rfc-editor.org/info/rfc9112>.
+
+ [HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113,
+ DOI 10.17487/RFC9113, June 2022,
+ <https://www.rfc-editor.org/info/rfc9113>.
+
+ [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114,
+ June 2022, <https://www.rfc-editor.org/info/rfc9114>.
+
+ [PROXY-STATUS]
+ Nottingham, M. and P. Sikora, "The Proxy-Status HTTP
+ Response Header Field", RFC 9209, DOI 10.17487/RFC9209,
+ June 2022, <https://www.rfc-editor.org/info/rfc9209>.
+
+ [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
+ Multiplexed and Secure Transport", RFC 9000,
+ DOI 10.17487/RFC9000, May 2021,
+ <https://www.rfc-editor.org/info/rfc9000>.
+
+ [QUIC-DGRAM]
+ Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable
+ Datagram Extension to QUIC", RFC 9221,
+ DOI 10.17487/RFC9221, March 2022,
+ <https://www.rfc-editor.org/info/rfc9221>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [TCP] Eddy, W., Ed., "Transmission Control Protocol (TCP)",
+ STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022,
+ <https://www.rfc-editor.org/info/rfc9293>.
+
+ [TEMPLATE] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M.,
+ and D. Orchard, "URI Template", RFC 6570,
+ DOI 10.17487/RFC6570, March 2012,
+ <https://www.rfc-editor.org/info/rfc6570>.
+
+ [UDP] Postel, J., "User Datagram Protocol", STD 6, RFC 768,
+ DOI 10.17487/RFC0768, August 1980,
+ <https://www.rfc-editor.org/info/rfc768>.
+
+ [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, DOI 10.17487/RFC3986, January 2005,
+ <https://www.rfc-editor.org/info/rfc3986>.
+
+9.2. Informative References
+
+ [BEHAVE] Audet, F., Ed. and C. Jennings, "Network Address
+ Translation (NAT) Behavioral Requirements for Unicast
+ UDP", BCP 127, RFC 4787, DOI 10.17487/RFC4787, January
+ 2007, <https://www.rfc-editor.org/info/rfc4787>.
+
+ [DPLPMTUD] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T.
+ Völker, "Packetization Layer Path MTU Discovery for
+ Datagram Transports", RFC 8899, DOI 10.17487/RFC8899,
+ September 2020, <https://www.rfc-editor.org/info/rfc8899>.
+
+ [ECN-TUNNEL]
+ Briscoe, B., "Tunnelling of Explicit Congestion
+ Notification", RFC 6040, DOI 10.17487/RFC6040, November
+ 2010, <https://www.rfc-editor.org/info/rfc6040>.
+
+ [HELIUM] Schwartz, B. M., "Hybrid Encapsulation Layer for IP and
+ UDP Messages (HELIUM)", Work in Progress, Internet-Draft,
+ draft-schwartz-httpbis-helium-00, 25 June 2018,
+ <https://datatracker.ietf.org/doc/html/draft-schwartz-
+ httpbis-helium-00>.
+
+ [HiNT] Pardue, L., "HTTP-initiated Network Tunnelling (HiNT)",
+ Work in Progress, Internet-Draft, draft-pardue-httpbis-
+ http-network-tunnelling-00, 2 July 2018,
+ <https://datatracker.ietf.org/doc/html/draft-pardue-
+ httpbis-http-network-tunnelling-00>.
+
+ [ICMP6] Conta, A., Deering, S., and M. Gupta, Ed., "Internet
+ Control Message Protocol (ICMPv6) for the Internet
+ Protocol Version 6 (IPv6) Specification", STD 89,
+ RFC 4443, DOI 10.17487/RFC4443, March 2006,
+ <https://www.rfc-editor.org/info/rfc4443>.
+
+ [MASQUE-ORIGINAL]
+ Schinazi, D., "The MASQUE Protocol", Work in Progress,
+ Internet-Draft, draft-schinazi-masque-00, 28 February
+ 2019, <https://datatracker.ietf.org/doc/html/draft-
+ schinazi-masque-00>.
+
+ [TUNNEL-SECURITY]
+ Krishnan, S., Thaler, D., and J. Hoagland, "Security
+ Concerns with IP Tunneling", RFC 6169,
+ DOI 10.17487/RFC6169, April 2011,
+ <https://www.rfc-editor.org/info/rfc6169>.
+
+ [UDP-USAGE]
+ Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage
+ Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085,
+ March 2017, <https://www.rfc-editor.org/info/rfc8085>.
+
+ [WEBSOCKET]
+ Fette, I. and A. Melnikov, "The WebSocket Protocol",
+ RFC 6455, DOI 10.17487/RFC6455, December 2011,
+ <https://www.rfc-editor.org/info/rfc6455>.
+
+Acknowledgments
+
+ This document is a product of the MASQUE Working Group, and the
+ author thanks all MASQUE enthusiasts for their contributions. This
+ proposal was inspired directly or indirectly by prior work from many
+ people, in particular [HELIUM] by Ben Schwartz, [HiNT] by Lucas
+ Pardue, and the original MASQUE Protocol [MASQUE-ORIGINAL] by the
+ author of this document.
+
+ The author would like to thank Eric Rescorla for suggesting the use
+ of an HTTP method to proxy UDP. The author is indebted to Mark
+ Nottingham and Lucas Pardue for the many improvements they
+ contributed to this document. The extensibility design in this
+ document came out of the HTTP Datagrams Design Team, whose members
+ were Alan Frindell, Alex Chernyakhovsky, Ben Schwartz, Eric Rescorla,
+ Lucas Pardue, Marcus Ihlar, Martin Thomson, Mike Bishop, Tommy Pauly,
+ Victor Vasiliev, and the author of this document.
+
+Author's Address
+
+ David Schinazi
+ Google LLC
+ 1600 Amphitheatre Parkway
+ Mountain View, CA 94043
+ United States of America
+ Email: dschinazi.ietf@gmail.com