Hi, David,
Responses below inline…
Joe On Apr 17, 2023, at 1:49 PM, David Schinazi <dschinazi.ietf@xxxxxxxxx> wrote:
Hi Joe, thank you for your review. Responses inline. David On Fri, Apr 14, 2023 at 8:29 PM Joseph Touch via Datatracker < noreply@xxxxxxxx> wrote: Reviewer: Joseph Touch Review result: Not Ready
This review focuses on the behavior of the tunnel from an IP perspective. The HTTP aspects are not considered.
In summary, the document presents a method for tunneling IP packets over an HTTP connection. Its terminology and discussion is confusing, being presented largely from the perspective of the HTTP mechanism and not sufficiently from the perspective of the resulting IP tunnel that is provided. Details are provided below.
--
The terminology is confusing. Because HTTP is a client/server protocol, it makes sense to refer to a web (or HTTP) proxy, a single entity that acts as both server and client, relaying requests received on the server side and initiating them on the client side. An IP proxy would relay datagrams received on one IP address and issue them with at least some new addressing. What appears to be described here is way to create an IP tunnel over a web connection, which is not a proxy. It is (and should be called) just an IP tunnel. The web client and server are not co-located as they are in a proxy; the term proxy is nonsensical in this context.
The target audience for this document is HTTP implementers, since you need an HTTP stack in order to implement this. Because of this, it is more helpful to use HTTP terminology instead of tunneling terminology.
The target audience needs to consider both implementers and intended users. Sec 4.6 indicates that ipproto can be any number in [IANA-PN]; this is not consistent with the document title or remainder of the document description. That list is of protocols that can be payloads of IP packets, not of IP protocols - e.g., IPv6 is not 6 but 41, and when it is 41 it describes IPv6 as a payload of an outer IP packet, not an IPv6 packet. There does not appear to be a way to indicate the outermost IP packet protocol version, e.g., https://www.iana.org/assignments/version-numbers/version-numbers.xhtml. The claim that implementations MUST walk the chain of extensions to find the protocol is unboundeded as stated; it needs to be limited, e.g., it needs to stop at the first non-IP protocol (e.g., it should not “find” TCP in IP in UDP in IP, if limited to protocol=6).
I don't understand what you mean here. IPv6 extension headers all contain the Next Header field, but IP protocols like TCP and UDP do not. So the scenario that you describe of "UDP in TCP" isn't possible given the wire format.
Let’s break this into separate parts.
The first issue is that you never specify the IP header - IPv4 or IPv6. The [IANA-PN] could be 41. Here are two packets you could receive:
a) IPv4 containing UDP b) IPv4 containing IPv4 containing UDP c) IPv4 containing IPsec containing IPv4 containing UDP
Does 4 match a), b), c), or some combination?
What about these:
d) IPv6 containing UDP e) IPv6 containing IPv6 containing UDP f) IPv6 containing IPsec containing IPv6 containing UDP
Does 41 match e), f), or both?
And how do you match a) and not d) [given only IP protocols are checked, not the first IP header)?
—
As to the chain issue, it might suffice to specify “chain of IPv6 extension headers”.
Note that this also raises a further concern, that of the utility of an IP tunnel. The Internet is composed of links and tunnels emulate links. This document appears to describe tunnels that can be limited to specific types of IP packets, but it overlooks the outermost IP packet version. It also overlooks support for non-IP protocols that are critical to IP operation, e.g., for IPv4, these include ICMP and ARP. If an “IP proxy” were limited to protocol 6 (TCP), it would block ICMP (which protocol 1) and ARP (which isn’t an IP packet at all).
ARP is not required to use an IP tunnel. The tunnel endpoints do not have MAC addresses, so there is no need for ARP's translation of IP to MAC.
Understood.
Note that this is also inconsistent with the ROUTE_ADVERTISEMENT capsule as described in Sec 4.7.3, which asserts that ICMPs are exceptions to the indicated protocol (at a minimum, this needs to be noted here as well).
Good catch! This is somewhat mentioned in security considerations but I added a sentence to the Scoping section:
Sec 4.7, although defining new capsules, is really about tunnel configuration. It should be moved to a top-level section and presented as such.
Except for Sec 4.7, which explains how IP addresses and routing can be obtained over the HTTP connection, the document views the necessary behavior from only the perspective of the tunnel ingress as an HTTP client and the tunnel egress as an HTTP server.
That's not right, most of the document is written in terms of "IP proxying endpoints" because most of the mechanisms are symmetric. Do you have a specific example?
The abstract, which talks about the server acting a proxy but not the client:
...this document defines a protocol that allows an HTTP client to create an IP tunnel through an HTTP server that acts as an IP proxy
Sec 2 definitions, again focusing on the behavior of the server, not the client:
In this document, we use the term "IP proxy" to refer to the HTTP server that responds to the IP proxying request.
Sec 7 describes clients sending packets to servers; I could not easily locate the converse:
Clients MAY optimistically start sending proxied IP packets ...
It is missing the way in which these ingress/egress components are viewed a their endpoints, e.g., to be useful as an IP tunnel, these need to appear as attached to (possibly virtual) network interfaces, i.e., to appear as a link, which allows them to then be used for local processes (via sockets), packet forwarding, etc.
That's an implementation detail that doesn't belong in this document. Most implementations will indeed use virtual TUN interfaces, but it's not a requirement. There is a known implementation with transport protocols in userspace that doesn't do what you describe.
Whether a TUN interface is used or some other method, there needs to be a method by which these applications (client, server) present something that accepts IP packets.
That aspect of how this is actually used is ignored and needs to be addressed. It does not need to be implementation specific, but it would not hurt to give an example like TUNs.
(The fact that other user-space IP systems ignore this issue is not rationale for this document also ignoring it)
E.g., the mechanism in Sec 4.7 is only one way that endpoints may be configured; others should be discussed – including using DHCP or IPv6 RAs over the tunnel itself.
We support assigning addresses out of band (e.g., in a config file) but don't see the need for DHCP or RAs through the tunnel.
As an IP tunnel, it needs to consider the possibility that it would transit any IP traffic.
As an IP device, there needs to be a description of how existing IP configuration would interact with the additional mechanism supported here.
Sec 7 explains many aspects of IP packet handling that are already sufficiently described in RFCs 1122 and 1812 (for IPv4) and 8200 (for IPv6). That section unnecessarily repeats that detail and is also vague as to where particular behaviors are to be realized. I.e., parsing the IP header, hopcount processing, and packet forwarding. The document should just clearly state that tunnels behave as links (as explained in draft-ietf-intarea-tunnels) and the rest of processing happens *outside* the HTTP server as defined for a host or router.
Where the code lives is an implementation detail that we don't need to constrain.
Sec 7 implies that the tunnel does the TTL decrementing, relaying between addresses, and IP packet checking.
Those are functions defined in RFC1122 and 1812 as happening in endpoints and/or routers, not inside tunnels or links. Those documents do constrain when those functions happen in Internet devices; this document needs to adhere to those constraints. This isn’t an implementation detail; it’s an architectural constraint.
It seems incorrect to design these tunnels as something less than a typical IP interface, esp. for IPv6 (autoconfig, neighbor discovery). Doing so only serves to invite incompatibility and/or undermine existing mechanisms that are useful in detecting misconfiguration (e.g., duplicate address detection). If there is believed to be a technical justification for this limitation, the argument needs to be presented and its implications reviewed (e.g., an IPv6 tunnel that isn’t a true IPv6 interface may not be useful as an IPv6 tunnel).
The WG members who are implementing this don't have a need for a true IPv6 interface. IKEv2 made the same design choice and it's been working fine.
IPsec has made other decisions that undermine the way in which tunnels interact with routing (RFC3884), so it’s not an example of tunnels I use other than as a cautionary tale.
At a minimum, this document needs to address the lack of these capabilities and the rationale for making that decision.
The end of section 7 on link MTUs needs to address the additional requirement of IPv6 EMTU_R of 1500 bytes.
Source fragmentation and reassembly need to be addressed for both IPv4 and IPv6, and path-fragmentation for IPv4 (unless it is not supported, which needs to be noted).
I'm not sure we need to go into these details that are well covered by IP RFCs.
This document doesn’t explain where this would happen - similarly to TTL decrement, NOT inside the client or server. That needs to be made clear. Sec 8 should be clear on what entity is responsible for ICMP packet generation and receipt. This presumably should be the HTTP endpoint device, not the HTTP client or server. I.e., the tunnel transits ICMP packets but tunnel endpoints should neither generate nor consume them, just like any other link.
Similar to above, where the code lives is an implementation detail.
If you implement the code inside the application, it will never handle ICMPs properly for packets that could be routed between this tunnel and other interfaces the way it should.
See Sec 3.2 of draft-ietf-intarea-tunnels
This is about the difference between a tunnel, an endpoint, and a router. A tunnel connects to and endpoint or a router; a tunnel itself is neither an endpoint nor a router. Only endpoints and routers emit ICMPs. There’s no way to handle ICMP properly inside the tunnel - it does matter where the code resides because the code context is inside the tunnel.
As other reviewers have noted, Sec 10 on nested congestion control is quite thin. The current statement is equivalent to “if you KNOW congestion is nested, turn it off” – it should be the opposite, i.e., “turn congestion ON only if you KNOW congestion is NOT nested”.
Fair enough. We're tweaking that section to be more permissive:
It’s not about allowing congestion control to be disabled; that needs to be a SHOULD, with the caveat that when it is not, performance can suffer in ways that are difficult to predict.
Section 11.1 refers to fragmented packets; it should refer to them as not being able to be “re-fragmented”; source-generated fragments are still fragmented and can cross the tunnel subject to the tunnel MTU.
The use of "fragmented" in that section refers to QUIC datagram frames, which cannot be fragmented - this isn't about IP fragmentation.
The section talks about whether IP packets can fit inside QUIC datagram frames.
Fragmentation of those packets can - and will - happen when those packets are generated on the host where the packets enter the tunnel, unless the host decides to force “don’t fragment” on those packets. That’s a decision that happens (could happen or should happen, depending on your viewpoint) before the packets ever get to the tunnel ingress.
On-path fragmentation of IPv4 packets relayed to the IP proxy happens (could happen or should happen, again depending on your viewpoint) before those packets ever get to the tunnel ingress.
Either of those can happen - even if QUIC datagrams sit inside IP packets with DF=1 (or IPv6) that are also not source fragmented.
Section 11.1 should require that the IP tunnel be created with a given MTU and to indicate that to the endpoint where the client/servers reside; issuing ICMP PTBs is the responsibility of those endpoints when they are seeking to use those tunnel endpoints, NOT of the tunnel endpoint itself. Tunnels are links; links do not issue ICMPs.
This use of ICMP is a pragmatic solution to ensure that the link doesn't violate the minimum IPv6 link MTU. Some working group members felt strongly that we needed a solution for this.
It is incorrect. ICMPs can be issued by hosts or routers, but not by links (tunnels). Again, see draft-ietf-intarea-tunnels sec 3.2 as to why.
The solution is to explain how this IP tunnel ties into the end hosts or router - again, that’s the gap in this document.
Sec 12 should indicate how access to the HTTP proxy itself should be access limited, i.e., to avoid presenting an arbitrary traffic injection point.
Are you talking about things like <<don't set your root SSH password to "password">>?
Not quite; it’s more like “don’t run root SSH with no password”.
Regardless, it creates a huge DOS opportunity - how is the endpoint protected? It should also address the potential use of HTTP-level encryption (e.g., TLS, DTLS) to protect the tunnel contents and tunnel configuration exchanges.
We require the scheme to be https, which means that QUIC or TLS is mandatory.
I see that in the examples, but it doesn’t appear to be a requirement anywhere. Can you indicate where it explains that “http://…” would be considered invalid or that ONLY “https” can be used to start?
--
|