Hello,
I'm doing a review of draft-ietf-anima-constrained-join-proxy-02; below part 1
of my review comments. The remainder will follow soon hopefully.
Note that I did not make or work with an implementation of this draft but I
have experience with similar proxy implementations: for example OpenThread
(https://github.com/openthread/openthread) uses one. And I've worked with an
implementation that uses a proxy to a BRSKI Registrar
(https://github.com/openthread/ot-registrar/).
So it is definitely a useful document and an essential component of any
constrained BRSKI solution for wireless mesh networks.
General throughout text:
The terms "Pledge" and "joining device" and ""joining" device" are all used -
this could be harmonized to a single term to be sure what we're talking about.
What about using "Pledge" for all?
Abstract
“replacing the Circuit-proxy by a stateless/stateful constrained (CoAP) Join
Proxy. It transports join traffic from the pledge to the Registrar without
requiring per-client state”
-> may be confusing; first it looks like we define both stateless and stateful
versions. But the last sentence implies always stateless?
- the word "relay" may be useful to add somewhere in the abstract, as the proxy
relays DTLS records between Pledge and Registrar.
1. Introduction
“The {I-D.ietf-anima-constrained-voucher} describes the BRSKI extensions to the
Registrar.”
-> this should be updated to the latest scope of this referenced draft. It
describes also Pledge behavior, not only Registrar. This is now called the
Pledge - Registrar part of the protocol ("BRSKI-EST") .
-> We could clarify here that in {I-D.ietf-anima-constrained-voucher} BRSKI is
also being extended with CoAP and DTLS.
- the word "relay" may be useful to add somewhere in the introduction, as the
proxy relays DTLS records between Pledge and Registrar.
"A new "joining" device can only initially use a link-local IPv6 address to
communicate with a
neighbour node using neighbour discovery [RFC6775] until it receives the
necessary network configuration parameters. "
-> the part about "using neighbour discovery" I don't fully understand and is
in general incorrect. The OpenThread implementation allows for example a Pledge
to use Mesh Link Establishment (MLE, draft-ietf-6lo-mesh-link-establishment-00)
communication to initiate discovery and linking with peer nodes. There's no ND
used. And with a link-local address the Pledge can also use other protocols
like UDP or DTLS-over-UDP in principle, anything link-local would be possible.
Most of this traffic of course won't be accepted by nodes in the mesh network
due to security reasons. But a protocol may define some specific use cases
where link-local UDP (or other protocols) are accepted without requiring the
Pledge to use ND in any way. Again in OpenThread as an example, DTLS-over-UDP
is used to do the handshake via the proxy/relay without ever using ND.
- Section 1 would need to have some text about the stateful/stateless
solutions, too. I know this is said in Section 5 as well, but typically an
introduction is meant to guide the reader into what can be expected in the rest
of the document and this incurs some overlap of topics necessarily.
4. Join Proxy functionality
"assuming appropriate credentials are exchanged out-of-band, e.g. a hash of the
Pledge (P)'s raw public
key could be provided to the Registrar (R)."
-> I don't understand this, why is this assumption necessary? Can't we just
assume the BRSKI case that P contains an IDevID and R may know nothing yet
about P ?
(or, it may know a serial number of P but not yet the complete IDevID.) R
learns the identity of P during the DTLS handshake that involves R learning
about the IDevID.
Figure 1 and explanation -> we may also add that a Registrar can be located
externally to the mesh. So, not necessarily on-mesh as the figure seems to
suggest.
"EST Server" -> better replace with the introduced term "Registrar" to keep
consistency.
This section defines the overall architecture and has the deployment diagram.
So this would be a good section to consider the most common deployment cases,
like:
A) Pledge -> stateful JP -> Registrar
B) Pledge -> stateless JP -> Registrar
C) Pledge -> stateless JP -> Registrar-Proxy -> Registrar
The latter C) I've added here to illustrate what could be deployed. Since the
Registrar may be a "classic" Registrar per constrained-BRSKI that only serves
DTLS on port 5684 and knows nothing about the JPY message format introduced in
Section 5.2. In this case another proxy is required which I call
"Registrar-Proxy" that translates JPY messages back to regular DTLS towards the
existing/legacy Registrar. Note that the Registrar-Proxy may reside at the
same IP host as the Registrar, albeit at a different UDP port (not 5684) - this
is then very similar to the case B).
It would be good to have some of these deployment considerations. The benefit
of C) is that any 'stateful' operations are moved out of the mesh network to
the Registrar-Proxy which resides typically on a powerful IP host outside the
mesh. Any constrained devices only implement stateless JP.
5. Join Proxy specification
Two modes are introduced here; it may be clarified that a Join Proxy MUST
implement at least one of these two. (There may be implementations that can do
both, or can switch to the right model to use based on some network
configuration. But in typical cases a network standard only implements one of
the two ways.)
5.1 Statefull Join Proxy
"The Join Proxy has has been enrolled via the Registrar and consequently knows
the IP address and port of the Registrar. "
-> this is not the case typically. The Join Proxy itself previously enrolled
through another Join Proxy, without knowing the IP address of the Registrar!
There may be a mechanism to send the IP address of the Registrar to a Pledge
after it has onboarded but we can't be sure that this is the case. It is not
specified. And the way a Join Proxy learns about the Registrar's IP address (or
hostname!) would be specific to the type/standard of 6lowpan network used.
There are many flavours of it.
"The Pledge first discovers and selects the most appropriate Join Proxy.
(Discovery can be based upon [I-D.ietf-anima-bootstrapping-keyinfra] section
4.3 ..."
-> The discovery method for the Pledge is described in Section 4.1, not 4.3.
"The Join Proxy changes the IP packet (without modifying the DTLS message) by
modifying both
the source and destination addresses to forward the message to the intended
Registrar."
-> The IP addresses of an IP packet should preferably not be changed in
transit. A link-local destined packet from the Pledge also does not travel
beyond the local link normally.
Perhaps it is better described as the Proxy creating a new IP message, with new
source/destination addresses. The new message then contains the relayed DTLS
record. This is conceptually more in line with the IPv6 addressing
architecture.
Whether we should call this NAT or not, is another question. For me personally
I would just avoid calling it NAT. (E.g. I don't think any NAT would translate
a link-local address to a global scope address.)
"Global IP address" -> used in the figure; it may be sufficiently clear already
that this may be a ULA or GUA type address. Optionally this could be clarified
in the Terms section what "global IP address" means, but if others disagree we
don't need to add this.
Figure: the middle of the figure now has ":" characters, here we could add a
generic statement like "<further DTLS messages>" or so.
-> caption of the figure could add 'DTLS' here, so "... DTLS joining message
flow ..."
Best regards
Esko
_______________________________________________
Anima mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/anima