As I have been touting my opinion that tunnelling is an indication of
deficiencies in the architecture, I want to express the reasons why I
believe so. Note that I am _not_ saying that tunnelling is _evil_.
Tunnelling is often fine as a short term solution, and sometimes also
as a longer term solution. However, independent of that, tunnelling
(almost) always indicates that the architecture does not provide
functionality that it should provide.
While there are different reasons for tunnelling, I basically believe
that all of them tend to be indications of faults in the
architecture, or sometimes people failing to understand or appreciate
the architecture. The only potential exception is when you one is
tunnelling a local-use lower-layer protocol, such as Ethernet, over a
wide area global protocol, such as IP, but even that case is
debatable, in my opinion. Also note that when one "tunnels"
something over a lower layer protocol, such as "tunnelling" IP over
MPLS, one is really misusing the terminology. Running a protocol
over a lower layer protocol is not really a case of tunnelling but
exactly the way a layered architecture is supposed to work.
Now, the forms of tunnelling that I consider are the following:
1. Tunnelling over the very same protocol; e.g., IP-over-IP
2. Tunnelling a protocol over one at the same layer;
e.g., IPv6 over IPv4
3. Tunnelling a global lower-layer protocol over a higher layer
protocol; e.g., IP over DNS, IP over UDP, or IP over HTTP
4. Tunnelling a local-scope lower-layer protocol over a global
high layer protocol; e.g. Ethernet over IP
Sure, there may be other cases, ones that I am missing, and my
argumentation may not apply to them.
Case 1: Tunnelling a protocol over itself
==========================================
Examples of this include IPsec in tunnel mode, GTP, and other forms
of IP-over-IP tunnelling. My basic concern with this kind of
tunnelling is that it enforces two different _semantics_ to a single
identifier space, and therefore makes the system more brittle.
Conversely, the architecture should provide functionality so that
such overloaded semantics and brittleness is not needed.
In the case of IPsec, tunnelling seems primarily to be used:
- to separate local, trusted address space from a global,
hostile address space
- to make sure that the local addresses are really
trustworthy, i.e., to prevent others from injecting
addresses with local addresses to the local network
- to hide the details of traffic between the tunnelled sites
However, those are not the root causes. To find the real reasons
behind tunnelling in this case we have to consider why people want to
split the address space in the first place? The reason seems to be
that we have no mechanism in the current architecture to provide
assurance that the source address of a packet really indicates its
real source. In other words, (source) addresses in the wild Internet
are not worth much, and therefore it is preferably to divide the
address space into trustworthy and non-trustworthy ones.
What comes to the desire to hide the details of the traffic, we have
to go somewhat deeper still. The IP architecture does not support IP-
level privacy, and I claim that it should. That is, it is far too
easy to use an IP address to figure out who are the parties
communicating. Adding IP-level privacy to the architecture requires
would require large changes, and therefore people might argue it
being a non-goal. Maybe so, but IMHO the existence of tunnelling,
even here, still indicates a deficiency. [NB: One way to add IP-
level privacy would be to have a separate cryptographically protected
identity layer on the top of IP layer, with build-in address-agility
(mobility) mechanism, and then start changing IP addresses on a
fairly fast cycle.]
Another reason for IP-over-IP tunnelling is mobility, e.g., in GTP
and the proposed NETLMM work. Both of them are, in my opinion,
indications that we are relying too much on IP addresses as
identifiers. Hence, they indicate deficiencies in the architecture
in the sense that locators should not be used for host
identification, thereby removing the need for keeping stable IP
addresses when a host moves to a topologically different location.
There are probably other reasons for tunnelling a protocol over
itself, too, but my gut feeling is that in each case a close analysis
will just reveal that the architecture is either deficient or is
missing some functionality that should be there. For example, I am
pretty confident that similar analysis could be applied to similar
tunnelling on other layers, such as tunnelling TCP with SSH.
So, tunnelling a protocol over itself is typically indication that
either a layer of indirection is missing (as in the case of mobility-
motivated tunnelling) or the layer in question does not provide the
required security functionality.
2. Tunnelling a protocol over a sister protocol at the same layer
=================================================================
In my mind the prime example of same-layer sister-protocol tunnelling
is IPv6-over-IPv4 tunnelling. In this case, what needs to be done is
adding a common layer either below or above the layer in question.
HIP is a good example of this; if HIP is used, no IP-cross-version-
tunnelling is needed since HIP runs equally on both of the two
versions of IP and even hides the difference from upper layer protocols.
3. Tunnelling a *global* protocol over an upper layer protocol
==============================================================
Example cases in this space are IP-over-DNS and the multiple ways of
tunnelling IP and other protocols over HTTP. AFAICT, almost always
the architecture is failing here in two ways simultaneously.
Firstly, people are using tunnelling to overcome what they feel as
overly restrictive security measures. Conversely, the security
methods that the administrators have placed there are failing due to
tunnelling. In my interpretation, these two sides of the coin both
indicate that the architecture is lacking suitable security
functionality.
Other common examples in this space include the various methods for
tunnelling protocols over UDP (and even TCP or not-quite-TCP) due to
NATs. Again, these are indications of a failure of the architecture,
in this case failure to respond to the shortage of addresses and/or
to accommodate NATs into the architecture.
4. Tunnelling a local (link layer) protocol over an upper layer protocol
========================================================================
The prime example in this space is tunnelling Ethernet over IP.
This is the only space where I think that tunnelling is often
appropriate. However, even here I am tempted to consider tunnelling
as a failure of the architecture. Basically, it is an indication
that there is a need to provide functionality that is available over
the local protocol (e.g. Ethernet) over wide area links. The failure
is that the functionality at hand is not available over the wide area
(global) protocol while it should be. However, this is a minor
issue, and more often an implementation issue than really an
architectural issue.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
So, my claim is that tunnelling is (almost) always an indication that
the architecture has one or more of the following deficiencies:
1. A layer (of indirection) is missing
2. Some security functionality is missing
3. The architecture has failed to provide sufficient resources
4. Some functionality is provided at or on-the-top-of a wrong layer
All of the discussion above is really architectural in nature. The
starting point is the layering model, and the discussion is mostly
about how the layering fails and what are the reasons, in each case,
for the failure.
There are also technical reasons to resist tunnelling and try to
pursue people to work on alternative solutions. Pekka Savola
discussed some of these at the INT area meeting on Monday, including
problems with fragmentation and wasting resources. However, I'd
prefer to keep that discussion separate and focus in this thread only
on the architectural issues.
--Pekka
_______________________________________________
Int-area mailing list
[email protected]
https://www1.ietf.org/mailman/listinfo/int-area