Template-Driven HTTP CONNECT Proxying for TCP
draft-ietf-httpbis-connect-tcp-17
| Document | Type | Active Internet-Draft (httpbis WG) | |
|---|---|---|---|
| Author | Benjamin M. Schwartz | ||
| Last updated | 2026-10-30 (Latest revision 2026-10-29) | ||
| Replaces | draft-schwartz-httpbis-connect-tcp | ||
| RFC stream | Internet Engineering Task Force (IETF) | ||
| Intended RFC status | Proposed Standard | ||
| Formats | |||
| Reviews |
ARTART IETF Last Call review
(of
-14)
by Thomas Fossati
Ready w/issues
GENART IETF Last Call Review due 2026-10-01
Incomplete
|
||
| Additional resources | Mailing list discussion | ||
| Stream | WG state | Submitted to IESG for Publication | |
| Document shepherd | Tommy Pauly | ||
| Shepherd write-up | Show Last changed 2026-08-17 | ||
| IESG | IESG state | RFC Ed Queue | |
| Action Holders |
(None)
|
||
| Consensus boilerplate | Yes | ||
| Telechat date | (None) | ||
| Responsible AD | Mike Bishop | ||
| Send notices to | tpauly@apple.com | ||
| IANA | IANA review state | Version Changed - Review Needed | |
| IANA expert review state | Expert Reviews OK | ||
| IANA expert review comments | The MASQUE URI Suffixes registration has been approved. | ||
| RFC Editor | RFC Editor status | blocked: Author Input Required | |
| Details |
draft-ietf-httpbis-connect-tcp-17
httpbis B. M. Schwartz
Internet-Draft Meta Platforms, Inc.
Intended status: Standards Track 29 October 2026
Expires: 2 May 2027
Template-Driven HTTP CONNECT Proxying for TCP
draft-ietf-httpbis-connect-tcp-17
Abstract
TCP tunneling using HTTP CONNECT has long been part of the core HTTP
specification. However, this tunneling functionality has several
important deficiencies due to the lack of a well-defined HTTP origin
or path. This specification defines an alternative HTTP proxy
service configuration for TCP connections. This configuration is
described by a URI Template, similar to the CONNECT-UDP and CONNECT-
IP protocols.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on 2 May 2027.
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the
document authors. All rights reserved.
Schwartz Expires 2 May 2027 [Page 1]
Internet-Draft Templated CONNECT-TCP October 2026
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 . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. History . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Problems . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Overview . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Conventions and Definitions . . . . . . . . . . . . . . . . . 4
3. Specification . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1. Payload Transport . . . . . . . . . . . . . . . . . . . . 5
3.2. In HTTP/1.1 . . . . . . . . . . . . . . . . . . . . . . . 6
3.3. In HTTP/2 and HTTP/3 . . . . . . . . . . . . . . . . . . 7
3.4. Use of Other Relevant Headers . . . . . . . . . . . . . . 8
3.4.1. Origin-scoped Headers . . . . . . . . . . . . . . . . 8
3.4.2. Authentication Headers . . . . . . . . . . . . . . . 8
3.4.3. Caching Headers . . . . . . . . . . . . . . . . . . . 9
3.5. Closing Connections . . . . . . . . . . . . . . . . . . . 9
3.5.1. Handling Invalid Data . . . . . . . . . . . . . . . . 11
4. Additional Connection Setup Behaviors . . . . . . . . . . . . 12
4.1. Latency Optimizations . . . . . . . . . . . . . . . . . . 12
4.2. Indicating Failure . . . . . . . . . . . . . . . . . . . 12
4.3. Conveying Metadata . . . . . . . . . . . . . . . . . . . 13
5. Applicability . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1. Servers . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2. Clients . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.3. Gateways . . . . . . . . . . . . . . . . . . . . . . . . 15
6. Security Considerations . . . . . . . . . . . . . . . . . . . 15
6.1. Resource Exhaustion attacks . . . . . . . . . . . . . . . 16
6.2. Client Authentication . . . . . . . . . . . . . . . . . . 17
6.3. TLS Early Data . . . . . . . . . . . . . . . . . . . . . 17
7. Operational Considerations . . . . . . . . . . . . . . . . . 17
7.1. Avoiding HTTP/1.1 . . . . . . . . . . . . . . . . . . . . 17
7.2. Timeouts . . . . . . . . . . . . . . . . . . . . . . . . 18
7.3. Scope of Packet-Level Metadata . . . . . . . . . . . . . 19
7.4. IP address sharing . . . . . . . . . . . . . . . . . . . 19
7.5. Diagnostics and Monitoring . . . . . . . . . . . . . . . 19
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 20
8.1. New Upgrade Token . . . . . . . . . . . . . . . . . . . . 20
8.1.1. Interop testing . . . . . . . . . . . . . . . . . . . 20
8.2. New MASQUE Default Template . . . . . . . . . . . . . . . 20
Schwartz Expires 2 May 2027 [Page 2]
Internet-Draft Templated CONNECT-TCP October 2026
8.3. New Capsule Type . . . . . . . . . . . . . . . . . . . . 21
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 21
9.1. Normative References . . . . . . . . . . . . . . . . . . 21
9.2. Informative References . . . . . . . . . . . . . . . . . 23
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 25
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 26
1. Introduction
1.1. History
HTTP has used the CONNECT method for tunneling TCP connections since
HTTP/1.1. When using CONNECT, the request target specifies a host
and port number, and the proxy forwards TCP payloads between the
client and the target destination ([HTTP], Section 9.3.6). Prior to
this specification, this was the only mechanism defined for proxying
TCP over HTTP. In this specification, this arrangement is referred
to as a "classic HTTP CONNECT proxy".
HTTP/3 [HTTP/3] uses a UDP transport, so it cannot be forwarded using
the pre-existing CONNECT mechanism. To enable forward proxying of
HTTP/3, the MASQUE effort has defined proxy mechanisms that are
capable of tunneling UDP datagrams [CONNECT-UDP], and more generally
IP datagrams [CONNECT-IP]. The destination host and port number (if
applicable) are encoded into the HTTP resource path, and end-to-end
datagrams are wrapped into HTTP Datagrams [CAPSULE] on the client-
proxy path.
1.2. Problems
HTTP clients can be configured to use proxies by selecting a proxy
hostname, a port number, and whether to use a security protocol.
However, classic HTTP CONNECT requests using the proxy do not carry
this configuration information. Instead, they only indicate the
hostname and port of the target. This prevents any HTTP server from
hosting multiple distinct proxy services, as the server cannot
distinguish them by path (as with distinct resources) or by origin
(as in "virtual hosting").
The absence of an explicit origin for the proxy also rules out the
usual defenses against server port misdirection attacks (see
Section 7.4 of [HTTP]) and creates ambiguity about the use of origin-
scoped response header fields (e.g., "Alt-Svc" [ALT-SVC] or "Strict-
Transport-Security" [HSTS]).
Classic HTTP CONNECT requests are not extensible to carry in-stream
metadata. For example, the WRAP_UP capsule
[I-D.ietf-httpbis-wrap-up] cannot be used with classic HTTP CONNECT.
Schwartz Expires 2 May 2027 [Page 3]
Internet-Draft Templated CONNECT-TCP October 2026
1.3. Overview
This specification describes an alternative mechanism for tunneling
TCP in HTTP. Like [CONNECT-UDP] and [CONNECT-IP], the proxy service
is identified by a URI Template. Proxy interactions reuse standard
HTTP components and semantics, avoiding changes to the core HTTP
protocol.
2. 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, the term "proxy" refers to the HTTP server that
acts upon a client's TCP tunneling request. If there are HTTP
intermediaries (as defined in Section 3.7 of [HTTP]) between the
client and the proxy, those are referred to as "intermediaries" or
"gateways" in this document.
The term "endpoint" describes an implementation of this specification
in either client or proxy role.
The term "templated TCP proxy" refers to a proxy that is identified
by a URI Template in accordance with this specification.
3. Specification
A template-driven TCP transport proxy for HTTP is identified by a URI
Template [RFC6570] containing variables named "target_host" and
"target_port". This URI Template and its variable values MUST meet
all the same requirements as for UDP proxying (Sections 2 and 3 of
[CONNECT-UDP]), and are subject to the same validation rules.
Clients MUST substitute the destination host and port number into
this template to produce a request URI. The derived URI serves as
the destination of a Capsule Protocol connection using the Upgrade
Token "connect-tcp" (see registration in Section 8.1).
If the request is well-formed and permissible, the proxy MUST attempt
to establish the TCP connection before sending a final success or
failure response.
Schwartz Expires 2 May 2027 [Page 4]
Internet-Draft Templated CONNECT-TCP October 2026
3.1. Payload Transport
When using "connect-tcp", TCP payload data is sent in the payload of
new Capsule Types named DATA and FINAL_DATA (see Figure 1 and
registrations in Section 8.3). The ordered concatenation of these
capsule payloads, which MAY be empty, represents the TCP payload
data. A FINAL_DATA capsule additionally indicates that the sender
has closed this stream, semantically equivalent to TCP FIN. After
sending a FINAL_DATA capsule, an endpoint MUST NOT send any more DATA
or FINAL_DATA capsules on this data stream. See Section 3.5 for
related requirements.
DATA Capsule {
Type (i) = 0x08,
Length (i), # may be zero
TCP Payload (..),
}
FINAL_DATA Capsule {
Type (i) = 0x09,
Length (i), # may be zero
TCP Payload (..),
}
Figure 1: DATA and FINAL_DATA Capsule Formats
The boundaries between DATA and FINAL_DATA capsules are not
significant, and are not expected to match TCP segments, TLS records,
HTTP DATA frames, QUIC STREAM frames, etc. Recipients SHOULD begin
forwarding payload from a DATA or FINAL_DATA capsule without waiting
to receive the entire capsule, especially if the capsule is large.
An intermediary MAY merge and split successive DATA and FINAL_DATA
capsules, subject to the following requirements:
* There are no intervening capsules of other types.
* The order of payload content is preserved.
* The final emitted capsule uses the same capsule type (DATA or
FINAL_DATA) as the final input capsule, and all others use the
DATA capsule type.
For example, an intermediary holding two successive DATA capsules in
its transmission buffer could merge them, saving at least 2 bytes of
encapsulation overhead when they are forwarded.
Schwartz Expires 2 May 2027 [Page 5]
Internet-Draft Templated CONNECT-TCP October 2026
This protocol supports backward-compatible extensions via additional
Capsule Types, as described in Section 3.2 of [CAPSULE].
3.2. In HTTP/1.1
In HTTP/1.1 [HTTP/1.1], the client uses the proxy by issuing a
request as follows:
* The method SHALL be "GET".
* The request's target SHALL correspond to the URI derived from
expansion of the proxy's URI Template.
* The request SHALL include a single "Host" header field whose value
identifies the proxy.
* The request SHALL include a "Connection" header field with the
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 the value
"connect-tcp".
* The request SHOULD include a "Capsule-Protocol: ?1" header (as
recommended in [CAPSULE], Section 3.4).
If the TCP connection is successful, the response SHALL be as
follows:
* The HTTP status code SHALL be "101 (Switching Protocols)".
* The response SHALL include a "Connection" header field with the
value "Upgrade".
* The response SHALL include a single "Upgrade" header field with
the value "connect-tcp".
* The response SHOULD include a "Capsule-Protocol: ?1" header (as
above).
If a TCP connection was not established, the proxy MUST NOT switch
protocols to "connect-tcp", and the client MAY reuse this connection
for additional HTTP requests.
Schwartz Expires 2 May 2027 [Page 6]
Internet-Draft Templated CONNECT-TCP October 2026
Client Proxy
GET /proxy?target_host=192.0.2.1&target_port=443 HTTP/1.1
Host: example.com
Connection: Upgrade
Upgrade: connect-tcp
Capsule-Protocol: ?1
HTTP/1.1 100 Continue
** Proxy establishes a TCP connection to 192.0.2.1:443 **
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: connect-tcp
Capsule-Protocol: ?1
Proxy-Status: example.com
Figure 2: Templated TCP proxy example in HTTP/1.1
3.3. In HTTP/2 and HTTP/3
In HTTP/2 and HTTP/3, the proxy MUST include
SETTINGS_ENABLE_CONNECT_PROTOCOL in its SETTINGS frame
[RFC8441][RFC9220]. The client uses the proxy by issuing an
"extended CONNECT" request as follows:
* The :method pseudo-header field SHALL be "CONNECT".
* The :protocol pseudo-header field SHALL be "connect-tcp".
* The :authority pseudo-header field SHALL contain the authority of
the proxy.
* The :path and :scheme pseudo-header fields SHALL contain the path
and scheme of the request URI derived from the proxy's URI
Template.
A templated TCP proxying request that does not conform to all of
these requirements represents a client error (see [HTTP],
Section 15.5) and may be malformed (see Section 8.1.1 of [HTTP/2] and
Section 4.1.2 of [HTTP/3]).
Additionally, the "capsule-protocol" header field SHOULD be present
with a value of "?1" (as recommended in [CAPSULE], Section 3.4).
Schwartz Expires 2 May 2027 [Page 7]
Internet-Draft Templated CONNECT-TCP October 2026
HEADERS
:method = CONNECT
:scheme = https
:authority = templated-proxy.example
:path = /proxy?target_host=2001%3Adb8%3A%3A1&target_port=443
:protocol = connect-tcp
capsule-protocol = ?1
...
Figure 3: Templated TCP proxy example in HTTP/2
3.4. Use of Other Relevant Headers
3.4.1. Origin-scoped Headers
Ordinary HTTP headers apply only to the single resource identified in
the request or response. An origin-scoped HTTP header is a special
response header that is intended to change the client's behavior for
subsequent requests to any resource on this origin.
Unlike classic HTTP CONNECT proxies, a templated TCP proxy has an
unambiguous origin of its own. Origin-scoped headers apply to this
origin when they are associated with a templated TCP proxy response.
Here are some origin-scoped headers that could potentially be sent by
a templated TCP proxy:
* "Alt-Svc" [ALT-SVC]
* "Strict-Transport-Security" [HSTS]
* "Accept-CH" [RFC8942]
* "Set-Cookie" [RFC6265], which has configurable scope.
* "Clear-Site-Data" [CLEAR-SITE-DATA]
3.4.2. Authentication Headers
Authentication to a templated TCP proxy normally uses ordinary HTTP
authentication via the "401 (Unauthorized)" response code, the "WWW-
Authenticate" response header field, and the "Authorization" request
header field ([HTTP], Section 11.6). A templated TCP proxy does not
use the "407 (Proxy Authentication Required)" response code and
related header fields ([HTTP], Section 11.7) because they do not
traverse HTTP gateways (see Section 5.3).
Schwartz Expires 2 May 2027 [Page 8]
Internet-Draft Templated CONNECT-TCP October 2026
Clients SHOULD assume that all proxy resources generated by a single
template share a protection space (i.e., a realm) ([HTTP],
Section 11.5). For many authentication schemes, this will allow the
client to avoid waiting for a "401 (Unauthorized)" response before
each new connection through the proxy.
TLS Client Certificate authentication can also be used (see
Section 5.3).
3.4.3. Caching Headers
In HTTP/2 and HTTP/3, this specification uses the CONNECT method,
which is not subject to caching ([HTTP], Section 9.3.6). However, in
HTTP/1.1, the method is GET, which in other usages can be cacheable.
To minimize discrepancies between HTTP versions, the following
requirements apply when using HTTP/1.1:
* If the response has a heuristically cacheable status code ([HTTP],
Section 15.1), it SHOULD also carry a Cache-Control: no-store
header field.
- This can occur if the request is rejected or the connection
fails.
* The proxy SHOULD NOT attach any other caching-related header
fields to the response.
3.5. Closing Connections
Connection termination is essentially symmetrical for proxies and
their clients, which we refer to here as the "endpoints" of a
request.
When closing connections, endpoints are subject to the following
requirements:
* When an endpoint receives a valid TCP FIN, it MUST send a
FINAL_DATA capsule.
* When an endpoint receives a valid FINAL_DATA capsule, it MUST send
a TCP FIN.
* When a TCP connection reaches the TIME-WAIT or CLOSED state, the
associated endpoint MUST close its send stream.
- If the connection closed gracefully, the endpoint MUST close
the send stream gracefully.
Schwartz Expires 2 May 2027 [Page 9]
Internet-Draft Templated CONNECT-TCP October 2026
- Otherwise, the endpoint SHOULD close the send stream abruptly,
using a mechanism appropriate to the HTTP version:
o HTTP/3: reset the stream with H3_CONNECT_ERROR; see [QUIC],
Section 19.4 and [HTTP/3], Section 8.1.
o HTTP/2: reset the stream with CONNECT_ERROR; see [HTTP/2],
Sections 6.4 and 7.
o HTTP/1.1 over TLS: TCP shutdown without a TLS closure alert;
see [TLS], Section 6.1.
o HTTP/1.1 without TLS: TCP RST.
* When the receive stream is closed abruptly or without a FINAL_DATA
capsule received, the endpoint SHOULD send a TCP RST if the TCP
subsystem permits it.
Any locally imposed timeout (Section 7.2) MUST be treated as an
abrupt closure of the affected stream or connection.
The mandatory behaviors above enable endpoints to detect any
truncation of incoming TCP data. The recommended behaviors propagate
any TCP errors through the tunnel.
In HTTP/3, endpoints MAY negotiate and use the RESET_STREAM_AT frame
in order to reduce data loss during an abrupt closure
[I-D.ietf-quic-reliable-stream-reset]. However, RESET_STREAM_AT may
not be very effective in this case, as TCP implementations will
typically discard pending data when a RST is received.
+-------+ +------------+ +------------+ +-------+
| TCP A | | Endpoint A | | Endpoint B | | TCP B |
+-+-----+ +-+----------+ +----------+-+ +-----+-+
+---"abc"--->+--------DATA{"abc"}------->+---"abc"--->|
+----FIN---->+------FINAL_DATA{""}------>+----FIN---->|
|<---FIN-----+<-----FINAL_DATA{""}-------+<---FIN-----+
| |<----QUIC.STREAM{FIN}------+ |
+---FINACK-->+-----QUIC.STREAM{FIN}----->| |
| | | |
Figure 4: Simple graceful termination example (HTTP/3)
+-------+ +------------+ +------------+ +-------+
| TCP A | | Endpoint A | | Endpoint B | | TCP B |
+-+-----+ +-+----------+ +----------+-+ +-----+-+
+----RST---->+----RST_STREAM{CON_ERR}--->+----RST---->|
| | | |
Schwartz Expires 2 May 2027 [Page 10]
Internet-Draft Templated CONNECT-TCP October 2026
Figure 5: Simple TCP RST termination example (HTTP/2)
+-------+ +------------+ +------------+ +-------+
| TCP A | | Endpoint A | | Endpoint B | | TCP B |
+-+-----+ +-+----------+ +----------+-+ +-----+-+
+---"abc"--->+--------DATA{"abc"}------->+---"abc"--->|
| | (... timeout @ A ...) | |
| +--FIN (no close_notify) -->+----RST---->|
| | | |
Figure 6: Timeout example (HTTP/1.1)
+-------+ +------------+ +------------+ +-------+
| TCP A | | Endpoint A | | Endpoint B | | TCP B |
+-+-----+ +-+----------+ +----------+-+ +-----+-+
+-----FIN--->+-------FINAL_DATA{""}----->+-----FIN--->|
| | | |
| (FIN) | | (FIN) |
|<---"abc"---+<----FINAL_DATA{"abc"}-----+<---"abc"---+
| |<----QUIC.STREAM{FIN}------+ |
+-----RST--->+-----H3_CONNECT_ERROR----->+-----RST--->|
| | | |
Figure 7: RST after FIN example (HTTP/3)
3.5.1. Handling Invalid Data
An endpoint that receives invalid data from its peer is subject to
the same requirements as when receiving an abrupt closure of the
receive stream (see Section 3.5). Some examples of invalid data
include:
* A second FINAL_DATA capsule.
* A DATA capsule after FINAL_DATA.
* Data that results in a parsing error under the Capsule Protocol.
* A capsule that is truncated by the end of the stream.
* A capsule that would require unreasonable effort to process.
Note that very large DATA and FINAL_DATA capsules are still valid, as
they can be forwarded incrementally using a bounded memory buffer.
Schwartz Expires 2 May 2027 [Page 11]
Internet-Draft Templated CONNECT-TCP October 2026
4. Additional Connection Setup Behaviors
This section discusses some behaviors that are permitted or
recommended in order to enhance the performance or functionality of
connection setup.
4.1. Latency Optimizations
When using this specification in HTTP/2 or HTTP/3, clients MAY start
sending TCP stream content optimistically, subject to flow control
limits (Section 5.2 of [HTTP/2] or Section 4.1 of [QUIC]). Proxies
MUST buffer this "optimistic" content until the TCP stream becomes
writable, and discard it if the TCP connection fails.
Clients MUST NOT use "optimistic" behavior in HTTP/1.1, as this would
interfere with reuse of the connection after an error response such
as "401 (Unauthorized)".
Servers that host a proxy under this specification MAY offer support
for TLS early data in accordance with [RFC8470]. Clients MAY send
"connect-tcp" requests in early data, and MAY include "optimistic"
TCP content in early data (in HTTP/2 and HTTP/3). At the TLS layer,
proxies MAY ignore, reject, or accept the early_data extension
([TLS], Section 4.3.10). At the HTTP layer, proxies MAY process the
request immediately, return a "425 (Too Early)" response ([RFC8470],
Section 5.2), or delay some or all processing of the request until
the handshake completes. For example, a proxy with limited anti-
replay defenses might choose to perform DNS resolution of the
target_host when a request arrives in early data, but delay the TCP
connection until the TLS handshake completes.
When DNS resolution of target_host produces multiple IP addresses,
proxies SHOULD use a racing procedure such as Happy Eyeballs [HEv2]
to accelerate connection establishment. Proxies that race multiple
connection attempts MUST buffer any optimistic content until a
connection is selected and MUST NOT transmit any payload data on the
other connections.
4.2. Indicating Failure
Failure to initiate a tunnel is indicated by the HTTP response status
code.
A 4XX status code indicates that the request is malformed or
impermissible. For example, if the proxy performs DNS resolution of
target_host and receives an IP address that is disallowed by the
proxy's policy, it might return 403 (Forbidden).
Schwartz Expires 2 May 2027 [Page 12]
Internet-Draft Templated CONNECT-TCP October 2026
A 5XX status code indicates a failure in the attempt, such as when a
TCP connection was attempted but did not succeed. The 502 (Bad
Gateway) and 504 (Gateway Timeout) status codes are commonly used.
The 429 (Too Many Requests) and 503 (Service Unavailable) status
codes indicate a temporary failure, and can carry a "Retry-After"
response header field. If included, this field applies to all
requests using this URI Template.
4.3. Conveying Metadata
This specification supports the "100 (Continue)" response status code
([HTTP], Section 15.2.1) in any HTTP version. Proxies SHOULD send
this status code whenever they accept a request, without waiting for
the proxy-destination TCP handshake to succeed or fail. This allows
for a few useful improvements:
* Clients can provide a clearer status indication while waiting for
the destination host to respond. (TCP handshakes can hang for
several minutes before failing.)
* Clients can apply separate timeouts to the tunneling request and
connection establishment.
* In HTTP/2 and HTTP/3, clients have the option to delay some or all
of the optimistic payload data until after confirming that the
request is permissible. This strategy reduces wasted effort when
the request is rejected.
Note that a client in this specification cannot send an "Expect:
100-continue" request header field, because the request does not
include any "content" ([HTTP], Section 10.1.1).
Proxies implementing this specification SHOULD include a "Proxy-
Status" response header field [PROXY-STATUS] in any success or
failure response (i.e., status codes 101, 2XX, 4XX, or 5XX) to
support advanced client behaviors and diagnostics. Clients and
proxies MUST NOT send trailer fields on "connect-tcp" streams.
5. Applicability
5.1. Servers
For server operators, templated TCP proxies are particularly valuable
in situations where virtual-hosting is needed, or where multiple
proxies must share an origin. For example, the proxy might benefit
from sharing an HTTP gateway that provides DDoS defense, performs
request sanitization, or enforces user authorization (Section 5.3).
Schwartz Expires 2 May 2027 [Page 13]
Internet-Draft Templated CONNECT-TCP October 2026
Templated TCP proxies can also be made invisible to probes from
unauthorized clients:
* The URI template can include a high-entropy path, similar to
Capability URLs [CAPABILITY].
* The proxy can require HTTP Concealed Authentication ([CONCEALED],
Section 6.4).
5.2. Clients
This specification does not require any specific type of
configuration input. Suitable configuration input types include:
* A URI Template string, as described in Section 3.
* An IP address or hostname, with optional or required port and
scheme (as often used to describe classic HTTP CONNECT proxies).
A corresponding templated TCP proxy might be found in two ways:
- At the default template for "connect-tcp" (Figure 8).
- In the "proxies" array of a provisioning domain resource
retrieved from the corresponding .well-known URI (Sections 2
and 3 of [I-D.ietf-intarea-proxy-config]).
* A provisioning domain resource, configured directly or identified
by a local or remote URI (e.g., using "file://" or "https://").
https://$PROXY_HOST:$PROXY_PORT/.well-known/masque
/tcp/{target_host}/{target_port}/
Figure 8: Registered default template
All of these input types MAY share a single input string, as they can
be disambiguated reliably by parsing and probing. However, it may be
preferable to indicate the configuration input type explicitly, to
reduce probing delays while supporting clients with differing
capabilities.
Clients SHOULD treat certain errors during classic HTTP CONNECT as
indications that the proxy might only support "connect-tcp":
* In HTTP/1.1: the response status code is "426 (Upgrade Required)",
with an "Upgrade: connect-tcp" response header.
* In any HTTP version: the response status code is "501 (Not
Implemented)".
Schwartz Expires 2 May 2027 [Page 14]
Internet-Draft Templated CONNECT-TCP October 2026
- Requires SETTINGS_ENABLE_CONNECT_PROTOCOL to have been
negotiated in HTTP/2 or HTTP/3.
If the client infers that classic HTTP CONNECT is not supported, it
SHOULD retry the request using the registered default template for
"connect-tcp" (Figure 8). If this request succeeds, the client
SHOULD record a preference for "connect-tcp" to avoid further retry
delays.
5.3. Gateways
Templated TCP proxy requests can traverse standard HTTP gateways to
ease implementation and allow use of shared infrastructure. However,
current gateways might need modifications to support TCP proxy
services. To be compatible, a gateway MUST:
* support Extended CONNECT (if acting as an HTTP/2 or HTTP/3
server).
* support HTTP/1.1 Upgrade to "connect-tcp" (if acting as an
HTTP/1.1 server).
- only after forwarding the upgrade request to the origin and
observing a success response.
* forward the "connect-tcp" protocol to the origin.
* convert "connect-tcp" requests between all supported HTTP server
and client versions.
* allow any "Proxy-Status" headers to traverse the gateway.
If the proxy relies on TLS Client Certificates for client
authentication, the gateway MUST perform this authentication itself
or pass the relevant information to the origin (e.g., using a
"Client-Cert" request header field [RFC9440]).
6. Security Considerations
Template-driven TCP proxying is largely subject to the same security
risks as classic HTTP CONNECT. For example, any restrictions on
authorized use of the proxy (see [HTTP], Section 9.3.6) apply equally
to both. The destination_ip_prohibited Proxy Error Type from
Section 2.3.5 of [PROXY-STATUS] can be useful when rejecting
unauthorized requests.
Schwartz Expires 2 May 2027 [Page 15]
Internet-Draft Templated CONNECT-TCP October 2026
A small additional risk is posed by the use of a URI Template parser
on the client side. The template input string could be crafted to
exploit any vulnerabilities in the parser implementation. Client
implementers should apply their usual precautions for code that
processes untrusted inputs.
See Section 7 of [CONNECT-UDP] for a comparison of the risks of
operating a TCP or UDP proxy.
6.1. Resource Exhaustion attacks
A malicious client can cause highly asymmetric resource usage at the
proxy by colluding with a destination server and violating the
ordinary rules of TCP or HTTP. Some example attacks, and mitigations
that proxies can apply:
* *Connection Pileup*: A malicious client can attempt to open a
large number of connections to exhaust the proxy's memory, port,
or file descriptor limits. When using HTTP/2 or HTTP/3, each
incremental TCP connection imposes a much higher cost on the proxy
than on the attacker.
- Mitigation: Limit the number of concurrent connections per
client.
* *Window Bloat*: An attacker can grow the receive window size by
simulating a "long, fat network" ([RFC7323], Section 1.1), then
fill the window (from the sender) and stop acknowledging it (at
the receiver). This leaves the proxy buffering up to 1 GiB of TCP
data until some timeout, while the attacker does not have to
retain a large buffer.
- Mitigation: Limit the maximum receive window for TCP and HTTP
connections, and the size of userspace buffers used for
forwarding data. Alternatively, monitor the connections' send
queues and limit the total buffered data per client.
* *WAIT Abuse*: An attacker can force the proxy into a TIME-WAIT,
CLOSE-WAIT, or FIN-WAIT state until the timer expires, tying up a
proxy-to-destination 4-tuple for up to four minutes after the
client's connection is closed.
- Mitigations:
o Enable the PAWS optimization ([RFC7323], Section 5) across
successive connections (e.g., Linux's tcp_tw_reuse=1
[SYSCTL]). This makes TIME-WAIT 4-tuples rapidly reusable
if the destination enables TCP Timestamps, which most do.
Schwartz Expires 2 May 2027 [Page 16]
Internet-Draft Templated CONNECT-TCP October 2026
o Allocate a large range of IP addresses for TCP connections
(especially in IPv6).
o Limit the number of connections for each client to each
destination, even if those connections are in a waiting
state and the corresponding CONNECT stream is closed.
o If necessary, perform an abrupt TCP closure that destroys
the Transmission Control Block. Note that reusing a 4-tuple
in this way can increase the risk of interference between
successive connections.
6.2. Client Authentication
A proxy server operating without access controls on the open internet
(an "open proxy") is likely to be discovered and misused quickly by
attackers. HTTP client authentication is the most common way to
avoid this misuse.
Section 3.4.2 describes how to use HTTP client authentication with
this specification. Each HTTP client authentication scheme offers
distinct security properties, so care should be taken to select an
appropriate scheme for each deployment. See [HTTP], Section 17.16
for additional guidance related to HTTP authentication.
6.3. TLS Early Data
This specification supports sending both proxying requests and
optimistic payload data in TLS early data (Section 4.1). TLS 1.3
recommends, but does not require, replay protection for this data
([TLS], Section 8), so a replay attack could cause the proxy service
to establish multiple connections to the target, and to deliver any
optimistic payload data on each of these connections. When such a
replay attack would cause harm (e.g., when the optimistic data
represents a non-idempotent application command), clients MUST NOT
use TLS early data.
See Section 6 of [RFC8470] for additional relevant security
considerations.
7. Operational Considerations
7.1. Avoiding HTTP/1.1
While this specification is fully functional under HTTP/1.1,
performance-sensitive deployments SHOULD use HTTP/2 or HTTP/3
instead. When using HTTP/1.1:
Schwartz Expires 2 May 2027 [Page 17]
Internet-Draft Templated CONNECT-TCP October 2026
* Each CONNECT request requires a new TCP and TLS connection,
imposing a higher cost in setup latency, congestion control
convergence, CPU time, and data transfer.
* The graceful and abrupt closure signals (Section 3.5) are more
likely to be missing or corrupted:
- Some implementations may be unable to emit the recommended
abrupt closure signals, due to limitations in their TCP and TLS
subsystems.
- Faulty implementations may fail to send a TLS closure alert
during graceful shutdown, or fail to report an error when the
expected closure alert is not received. These misbehaviors are
not compliant with [TLS], but they are common nonetheless among
HTTP/1.1 implementations today.
* The number of active connections through each client may be
limited by the number of available TCP client ports, especially
if:
- The client only has one IP address that can be used to reach
the proxy.
- The client is shared between many parties, such as when acting
as a gateway or concentrator.
- The tunneled connections are often closed by the destination.
This causes the client to initiate closure of the client-to-
proxy connection, leaving the client in a TIME-WAIT state for
up to four minutes.
7.2. Timeouts
Except when actively sending or receiving data, an endpoint is always
waiting for an event from its peer or its TCP connection. HTTP and
TCP are designed to ensure that such an event always arrives, so the
connection is never permanently stuck in any state until it is fully
closed. However, for efficient operation, it may be necessary to
adjust the settings for TCP keep-alives ([TCP], Section 3.8.4), QUIC
idle timeouts ([QUIC], Section 10.1), HTTP/2 PING frames ([HTTP/2],
Section 6.7), and other transport options.
Endpoints MAY impose additional timeouts, especially as a defense
against certain resource exhaustion attacks (Section 6.1). However,
operators should apply timeouts cautiously to minimize the impact on
connections that are functioning but slow. See Section 3.5 for
related requirements.
Schwartz Expires 2 May 2027 [Page 18]
Internet-Draft Templated CONNECT-TCP October 2026
For example, enabling PING frames on idle HTTP/2 connections allows
the operator to prevent some kinds of failures and detect failed
connections faster, but it uses more bandwidth, CPU time, and radio
power, and increases the risk of false-positive connection failures.
Optimal transport settings will depend on the network environment
(e.g., mobile vs. fixed), characteristics of the tunneled
application, and many other considerations.
7.3. Scope of Packet-Level Metadata
This specification does not provide a way to pass packet-level
metadata such as IPv6 Extension Headers [RFC2460], Section 4,
DiffServ Codepoints (DSCP) [RFC2474], or Explicit Congestion
Notification (ECN) marks [RFC3168] through the tunnel. TCP options
and non-fatal ICMP messages (e.g., Packet Too Big) are similarly not
relayed. Instead, these signals are processed by the relevant
endpoint of this specification, which is also the TCP endpoint and
only relays payload data through the tunnel.
Consumption and generation of these signals on each connection is
controlled by the endpoint, and is independent from any behaviors of
the other endpoint and any similar signals on the tunnel's HTTP
connection. If the operator has requirements related to these
behaviors, it must configure the relevant endpoint (typically the
proxy) accordingly.
7.4. IP address sharing
A TCP proxy typically uses the same IP address to establish
connections on behalf of multiple clients, especially in IPv4.
[RFC6269] provides guidance regarding difficulties that can arise
from IP address sharing, including in this arrangement.
7.5. Diagnostics and Monitoring
A proxy in this protocol reports success or failure in each response
via the HTTP status code and the Proxy-Status response header field.
Monitoring those error codes is a sensible way to assess the
functioning of a proxy server. Other relevant performance indicators
may include:
* Abrupt closure rates
* Number of active tunnels per user
* Total throughput in each direction
* Number of bytes buffered
Schwartz Expires 2 May 2027 [Page 19]
Internet-Draft Templated CONNECT-TCP October 2026
* Connection duration
* Time spent establishing or closing connections
* Number of half-closed or WAIT-state connections
* DNS resolution delay
An increase in any of these measures could indicate an operational
problem or a resource exhaustion attack (Section 6.1). See
Section 6.1 for guidance on relevant defenses and limits.
8. IANA Considerations
8.1. New Upgrade Token
IANA is requested to add the following entry to the "HTTP Upgrade
Tokens" registry under "Hypertext Transfer Protocol (HTTP) Upgrade
Token Registry" registry group:
+===============+==============+================+===========+
| Value | Description | Expected | Reference |
| | | Version Tokens | |
+===============+==============+================+===========+
| "connect-tcp" | Proxying of | (None) | (This |
| | TCP payloads | | document) |
+---------------+--------------+----------------+-----------+
Table 1
8.1.1. Interop testing
This section is to be removed before publishing as an RFC.
For interoperability testing of this draft version, implementations
SHALL use the value "connect-tcp-12".
8.2. New MASQUE Default Template
IANA is requested to add the following entry to the "MASQUE URI
Suffixes" registry under "Multiplexed Application Substrate over QUIC
Encryption (MASQUE)" registry group:
Schwartz Expires 2 May 2027 [Page 20]
Internet-Draft Templated CONNECT-TCP October 2026
+==============+==============+=================+
| Path Segment | Description | Reference |
+==============+==============+=================+
| tcp | TCP Proxying | (This document) |
+--------------+--------------+-----------------+
Table 2
8.3. New Capsule Type
IANA is requested to add the following entry to the "HTTP Capsule
Types" registry under "Multiplexed Application Substrate over QUIC
Encryption (MASQUE)" registry group:
+=====+============+===========+============+============+=========+
|Value| Capsule | Status | Reference | Change | Contact |
| | Type | | | Controller | |
+=====+============+===========+============+============+=========+
|0x08 | DATA | permanent | (This | IETF | HTTPBIS |
| | | | document), | | |
| | | | Section 3 | | |
+-----+------------+-----------+------------+------------+---------+
|0x09 | FINAL_DATA | permanent | (This | IETF | HTTPBIS |
| | | | document), | | |
| | | | Section 3 | | |
+-----+------------+-----------+------------+------------+---------+
Table 3
9. References
9.1. Normative References
[CAPSULE] Schinazi, D. and L. Pardue, "HTTP Datagrams and the
Capsule Protocol", RFC 9297, DOI 10.17487/RFC9297, August
2022, <https://www.rfc-editor.org/rfc/rfc9297>.
[CONNECT-UDP]
Schinazi, D., "Proxying UDP in HTTP", RFC 9298,
DOI 10.17487/RFC9298, August 2022,
<https://www.rfc-editor.org/rfc/rfc9298>.
[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/rfc/rfc9110>.
Schwartz Expires 2 May 2027 [Page 21]
Internet-Draft Templated CONNECT-TCP October 2026
[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/rfc/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/rfc/rfc9113>.
[HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114,
June 2022, <https://www.rfc-editor.org/rfc/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/rfc/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/rfc/rfc9000>.
[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/rfc/rfc2119>.
[RFC6570] 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/rfc/rfc6570>.
[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/rfc/rfc8174>.
[RFC8441] McManus, P., "Bootstrapping WebSockets with HTTP/2",
RFC 8441, DOI 10.17487/RFC8441, September 2018,
<https://www.rfc-editor.org/rfc/rfc8441>.
[RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early
Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September
2018, <https://www.rfc-editor.org/rfc/rfc8470>.
[RFC9220] Hamilton, R., "Bootstrapping WebSockets with HTTP/3",
RFC 9220, DOI 10.17487/RFC9220, June 2022,
<https://www.rfc-editor.org/rfc/rfc9220>.
Schwartz Expires 2 May 2027 [Page 22]
Internet-Draft Templated CONNECT-TCP October 2026
[TCP] Eddy, W., Ed., "Transmission Control Protocol (TCP)",
STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022,
<https://www.rfc-editor.org/rfc/rfc9293>.
[TLS] Rescorla, E., "The Transport Layer Security (TLS) Protocol
Version 1.3", RFC 9846, DOI 10.17487/RFC9846, July 2026,
<https://www.rfc-editor.org/rfc/rfc9846>.
9.2. Informative References
[ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP
Alternative Services", RFC 7838, DOI 10.17487/RFC7838,
April 2016, <https://www.rfc-editor.org/rfc/rfc7838>.
[CAPABILITY]
"Good Practices for Capability URLs", February 2014,
<https://www.w3.org/TR/capability-urls/>.
[CLEAR-SITE-DATA]
"Clear Site Data", November 2017,
<https://www.w3.org/TR/clear-site-data/>.
[CONCEALED]
Schinazi, D., Oliver, D., and J. Hoyland, "The Concealed
HTTP Authentication Scheme", RFC 9729,
DOI 10.17487/RFC9729, February 2025,
<https://www.rfc-editor.org/rfc/rfc9729>.
[CONNECT-IP]
Pauly, T., Ed., Schinazi, D., Chernyakhovsky, A.,
Kühlewind, M., and M. Westerlund, "Proxying IP in HTTP",
RFC 9484, DOI 10.17487/RFC9484, October 2023,
<https://www.rfc-editor.org/rfc/rfc9484>.
[HEv2] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2:
Better Connectivity Using Concurrency", RFC 8305,
DOI 10.17487/RFC8305, December 2017,
<https://www.rfc-editor.org/rfc/rfc8305>.
[HSTS] Hodges, J., Jackson, C., and A. Barth, "HTTP Strict
Transport Security (HSTS)", RFC 6797,
DOI 10.17487/RFC6797, November 2012,
<https://www.rfc-editor.org/rfc/rfc6797>.
Schwartz Expires 2 May 2027 [Page 23]
Internet-Draft Templated CONNECT-TCP October 2026
[I-D.ietf-httpbis-wrap-up]
Schinazi, D. and L. Pardue, "The HTTP Wrap Up Capsule",
Work in Progress, Internet-Draft, draft-ietf-httpbis-wrap-
up-01, 7 July 2025,
<https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-
wrap-up-01>.
[I-D.ietf-intarea-proxy-config]
Pauly, T., Damjanovic, D., and Y. Rosomakho,
"Communicating Proxy Configurations in Provisioning
Domains", Work in Progress, Internet-Draft, draft-ietf-
intarea-proxy-config-14, 19 May 2026,
<https://datatracker.ietf.org/doc/html/draft-ietf-intarea-
proxy-config-14>.
[I-D.ietf-quic-reliable-stream-reset]
Seemann, M. and K. Oku, "QUIC Stream Resets with Partial
Delivery", Work in Progress, Internet-Draft, draft-ietf-
quic-reliable-stream-reset-11, 6 September 2026,
<https://datatracker.ietf.org/doc/html/draft-ietf-quic-
reliable-stream-reset-11>.
[RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6
(IPv6) Specification", RFC 2460, DOI 10.17487/RFC2460,
December 1998, <https://www.rfc-editor.org/rfc/rfc2460>.
[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black,
"Definition of the Differentiated Services Field (DS
Field) in the IPv4 and IPv6 Headers", RFC 2474,
DOI 10.17487/RFC2474, December 1998,
<https://www.rfc-editor.org/rfc/rfc2474>.
[RFC3168] 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/rfc/rfc3168>.
[RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265,
DOI 10.17487/RFC6265, April 2011,
<https://www.rfc-editor.org/rfc/rfc6265>.
[RFC6269] Ford, M., Ed., Boucadair, M., Durand, A., Levis, P., and
P. Roberts, "Issues with IP Address Sharing", RFC 6269,
DOI 10.17487/RFC6269, June 2011,
<https://www.rfc-editor.org/rfc/rfc6269>.
Schwartz Expires 2 May 2027 [Page 24]
Internet-Draft Templated CONNECT-TCP October 2026
[RFC7323] Borman, D., Braden, B., Jacobson, V., and R.
Scheffenegger, Ed., "TCP Extensions for High Performance",
RFC 7323, DOI 10.17487/RFC7323, September 2014,
<https://www.rfc-editor.org/rfc/rfc7323>.
[RFC8942] Grigorik, I. and Y. Weiss, "HTTP Client Hints", RFC 8942,
DOI 10.17487/RFC8942, February 2021,
<https://www.rfc-editor.org/rfc/rfc8942>.
[RFC9440] Campbell, B. and M. Bishop, "Client-Cert HTTP Header
Field", RFC 9440, DOI 10.17487/RFC9440, July 2023,
<https://www.rfc-editor.org/rfc/rfc9440>.
[SYSCTL] "IP Sysctl -- The Linux Kernel documentation", June 2026,
<https://www.kernel.org/doc/html/v7.1/networking/ip-
sysctl.html>.
Acknowledgments
This document benefited from close review and suggested changes by:
* Mohamed Boucadair
* Deb Cooley
* Gorry Fairhurst
* Thomas Fossati
* Amos Jeffries
* Mahesh Jethanandani
* Antun Jurkovic
* Eric Kinnear
* Kyle Nekritz
* Kazuho Oku
* Tommy Pauly
* Yaroslav Romakho
* David Schinazi
* Ketan Talaulikar
Schwartz Expires 2 May 2027 [Page 25]
Internet-Draft Templated CONNECT-TCP October 2026
* Willy Tarreau
Author's Address
Benjamin M. Schwartz
Meta Platforms, Inc.
Email: ietf@bemasc.net
Schwartz Expires 2 May 2027 [Page 26]