| rfc9484v4.txt | rfc9484.txt | |||
|---|---|---|---|---|
| Internet Engineering Task Force (IETF) T. Pauly, Ed. | Internet Engineering Task Force (IETF) T. Pauly, Ed. | |||
| Request for Comments: 9484 Apple Inc. | Request for Comments: 9484 Apple Inc. | |||
| Updates: 9298 D. Schinazi | Updates: 9298 D. Schinazi | |||
| Category: Standards Track A. Chernyakhovsky | Category: Standards Track A. Chernyakhovsky | |||
| ISSN: 2070-1721 Google LLC | ISSN: 2070-1721 Google LLC | |||
| M. Kuehlewind | M. Kühlewind | |||
| M. Westerlund | M. Westerlund | |||
| Ericsson | Ericsson | |||
| September 2023 | October 2023 | |||
| Proxying IP in HTTP | Proxying IP in HTTP | |||
| Abstract | Abstract | |||
| This document describes how to proxy IP packets in HTTP. This | This document describes how to proxy IP packets in HTTP. This | |||
| protocol is similar to UDP proxying in HTTP but allows transmitting | protocol is similar to UDP proxying in HTTP but allows transmitting | |||
| arbitrary IP packets. More specifically, this document defines a | arbitrary IP packets. More specifically, this document defines a | |||
| protocol that allows an HTTP client to create an IP tunnel through an | protocol that allows an HTTP client to create an IP tunnel through an | |||
| HTTP server that acts as an IP proxy. This document updates RFC | HTTP server that acts as an IP proxy. This document updates RFC | |||
| skipping to change at line 242 ¶ | skipping to change at line 242 ¶ | |||
| carry any message content. | carry any message content. | |||
| IP proxying over HTTP MUST be operated over TLS or QUIC encryption, | IP proxying over HTTP MUST be operated over TLS or QUIC encryption, | |||
| or another equivalent encryption protocol, to provide | or another equivalent encryption protocol, to provide | |||
| confidentiality, integrity, and authentication. | confidentiality, integrity, and authentication. | |||
| 4.1. IP Proxy Handling | 4.1. IP Proxy Handling | |||
| Upon receiving an IP proxying request: | Upon receiving an IP proxying request: | |||
| * If the recipient is configured to use another HTTP proxy, it will | * If the recipient is configured to use another HTTP server, it will | |||
| act as an intermediary by forwarding the request to another HTTP | act as an intermediary by forwarding the request to the other HTTP | |||
| server. Note that such intermediaries may need to re-encode the | server. Note that such intermediaries may need to re-encode the | |||
| request if they forward it using a version of HTTP that is | request if they forward it using a version of HTTP that is | |||
| different from the one used to receive it, as the request encoding | different from the one used to receive it, as the request encoding | |||
| differs by version (see below). | differs by version (see below). | |||
| * Otherwise, the recipient will act as an IP proxy. The IP proxy | * Otherwise, the recipient will act as an IP proxy. The IP proxy | |||
| can choose to reject the IP proxying request. Otherwise, it | can choose to reject the IP proxying request. Otherwise, it | |||
| extracts the optional "target" and "ipproto" variables from the | extracts the optional "target" and "ipproto" variables from the | |||
| URI it has reconstructed from the request headers, decodes their | URI it has reconstructed from the request headers, decodes their | |||
| percent-encoding, and establishes an IP tunnel. | percent-encoding, and establishes an IP tunnel. | |||
| skipping to change at line 274 ¶ | skipping to change at line 274 ¶ | |||
| example, if DNS resolution returns an error, the proxy can use the | 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]. | dns_error proxy error type from Section 2.3.2 of [PROXY-STATUS]. | |||
| The lifetime of the IP forwarding tunnel is tied to the IP proxying | The lifetime of the IP forwarding tunnel is tied to the IP proxying | |||
| request stream. The IP proxy MUST maintain all IP address and route | request stream. The IP proxy MUST maintain all IP address and route | |||
| assignments associated with the IP forwarding tunnel while the | assignments associated with the IP forwarding tunnel while the | |||
| request stream is open. IP proxies MAY choose to tear down the | request stream is open. IP proxies MAY choose to tear down the | |||
| tunnel due to a period of inactivity, but they MUST close the request | tunnel due to a period of inactivity, but they MUST close the request | |||
| stream when doing so. | stream when doing so. | |||
| A successful response (as defined in Sections 4.3 and 4.5) indicates | A successful IP proxying response (as defined in Sections 4.3 and | |||
| that the IP proxy has established an IP tunnel and is willing to | 4.5) indicates that the IP proxy has established an IP tunnel and is | |||
| proxy IP payloads. Any response other than a successful response | willing to proxy IP payloads. Any response other than a successful | |||
| indicates that the request has failed; thus, the client MUST abort | IP proxying response indicates that the request has failed; thus, the | |||
| the request. | client MUST abort the request. | |||
| Along with a successful response, the IP proxy can send capsules to | Along with a successful IP proxying response, the IP proxy can send | |||
| assign addresses and advertise routes to the client (Section 4.7). | capsules to assign addresses and advertise routes to the client | |||
| The client can also assign addresses and advertise routes to the IP | (Section 4.7). The client can also assign addresses and advertise | |||
| proxy for network-to-network routing. | routes to the IP proxy for network-to-network routing. | |||
| 4.2. HTTP/1.1 Request | 4.2. HTTP/1.1 Request | |||
| When using HTTP/1.1 [HTTP/1.1], an IP proxying request will meet the | When using HTTP/1.1 [HTTP/1.1], an IP proxying request will meet the | |||
| following requirements: | following requirements: | |||
| * The method SHALL be "GET". | * The method SHALL be "GET". | |||
| * The request SHALL include a single Host header field containing | * The request SHALL include a single Host header field containing | |||
| the host and optional port of the IP proxy. | the host and optional port of the IP proxy. | |||
| skipping to change at line 321 ¶ | skipping to change at line 321 ¶ | |||
| GET https://example.org/.well-known/masque/ip/*/*/ HTTP/1.1 | GET https://example.org/.well-known/masque/ip/*/*/ HTTP/1.1 | |||
| Host: example.org | Host: example.org | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Upgrade: connect-ip | Upgrade: connect-ip | |||
| Capsule-Protocol: ?1 | Capsule-Protocol: ?1 | |||
| Figure 2: Example HTTP/1.1 Request | Figure 2: Example HTTP/1.1 Request | |||
| 4.3. HTTP/1.1 Response | 4.3. HTTP/1.1 Response | |||
| The server indicates a successful response by replying with the | The server indicates a successful IP proxying response by replying | |||
| following requirements: | with the following requirements: | |||
| * The HTTP status code on the response SHALL be 101 (Switching | * The HTTP status code on the response SHALL be 101 (Switching | |||
| Protocols). | Protocols). | |||
| * The response SHALL include a Connection header field with value | * The response SHALL include a Connection header field with value | |||
| "Upgrade" (note that this requirement is case-insensitive, as per | "Upgrade" (note that this requirement is case-insensitive, as per | |||
| Section 7.6.1 of [HTTP]). | Section 7.6.1 of [HTTP]). | |||
| * The response SHALL include a single Upgrade header field with | * The response SHALL include a single Upgrade header field with | |||
| value "connect-ip". | value "connect-ip". | |||
| skipping to change at line 392 ¶ | skipping to change at line 392 ¶ | |||
| :protocol = connect-ip | :protocol = connect-ip | |||
| :scheme = https | :scheme = https | |||
| :path = /.well-known/masque/ip/*/*/ | :path = /.well-known/masque/ip/*/*/ | |||
| :authority = example.org | :authority = example.org | |||
| capsule-protocol = ?1 | capsule-protocol = ?1 | |||
| Figure 4: Example HTTP/2 or HTTP/3 Request | Figure 4: Example HTTP/2 or HTTP/3 Request | |||
| 4.5. HTTP/2 and HTTP/3 Responses | 4.5. HTTP/2 and HTTP/3 Responses | |||
| The server indicates a successful response by replying with the | The server indicates a successful IP proxying response by replying | |||
| following requirements: | with the following requirements: | |||
| * The HTTP status code on the response SHALL be in the 2xx | * The HTTP status code on the response SHALL be in the 2xx | |||
| (Successful) range. | (Successful) range. | |||
| * The response SHALL meet the requirements of HTTP responses that | * The response SHALL meet the requirements of HTTP responses that | |||
| start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM]. | start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM]. | |||
| If any of these requirements are not met, the client MUST treat this | If any of these requirements are not met, the client MUST treat this | |||
| proxying attempt as failed and abort the request. As an example, any | proxying attempt as failed and abort the request. As an example, any | |||
| status code in the 3xx range will be treated as a failure and cause | status code in the 3xx range will be treated as a failure and cause | |||
| skipping to change at line 494 ¶ | skipping to change at line 494 ¶ | |||
| target = IPv6prefix / IPv4prefix / reg-name / "*" | target = IPv6prefix / IPv4prefix / reg-name / "*" | |||
| IPv6prefix = IPv6address ["%2F" 1*3DIGIT] | IPv6prefix = IPv6address ["%2F" 1*3DIGIT] | |||
| IPv4prefix = IPv4address ["%2F" 1*2DIGIT] | IPv4prefix = IPv4address ["%2F" 1*2DIGIT] | |||
| ipproto = 1*3DIGIT / "*" | ipproto = 1*3DIGIT / "*" | |||
| Figure 6: URI Template Variable Format | Figure 6: URI Template Variable Format | |||
| IP proxies MAY perform access control using the scoping information | IP proxies MAY perform access control using the scoping information | |||
| provided by the client, i.e., if the client is not authorized to | provided by the client, i.e., if the client is not authorized to | |||
| access any of the destinations included in the scope, then the IP | access any of the destinations included in the scope, then the IP | |||
| proxy can immediately fail the request. | proxy can immediately reject the request. | |||
| 4.7. Capsules | 4.7. Capsules | |||
| This document defines multiple new capsule types that allow endpoints | This document defines multiple new capsule types that allow endpoints | |||
| to exchange IP configuration information. Both endpoints MAY send | to exchange IP configuration information. Both endpoints MAY send | |||
| any number of these new capsules. | any number of these new capsules. | |||
| 4.7.1. ADDRESS_ASSIGN Capsule | 4.7.1. ADDRESS_ASSIGN Capsule | |||
| The ADDRESS_ASSIGN capsule (capsule type 0x01) allows an endpoint to | The ADDRESS_ASSIGN capsule (capsule type 0x01) allows an endpoint to | |||
| skipping to change at line 876 ¶ | skipping to change at line 876 ¶ | |||
| 7.1. Link Operation | 7.1. Link Operation | |||
| The IP forwarding tunnels described in this document are not fully | The IP forwarding tunnels described in this document are not fully | |||
| featured "interfaces" in the IPv6 addressing architecture sense | featured "interfaces" in the IPv6 addressing architecture sense | |||
| [IPv6-ADDR]. In particular, they do not necessarily have IPv6 link- | [IPv6-ADDR]. In particular, they do not necessarily have IPv6 link- | |||
| local addresses. Additionally, IPv6 stateless autoconfiguration or | local addresses. Additionally, IPv6 stateless autoconfiguration or | |||
| router advertisement messages are not used in such interfaces, and | router advertisement messages are not used in such interfaces, and | |||
| neither is neighbor discovery. | neither is neighbor discovery. | |||
| Clients MAY optimistically start sending proxied IP packets before | When using HTTP/2 or HTTP/3, a client MAY optimistically start | |||
| receiving the response to its IP proxying request, noting however | sending proxied IP packets before receiving the response to its IP | |||
| that those may not be processed by the IP proxy if it responds to the | proxying request, noting however that those may not be processed by | |||
| request with a failure or if the datagrams are received by the IP | the IP proxy if it responds to the request with a failure or if the | |||
| proxy before the request. Since receiving addresses and routes is | datagrams are received by the IP proxy before the request. Since | |||
| required in order to know that a packet can be sent through the | receiving addresses and routes is required in order to know that a | |||
| tunnel, such optimistic packets might be dropped by the IP proxy if | packet can be sent through the tunnel, such optimistic packets might | |||
| it chooses to provide different addressing or routing information | be dropped by the IP proxy if it chooses to provide different | |||
| than what the client assumed. | addressing or routing information than what the client assumed. | |||
| Note that it is possible for multiple proxied IP packets to be | Note that it is possible for multiple proxied IP packets to be | |||
| encapsulated in the same outer packet, for example, because a QUIC | encapsulated in the same outer packet, for example, because a QUIC | |||
| packet can carry two QUIC DATAGRAM frames. It is also possible for a | packet can carry more than one QUIC DATAGRAM frame. It is also | |||
| proxied IP packet to span multiple outer packets, because a DATAGRAM | possible for a proxied IP packet to span multiple outer packets, | |||
| capsule can be split across multiple QUIC or TCP packets. | because a DATAGRAM capsule can be split across multiple QUIC or TCP | |||
| packets. | ||||
| 7.2. Routing Operation | 7.2. Routing Operation | |||
| The requirements in this section are a repetition of requirements | The requirements in this section are a repetition of requirements | |||
| that apply to IP routers in general and might not apply to | that apply to IP routers in general and might not apply to | |||
| implementations of IP proxying that rely on external software for | implementations of IP proxying that rely on external software for | |||
| routing. | routing. | |||
| When an endpoint receives an HTTP Datagram containing an IP packet, | When an endpoint receives an HTTP Datagram containing an IP packet, | |||
| it will parse the packet's IP header, perform any local policy checks | it will parse the packet's IP header, perform any local policy checks | |||
| skipping to change at line 1535 ¶ | skipping to change at line 1536 ¶ | |||
| [TUNNEL-SECURITY]. Since there are known risks with some IPv6 | [TUNNEL-SECURITY]. Since there are known risks with some IPv6 | |||
| extension headers (e.g., [ROUTING-HDR]), implementers need to follow | extension headers (e.g., [ROUTING-HDR]), implementers need to follow | |||
| the latest guidance regarding handling of IPv6 extension headers. | the latest guidance regarding handling of IPv6 extension headers. | |||
| Transferring DSCP markings from inner to outer packets (see | Transferring DSCP markings from inner to outer packets (see | |||
| Section 10.3) exposes end-to-end flow level information to an on-path | Section 10.3) exposes end-to-end flow level information to an on-path | |||
| observer between the IP proxying endpoints. This can potentially | observer between the IP proxying endpoints. This can potentially | |||
| expose a single end-to-end flow. Because of this, such use of DSCPs | expose a single end-to-end flow. Because of this, such use of DSCPs | |||
| in privacy-sensitive contexts is NOT RECOMMENDED. | in privacy-sensitive contexts is NOT RECOMMENDED. | |||
| Opportunistic sending of IP packets (see Section 7.1) is not allowed | ||||
| in HTTP/1.x because a server could reject the HTTP Upgrade and | ||||
| attempt to parse the IP packets as a subsequent HTTP request, | ||||
| allowing request smuggling attacks; see [OPTIMISTIC]. In particular, | ||||
| an intermediary that re-encodes a request from HTTP/2 or 3 to | ||||
| HTTP/1.1 MUST NOT forward any received capsules until it has parsed a | ||||
| successful IP proxying response. | ||||
| 12. IANA Considerations | 12. IANA Considerations | |||
| 12.1. HTTP Upgrade Token Registration | 12.1. HTTP Upgrade Token Registration | |||
| IANA has registered "connect-ip" in the "HTTP Upgrade Tokens" | IANA has registered "connect-ip" in the "HTTP Upgrade Tokens" | |||
| registry maintained at <https://www.iana.org/assignments/http- | registry maintained at <https://www.iana.org/assignments/http- | |||
| upgrade-tokens>. | upgrade-tokens>. | |||
| Value: connect-ip | Value: connect-ip | |||
| Description: Proxying of IP Payloads | Description: Proxying of IP Payloads | |||
| skipping to change at line 1774 ¶ | skipping to change at line 1783 ¶ | |||
| [IPSEC] Kent, S. and K. Seo, "Security Architecture for the | [IPSEC] Kent, S. and K. Seo, "Security Architecture for the | |||
| Internet Protocol", RFC 4301, DOI 10.17487/RFC4301, | Internet Protocol", RFC 4301, DOI 10.17487/RFC4301, | |||
| December 2005, <https://www.rfc-editor.org/info/rfc4301>. | December 2005, <https://www.rfc-editor.org/info/rfc4301>. | |||
| [IPv6-ADDR] | [IPv6-ADDR] | |||
| Hinden, R. and S. Deering, "IP Version 6 Addressing | Hinden, R. and S. Deering, "IP Version 6 Addressing | |||
| Architecture", RFC 4291, DOI 10.17487/RFC4291, February | Architecture", RFC 4291, DOI 10.17487/RFC4291, February | |||
| 2006, <https://www.rfc-editor.org/info/rfc4291>. | 2006, <https://www.rfc-editor.org/info/rfc4291>. | |||
| [OPTIMISTIC] | ||||
| Schwartz, B. M., "Security Considerations for Optimistic | ||||
| Use of HTTP Upgrade", Work in Progress, Internet-Draft, | ||||
| draft-schwartz-httpbis-optimistic-upgrade-00, 21 August | ||||
| 2023, <https://datatracker.ietf.org/doc/html/draft- | ||||
| schwartz-httpbis-optimistic-upgrade-00>. | ||||
| [PROXY-REQS] | [PROXY-REQS] | |||
| Chernyakhovsky, A., McCall, D., and D. Schinazi, | Chernyakhovsky, A., McCall, D., and D. Schinazi, | |||
| "Requirements for a MASQUE Protocol to Proxy IP Traffic", | "Requirements for a MASQUE Protocol to Proxy IP Traffic", | |||
| Work in Progress, Internet-Draft, draft-ietf-masque-ip- | Work in Progress, Internet-Draft, draft-ietf-masque-ip- | |||
| proxy-reqs-03, 27 August 2021, | proxy-reqs-03, 27 August 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-masque- | <https://datatracker.ietf.org/doc/html/draft-ietf-masque- | |||
| ip-proxy-reqs-03>. | ip-proxy-reqs-03>. | |||
| [ROUTING-HDR] | [ROUTING-HDR] | |||
| Abley, J., Savola, P., and G. Neville-Neil, "Deprecation | Abley, J., Savola, P., and G. Neville-Neil, "Deprecation | |||
| skipping to change at line 1827 ¶ | skipping to change at line 1843 ¶ | |||
| Google LLC | Google LLC | |||
| 1600 Amphitheatre Parkway | 1600 Amphitheatre Parkway | |||
| Mountain View, CA 94043 | Mountain View, CA 94043 | |||
| United States of America | United States of America | |||
| Email: dschinazi.ietf@gmail.com | Email: dschinazi.ietf@gmail.com | |||
| Alex Chernyakhovsky | Alex Chernyakhovsky | |||
| Google LLC | Google LLC | |||
| Email: achernya@google.com | Email: achernya@google.com | |||
| Mirja Kuehlewind | Mirja Kühlewind | |||
| Ericsson | Ericsson | |||
| Email: mirja.kuehlewind@ericsson.com | Email: mirja.kuehlewind@ericsson.com | |||
| Magnus Westerlund | Magnus Westerlund | |||
| Ericsson | Ericsson | |||
| Email: magnus.westerlund@ericsson.com | Email: magnus.westerlund@ericsson.com | |||
| End of changes. 13 change blocks. | ||||
| 31 lines changed or deleted | 47 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||