One point that has came up several times, in various forms, in
the DDoS discussion is the idea of mandating some sort of source
address filtering, ingress filter, PRF of whatever it is called.
For example, Glenn Morrow expressed it as follows:
> I would like to again float the idea that perhaps some sort
> of filtering on source address should be mandated on the first hop.
Let me try to explain why I _think_ that source address filtering
is a bad idea, and what I _think_ that should be done instead.
This is a lenghty message since I need to go quite deep into
the basics before I get to the point; my apologies. To clarify,
I am not trying to take sides, and I don't have any personal
_opinion_ on this issue, at least not yet :-) I am sure that
some of my points have been raised several times before, but
here we go anyway. This message is divided in three parts:
A. Discussion about source address filtering
B. A comparison between source and destination addresses
C. My thoughts what should be done instead
A. Discussion about source address filtering
Now, according to my analysis, currently there are basically three
functional reasons for including the source address into IPv6 packets.
1. Source addresses are needed to be able to reply to
packets, such as unconnected UDP queries or TCP SYN packets.
2. Source addresses are needed to be able to report
back error conditions, e.g., ICMP Packet Too Big.
3. Source addresses are used for identifying upper layer
endpoints, e.g., to differentiate between TCP sockets.
It is instructive to note that in the two first cases the
source address is really needed, but in the last case it
is merely a convenient piece of information that could be
easily replaced with something else identifying the remote
endpoint (compare e.g. to HIP).
Now, mandating source address filtering attempts to add another
purpose for the source address; a purpose that I don't believe
could ever be really reliable.
4. Source addresses identify the interface through
which the packet was originated. (FALSE)
Maybe this was the original intention of the source address,
but to me it seems like the infrastructure has never really
supported this allusion. Furthermore, it is instructive to
note that even with honest nodes the source addess does not
always identify the sender. For example, some neighbour
solicitation packets carry the unspecified source address, etc.
Furthermore, even strict and mandatory ingress filtering does
not quite achieve the maxim -- if the filtering was perfect, it
would at most lead to a situation where the source address
identifies the source link of the packet, not the specific
interface at the link.
Even further, I think that there are several reasons why
even trying to achieve this illusion is a bad idea.
a) Since source address filtering would be a piece of
functionality whose malfunction does not have any immediate
local effects, I have hard time believing that we would
ever get even 90% coverage.
b) Taking the trend described at the open plenary on
Wednesday evening, i.e. internet turning more and more
into a densely connected mesh instead of being more-or-less
hierarchical tree, employing source address filtering in
any other place but the ingress router would be quite hard
operationally, and hard even at the ingress routers. We have
already seen this in the various multihoming discussions.
c) Being mandated (but not working properly), it would
encourage people to trust the source address even more
that they do today.
B. Comparison between source and destination addresses
IMHO, on instructive point of view is to compare the functions
of the source and destination addresses. Most people seem to
believe, perhaps even unconsciously, that source and destination
addresses are functionally equivalent. That is, it seems to be
common thinking that the destination address identifies the
destination interface(s) of the packet and the source address
identifies the source interface of the packet. As we know,
this is not true. Now, the question is whether we should aim
to make it true again (if it ever was) or should we abandon
that thinking altogether.
Let us consider the semantics in detail. The destination address
has semantical meaning to the routing system. We rely on the
integrity of routing information in order to get the packets to
their intended recipients. This is inherent in the nature of
the routing system. That is, the destination address or at least
the routing part of the destination address must be "correct"
for the packet ever have any changes to get delivered.
The source address does not (currently) have any such semantics.
It is just set by the sender, and used by the receiver. The only
case when an intermediate router cares about it is when it wants
to send an error report back. However, this latter practice does
not seem to be such a good idea, since the source address does not
necessarily carry information about the real sender of the packet.
In short, the practise greatly eases reflection DDoS attacks, since
you can fairly easily employ many of the routers in the infrastructure
to act as reflectors. (Just mix routing headers and hop-by-hop options.)
Furthermore, as I already pointed out, asymmetric routing, multihoming,
and mobility are all reasons why the source address should
not carry such semantics. To say this in other words, I think that
the source address should not be called "source" address but
"reply-to" address. That would be more accurate from the semantic
point of view, since it merely indicates the sender's request where
to send replies instead of identifying the real source of the address.
C. My thoughts what should be done instead
I know this is a radical idea and that it is probably too late to
propose this, but I think that we should deprecate the source
address in the IPv6 header altogether. Instead, we should use
a separate destination option, perhaps "Reply-To Address Destination
Option", whenever we assume that the recipient may not know where
to send the replies. Please note that if we use end-to-end IPsec,
we never need to use this option, and that any other TCP packets
but the first SYN packet would not need to carry it either.
Depracating the source address field from it current use would
free it for other purposes. My suggestion is that the main function
would be to use it for _recording_ the path of the packet. That is,
each router that touches the packet would (perhaps probabilistically)
somehow record its identity into the source address field. Thus,
the source address field would no longer be a source address field
but a source path field.
This would have several benefits. First, those that believe in ingress
filtering would perhaps be happy with the recorded packet path information.
Second, those not believing in ingress filtering would be happy, too,
since packets would not have to be dropped. Third, one could easily
make the reply-to address private by including the destination option
within an ESP header. Fourth, ICMP error reports generated by intermediate
routers would be sent along the source path instead of relying on the
perhaps false source address. (This might require some modifications
to the error reporting functionality, but I think that wouldn't be
that hard.)
I know that it would be virtually impossible to employ such a drastic
change to the architecture at this point. However, maybe this
suggestion could work as a source of ideas for some not-so-drastic
approach.
--Pekka
--------------------------------------------------------------------
IETF IPng Working Group Mailing List
IPng Home Page: http://playground.sun.com/ipng
FTP archive: ftp://playground.sun.com/pub/ipng
Direct all administrative requests to [EMAIL PROTECTED]
--------------------------------------------------------------------