Restricted entry (helper) nodes in 0.1.1.x

Roger Dingledine arma at
Sat Dec 24 06:07:39 UTC 2005

Lasse wrote:
> I am a bit concerned with performance if we are to have e.g. two out of
> three helper nodes down or unreachable. How often should Tor check if
> they are back up and running?

Right now Tor believes a threshold of directory servers when deciding
whether each server is up. When Tor observes a server to be down
(connection failed or building the first hop of the circuit failed),
it marks it as down and doesn't try it again, until it gets a new
network-status from somebody, at which point it takes a new concensus
and marks the appropriate servers as up.

According to sec 5.1 of dir-spec.txt, the client will try to fetch a new
network-status at least every 30 minutes, and more often in certain cases.

With the proposed scheme, we'll also mark all our helpers as up shortly
after the last one is marked down.

> When should there be
> added an extra node to the helper node list? This is kind of an
> important threshold?

I agree, this is an important question. I don't have a good answer yet. Is
it terrible, anonymity-wise, to add a new helper every time only one of
your helpers is up? Notice that I say add rather than replace -- so you'd
only use this fourth helper when one of your main three helpers is down,
and if three of your four are down, you'd add a fifth, but only use it
when two of the first four are down, etc.

In fact, this may be smarter than just picking a random node for your
testing circuit, because if your network goes up and down a lot, then
eventually you have a chance of using any entry node in the network for
your testing circuit.

We have a design choice here. Do we only try to use helpers for the
connections that will have streams on them (revealing our communication
partners), or do we also want to restrict the overall set of nodes that
we'll connect to, to discourage people from enumerating all Tor clients?

I'm increasingly of the belief that we want to hide our presence too,
based on the fact that Steven and George and others keep coming up with
attacks that start with "Assuming we know the set of users".

If so, then here's a revised "How to deal with network down" section:

  1) When a helper is marked down or the helper list shrinks, and as
     a result the total number of helpers that are either (up and
     reachable) or (reachable but never connected to) is <= 1, then pick
     a new helper and add it to the end of the list.
     [We count nodes that have never been connected to, since otherwise
      we might keep on adding new nodes before trying any of them. By
      "reachable" I mean "is allowed by ReachableAddresses".]
  2) When you fail to connect to a helper that has never been connected
     to, you remove him from the list right then (and the above rule
     might kick in).
  3) When you succeed at connecting to a helper that you've never
     connected to before, mark all reachable helpers earlier in the list
     as up, and close that circuit.
     [We close the circuit, since if the other helpers are now up, we
      prefer to use them for circuits that will reveal communication

This certainly seems simpler. Are there holes that I'm missing?

> If running from a laptop you will meet different firewall settings, so
> how should Helper Nodes settings keep up with moving from an open
> ReachableAddresses to a FascistFirewall setting after the helper nodes
> have been selected?

I added the word "reachable" to three places in the above list, and I
believe that totally solves this question.

And as a bonus, it leads to an answer to Nick's attack ("If I pick
my helper nodes all on*, then I move, you'll know where I
bootstrapped") -- the answer is to pick your original three helper nodes
without regard for reachability. Then the above algorithm will add some
more that are reachable for you, and if you move somewhere, it's more
likely (though not certain) that some of the originals will become useful.
Is that smart or just complex?

> What happens if(when?) performance of the third node is bad?

My above solution solves this a little bit, in that we always try to
have two nodes available. But what if they are both up but bad? I'm not
sure. As my previous mail said, we need some function, given our list
of helpers and the network directory, that will tell us when we're in a
bad situation. I can imagine some simple versions of this function --
for example, when both our working helpers are in the bottom half of
the nodes, ranked by capacity.

But the hard part: what's the remedy when we decide there's something
to fix? Do we add a third, and now we have two crummy ones and a new
one? Or do we drop one or both of the bad ones?

Perhaps we believe the latest claim from the network-status concensus,
and we count a helper the dirservers believe is crummy as "not worth
trying" (equivalent to "not reachable under our current ReachableAddresses
config") -- and then the above algorithm would end up adding good ones,
but we'd go back to the originals if they resume being acceptable? That's
an appealing design. I wonder if it will cause the typical Tor user to
have a helper node list that comprises most of the network, though. I'm
ok with this.

> Another point you might want to keep in mind, is the possibility to
> reuse the code in order to add a second layer helper node (meaning node
> number two) to "protect" the first layer (node number one) helper nodes.
> These nodes should be tied to each of the first layer nodes. E.g. there
> is one helper node list, as described in your mail, for each of the
> first layer nodes, following their create/destroy.

True. Does that require us to add a fourth hop to our path length,
since the first hop is from a limited set, the second hop is from a
limited set, and the third hop might also be constrained because, say,
we're asking for an unusual exit port?

> Another of the things might worth adding to the to do list is
> localization of server (helper) nodes. Making it possible to pick
> countries/regions where you do (not) want your helper nodes located. (As
> in "HelperNodesLocated us,!eu" etc.) I know this requires the use of
> external data and may not be worth it, but it _could_ be integrated at
> the directory servers only -- adding a list of node IP's and e.g. a
> country/region code to the directory and thus reduce the overhead. (?)
> Maybe extending the Family-term?

I think we are heading towards doing path selection based on geography,
but I don't have a good sense yet of how that will actually turn out --
that is, with what mechanism Tor clients will learn the information they
need. But this seems to be something that is orthogonal to the rest of
this discussion, so I look forward to having somebody else solve it for
us, and fitting it in when it's ready. :)

> And I would like to keep an option to pick the first X helper nodes
> myself and then let Tor extend this list if these nodes are down (like
> EntryNodes in current code). Even if this opens up for some new types of
> "relationship" attacks.

Good idea. Here's how I'd like to name these:

The "EntryNodes" config option is a list of seed helper nodes. When we
read EntryNodes, any node listed in entrynodes but not in the current
helper node list gets *pre*pended to the helper node list.

The "NumEntryNodes" config option (currently called NumHelperNodes)
specifies the number of up, reachable, good-enough helper nodes that
will make up the pool of possible choices for first hop, counted from
the front of the helper node list until we have enough.

The "UseEntryNodes" config option (currently called UseHelperNodes)
tells us to turn on all this helper node behavior. If you set EntryNodes,
then this option is implied.

The "StrictEntryNodes" config option, provided for backward compatibility
and for debugging, means a) we replace the helper node list with the
current EntryNodes list, and b) whenever we would do an operation that
alters the helper node list, we don't. (Yes, this means that if all the
helper nodes are down, we lose until we mark them up again. But this is
how it behaves now.)

> I am sure my next point has been asked before, but what about testing
> the current speed of the connections when looking for new helper nodes,
> not only testing the connectivity? I know this might contribute to a lot
> of overhead in the network, but if this only occur e.g. when using
> helper nodes as a Hidden Service it might not have that large an impact,
> but could help availability for the services?

If we're just going to be testing them when we're first picking them,
then it seems we can do the same thing by letting the directory servers
test them. This has the added benefit that all the (behaving) clients
use the same data, so they don't end up partitioned by a node that
(for example) performs selectively for his victims.

Another idea would be to periodically keep track of what speeds you get
through your helpers, and make decisions from this. The reason we haven't
done this yet is because there are a lot of variables -- perhaps the
web site is slow, perhaps some other node in the path is slow, perhaps
your local network is slow briefly, perhaps you got unlucky, etc.  I
believe that over time (assuming the user has roughly the same browsing
habits) all of these would average out and you'd get a usable answer,
but I don't have a good sense of how long it would take to converge,
so I don't know whether this would be worthwhile.

> BTW. I feel confortable with all the terms helper/entry/contact nodes,
> but I think you (the developers) should just pick one and stay with it
> to avoid confusion.

I think I'm going to try to co-opt the term 'Entry' node for this
purpose. We're going to have to keep referring to helper nodes for the
research community for a while though, so they realize that Tor does
more than just let users ask for certain entry nodes.


More information about the tor-dev mailing list