|  | @@ -1,181 +0,0 @@
 | 
	
		
			
				|  |  | -Design For A Tor DNS-based Exit List
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Status:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  This is a suggested design for a DNS Exit List (DNSEL) for Tor exit nodes.
 | 
	
		
			
				|  |  | -  See http://exitlist.torproject.org/ for an implementation.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Why?
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  It's useful for third parties to be able to tell when a given connection
 | 
	
		
			
				|  |  | -  is coming from a Tor exit node.  Potential applications range from
 | 
	
		
			
				|  |  | -  "anonymous user" cloaks on IRC networks like oftc, to networks like
 | 
	
		
			
				|  |  | -  Freenode that apply special authentication rules to users from these
 | 
	
		
			
				|  |  | -  IPs, to systems like Wikipedia that may want to make a priority of
 | 
	
		
			
				|  |  | -  _unblocking_ shared IPs more liberally than non-shared IPs, since shared
 | 
	
		
			
				|  |  | -  IPs presumably have non-abusive users as well as abusive ones.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Since Tor provides exit policies, not every Tor server will connect to
 | 
	
		
			
				|  |  | -  every address:port combination on the Internet.  Unless you're trying to
 | 
	
		
			
				|  |  | -  penalize hosts for supporting anonymity, it makes more sense to answer
 | 
	
		
			
				|  |  | -  the fine-grained question "which Tor servers will connect to _me_?" than
 | 
	
		
			
				|  |  | -  the coarse-grained question "which Tor servers exist?"  The fine-grained
 | 
	
		
			
				|  |  | -  approach also helps Tor server ops who share an IP with their Tor
 | 
	
		
			
				|  |  | -  server: if they want to access a site that blocks Tor users, they
 | 
	
		
			
				|  |  | -  can exclude that site from their exit policy, and the site can learn
 | 
	
		
			
				|  |  | -  that they won't send it anonymous connections.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Tor already ships with a tool (the "contrib/exitlist" script) to
 | 
	
		
			
				|  |  | -  identify which Tor nodes might open anonymous connections to any given
 | 
	
		
			
				|  |  | -  exit address.  But this is a bit tricky to set up, so only sites like
 | 
	
		
			
				|  |  | -  Freenode and OFTC that are dedicated to privacy use it.
 | 
	
		
			
				|  |  | -  Conversely, providers of some DNSEL implementations are providing
 | 
	
		
			
				|  |  | -  coarse-grained lists of Tor hosts -- sometimes even listing servers that
 | 
	
		
			
				|  |  | -  permit no exit connections at all.  This is rather a problem, since
 | 
	
		
			
				|  |  | -  support for DNSEL is pretty ubiquitous.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -How?
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Keep a running Tor instance, and parse the cached-routers and
 | 
	
		
			
				|  |  | -  cached-routers.new files as new routers arrive.  To tell whether a given
 | 
	
		
			
				|  |  | -  server allows connections to a certain address:port combo, look at the
 | 
	
		
			
				|  |  | -  definitions in dir-spec.txt or follow the logic of the current exitlist
 | 
	
		
			
				|  |  | -  script. If bug 405 is still open when you work on this
 | 
	
		
			
				|  |  | -  (https://bugs.torproject.org/flyspray/index.php?do=details&id=405), you'll
 | 
	
		
			
				|  |  | -  probably want to extend it to look at only the newest descriptor for
 | 
	
		
			
				|  |  | -  each server, so you don't use obsolete exit policy data.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  FetchUselessDescriptors would probably be a good torrc option to enable.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  If you're also running a directory cache, you get extra-fresh
 | 
	
		
			
				|  |  | -  information.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The DNS interface
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Standard DNSEL, if I understand right, looks like this: There's some
 | 
	
		
			
				|  |  | -  authoritative name server for foo.example.com.  You want to know if
 | 
	
		
			
				|  |  | -  1.2.3.4 is in the list, so you query for an A record for
 | 
	
		
			
				|  |  | -  4.3.2.1.foo.example.com.  If the record exists and has the value
 | 
	
		
			
				|  |  | -  127.0.0.2[DNSBL-EMAIL], 1.2.3.4 is in the list.  If you get an NXDOMAIN
 | 
	
		
			
				|  |  | -  error, 1.2.3.4 is not in the list.  If you ask for a domain name outside
 | 
	
		
			
				|  |  | -  of the foo.example.com zone, you get a Server Failure error[RFC 1035].
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Assume that the DNSEL answers queries authoritatively for some zone,
 | 
	
		
			
				|  |  | -  torhosts.example.com.  Below are some queries that could be supported,
 | 
	
		
			
				|  |  | -  though some of them are possibly a bad idea.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Query type 1: "General IP:Port"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Format:
 | 
	
		
			
				|  |  | -        {IP1}.{port}.{IP2}.ip-port.torhosts.example.com
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Rule:
 | 
	
		
			
				|  |  | -        Iff {IP1} is a Tor server that permits connections to {port} on
 | 
	
		
			
				|  |  | -        {IP2}, then there should be an A record with the value 127.0.0.2.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Example:
 | 
	
		
			
				|  |  | -        "1.0.0.10.80.4.3.2.1.ip-port.torhosts.example.com" should have the
 | 
	
		
			
				|  |  | -        value 127.0.0.2 if and only if there is a Tor server at 10.0.0.1
 | 
	
		
			
				|  |  | -        that allows connections to port 80 on 1.2.3.4.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Example use:
 | 
	
		
			
				|  |  | -        I'm running an IRC server at w.x.y.z:9999, and I want to tell
 | 
	
		
			
				|  |  | -        whether an incoming connection is from a Tor server.  I set
 | 
	
		
			
				|  |  | -        up my IRC server to give a special mask to any user coming from
 | 
	
		
			
				|  |  | -        an IP listed in 9999.z.y.x.w.ip-port.torhosts.example.com.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Later, when I get a connection from a.b.c.d, my ircd looks up
 | 
	
		
			
				|  |  | -        "d.c.b.a.9999.z.y.x.w.ip-port.torhosts.example.com" to see
 | 
	
		
			
				|  |  | -        if it's a Tor server that allows connections to my ircd.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Query type 2: "IP-port group"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Format:
 | 
	
		
			
				|  |  | -        {IP}.{listname}.list.torhosts.example.com
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Rule:
 | 
	
		
			
				|  |  | -        Iff this Tor server is configured with an IP:Port list named
 | 
	
		
			
				|  |  | -        {listname}, and {IP} is a Tor server that permits connections to
 | 
	
		
			
				|  |  | -        any member of {listname}, then there exists an A record.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Example:
 | 
	
		
			
				|  |  | -        Suppose torhosts.example.com has a list of IP:Port called "foo".
 | 
	
		
			
				|  |  | -        There is an A record for 4.3.2.1.foo.list.torhosts.example.com
 | 
	
		
			
				|  |  | -        if and only if 1.2.3.4 is a Tor server that permits connections
 | 
	
		
			
				|  |  | -        to one of the addresses in list "foo".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Example use:
 | 
	
		
			
				|  |  | -        Suppose torhosts.example.com has a list of hosts in "examplenet",
 | 
	
		
			
				|  |  | -        a popular IRC network.  Rather than having them each set up to
 | 
	
		
			
				|  |  | -        query the appropriate "ip-port" list, they could instead all be
 | 
	
		
			
				|  |  | -        set to query a central examplenet.list.torhosts.example.com.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Problems:
 | 
	
		
			
				|  |  | -        We'd be better off if each individual server queried about hosts
 | 
	
		
			
				|  |  | -        that allowed connections to itself.  That way, if I wanted to
 | 
	
		
			
				|  |  | -        allow anonymous connections to foonet, but I wanted to be able to
 | 
	
		
			
				|  |  | -        connect to foonet from my own IP without being marked, I could add
 | 
	
		
			
				|  |  | -        just a few foonet addresses to my exit policy.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Query type 3: "My IP, with port"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Format:
 | 
	
		
			
				|  |  | -        {IP}.{port}.me.torhosts.example.com
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Rule:
 | 
	
		
			
				|  |  | -        An A record exists iff there is a tor server at {IP} that permits
 | 
	
		
			
				|  |  | -        connections to {port} on the host that requested the lookup.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Example:
 | 
	
		
			
				|  |  | -        "4.3.2.1.80.me.torhosts.example.com" should have an A record if
 | 
	
		
			
				|  |  | -        and only if there is a Tor server at 1.2.3.4 that allows
 | 
	
		
			
				|  |  | -        connections to port 80 of the querying host.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Example use:
 | 
	
		
			
				|  |  | -        Somebody wants to set up a quick-and-dirty Tor detector for a
 | 
	
		
			
				|  |  | -        single webserver: just point them at 80.me.torhosts.example.com.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Problem:
 | 
	
		
			
				|  |  | -        This would be easiest to use, but DNS gets in the way. If you
 | 
	
		
			
				|  |  | -        create DNS records that give different results depending on who is
 | 
	
		
			
				|  |  | -        asking, you mess up caching.  There could be a fix here, but might
 | 
	
		
			
				|  |  | -        not.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  RECOMMENDATION: Just build ip-port for now, and see what demand is
 | 
	
		
			
				|  |  | -  like.  There's no point in building mechanisms nobody wants.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Web interface:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Should provide the same data as the dns interface.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Other issues:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  After a Tor server op turns off their server, it stops publishing server
 | 
	
		
			
				|  |  | -  descriptors. We should consider that server's IP address to still
 | 
	
		
			
				|  |  | -  represent a Tor node until 48 hours after its last descriptor was
 | 
	
		
			
				|  |  | -  published.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  30-60 minutes is not an unreasonable TTL.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  There could be some demand for address masks and port lists. Address
 | 
	
		
			
				|  |  | -  masks wider than /8 make me nervous here, as do port ranges.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  We need an answer for what to do about hosts which exit from different
 | 
	
		
			
				|  |  | -  IPs than their advertised IP. One approach would be for the DNSEL
 | 
	
		
			
				|  |  | -  to launch periodic requests to itself through all exit servers whose
 | 
	
		
			
				|  |  | -  policies allow it -- and then see where the requests actually come from.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -References:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  [DNSBL-EMAIL] Levine, J., "DNS Based Blacklists and Whitelists for
 | 
	
		
			
				|  |  | -  E-Mail", http://tools.ietf.org/html/draft-irtf-asrg-dnsbl-02, November
 | 
	
		
			
				|  |  | -  2005.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  [RFC 1035] Mockapetris, P., "Domain Names - Implementation and
 | 
	
		
			
				|  |  | -  Specification", RFC 1035, November 1987.
 |