update on Tahoe/Tor/Foolscap integration
Brian Warner
warner at lothar.com
Fri Aug 28 22:53:10 UTC 2015
We had a couple of meetings this week to talk about Tor. The current
plan is to switch to a more "static" node configuration process, meaning
that any (port, IP address, onion address) allocation will happen during
"tahoe create-node", so everything will be nailed down by the time
"tahoe start" happens and the Node object is created. This should
simplify Tahoe's startup code, and will allow some configuration errors
to be signalled (to stdout) before "tahoe start" exits (rather than only
appearing in the logfile).
The biggest consequences of this cleanup are:
* "tahoe create-client" won't listen on a socket at all[1]
* When you run "tahoe create-node" to make a server, you must choose a
port to listen on, and must provide the hostname+port to advertise to
other clients. Previously these were computed automatically.
We'll maintain backwards-compatibility for nodes that currently use
automatic IP-address detection (where tahoe.cfg's "tub.location" has
"AUTO" or is omitted), but for new nodes, "tahoe create-node" will
complain if you omit the new --listen and --location arguments.
The general plan is:
* "tahoe create-client/create-node" acquires --listen and --location,
which get written into tahoe.cfg directly.
* They also acquire some new Tor-related arguments. We're not sure what
they should be just yet.. these are placeholder names.
* --tor-only: don't use plain TCP to talk to anybody
* --listen-on-tor: please allocate a hidden service, and advertise an
.onion address
* --tor-socksport=: here is a SOCKS port you can use to talk to
regular IP addresses, as well as .onion hidden-services
* --tor-controlport=: use this to control a pre-existing Tor daemon
* --tor-executable=: here is a /usr/bin/tor, please launch it
* Any hidden services or listening ports or whatever will be figured out
while create-client/create-node runs, and the results will be written
into tahoe.cfg (and other state files underneath ~/.tahoe/). At
runtime, the Tahoe node might launch Tor, but it doesn't need to
reconfigure it.
There'll be one set of arguments that make it possible to use tor:
either instructions to launch a new executable, or a way to reach an
existing executable. If these arguments are missing, that means we don't
have Tor, and won't be able to use Tor-only servers.
There'll be another argument that says we care about the anonymity of
our node, which means the storage server should listen on a hidden
service instead of a regular TCP port, and we should strictly use Tor
for all outbound connections.
We need to write up the main use cases and make sure we've got a
combination of arguments for each.
## Foolscap tasks:
* specify client plugin API
* write "default" (TCP) plugin
* deprecate/remove setLocationAutomatically
* add allocate_port() function
## Tahoe tasks:
* move controlport/logport to a separate tub, with a separate key, add
config knob to control its listen/location, maybe use 127.0.0.1 and
allocate_port()
* replace keyserver/stats-gatherer/tests use of
Tub.setLocationAutomatically with something else
* tub.location=AUTO: replace async (twisted.internet.subprocess) with
sync (stdlib.subprocess), move call from Node._setup_tub to
Node.create_tub. Move Tub.setLocation to create_tub. Replace
when_tub_ready() with sync calls.
* (maybe) change "tahoe create-client/node" to run reactor, if it needs
to allocate a port (maybe for the logport/controlport?)
* change "tahoe create-client" to make a tahoe.cfg that doesn't listen
on anything
* change "tahoe create-node" to require --listen and --location
* change "tahoe create-node" to handle the tor arguments
* add Tor support to the main tahoe code: launch Tor if necessary,
configure and install the Foolscap plugins if necessary
* (after create-node changes are done): remove write to
Node._portnumfile
## Other tasks:
* figure out overrides for specific servers: either build a foolscap
client plugin that knows how to look up the override rules to decide
whether a given connection hint should use TCP or Tor, or use multiple
Tubs (one with the Tor plugin, and one without). We need a syntax for
the rules file, and some sane behaviors to follow when merging these
rules with data we get from the introducer.
## More Info
* Foolscap #236 covers the foolscap-side items.
* Tahoe #517 covers the Tahoe-side items.
* Tahoe #1010 is specifically about the "protect me" flag, which will
probably not be spelled with "tor" in the name, since e.g. i2p would
qualify.
cheers,
-Brian
[1]: It *will* still listen on a "localhost" socket for the
logport and controlport, but these aren't advertised to the
introducer, and remote systems can't connect to them.
[foolscap#236]: http://foolscap.lothar.com/trac/ticket/236
[tahoe#517]: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/517
[tahoe#1010]: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1010
More information about the tahoe-dev
mailing list