I run some wallet-less listening nodes behind Tor, for fuzzies and occasional somewhat-private TX submission.  In this setup, minimising load on exits seems more important than having clearnet peers, so I use `onlynet=tor`.  To minimise room for leaks their network configuration also makes Tor their only window to the world.  They do get inbound connections through their onion services.  For reasons probably not relevant, they may be atypically peer-starved at times.

I see outbound connections to the seeds via exits:

```
2015-10-XX XX:XX:XX Bitcoin version v0.11.0.0-(the 0.11.0 tag from Github)
    (omit OpenSSL, directories)
2015-10-XX XX:XX:XX Using at most 125 connections (1024 file descriptors available)
2015-10-XX XX:XX:XX Using 0 threads for script verification
2015-10-XX XX:XX:XX scheduler thread start
    (omit RPC)
2015-10-XX XX:XX:XX Bound to X.X.X.X:8333
2015-10-XX XX:XX:XX AddLocal(XXXXXXXXXXXXXXXX.onion:8333,4)
    (omit cache config, LevelDB lines)
2015-10-XX XX:XX:XX No wallet support compiled in!
    (omit best chain)
2015-10-XX XX:XX:XX init message: Loading addresses...
2015-10-XX XX:XX:XX Loaded (several hundred) addresses from peers.dat  9ms
2015-10-XX XX:XX:XX init message: Done loading
2015-10-XX XX:XX:XX msghand thread start
2015-10-XX XX:XX:XX opencon thread start
2015-10-XX XX:XX:XX addcon thread start
2015-10-XX XX:XX:XX net thread start
2015-10-XX XX:XX:XX dnsseed thread start
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX Loading addresses from DNS seeds (could take a while)
2015-10-XX XX:XX:XX 0 addresses found from DNS seeds
2015-10-XX XX:XX:XX dnsseed thread exit
    (omit interspersed "receive version message", both with
     us=XXXXXXXXXXXXXXXX.onion:8333 and us=dotted quad)
2015-10-XX XX:XX:XX SOCKS5 connecting seed.bitcoin.sipa.be
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting dnsseed.bluematt.me
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting dnsseed.bitcoin.dashjr.org
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting seed.bitcoinstats.com
2015-10-XX XX:XX:XX SOCKS5 connected seed.bitcoinstats.com
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting bitseed.xf2.org
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting seed.bitcoin.jonasschnelli.ch
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting seed.bitcoin.sipa.be
2015-10-XX XX:XX:XX SOCKS5 connected seed.bitcoin.sipa.be
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting dnsseed.bluematt.me
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting dnsseed.bitcoin.dashjr.org
2015-10-XX XX:XX:XX SOCKS5 connected dnsseed.bitcoin.dashjr.org
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting bitseed.xf2.org
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting seed.bitcoin.jonasschnelli.ch
2015-10-XX XX:XX:XX SOCKS5 connected seed.bitcoin.jonasschnelli.ch
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connecting dnsseed.bluematt.me
2015-10-XX XX:XX:XX SOCKS5 connected dnsseed.bluematt.me
2015-10-XX XX:XX:XX SOCKS5 connecting bitseed.xf2.org
2015-10-XX XX:XX:XX SOCKS5 connecting XXXXXXXXXXXXXXXX.onion
2015-10-XX XX:XX:XX SOCKS5 connected XXXXXXXXXXXXXXXX.onion
    (usually stops attempting seeds ~30m after startup)
```

@laanwj says "if you have a proxy it [still] does AddOneShot(seed.host)" and I dimly recall something about an exception being required for bootstrap before Core had an onion seed list, otherwise bootstrap would go nowhere.  Even if the user is aware of that, the persistent attempted connections to the seeds for a while _after_ apparent `dnsseed thread exit` cause confusion (although maybe that peer starvation I mentioned is a prerequisite for getting confused).

Having healthy peer lists on these nodes already, I'm sure I can just use `dnsseed=0`, but I think it's worth making my existing configuration less surprising.  `onlynet=tor` really should mean "just onion peers", or be renamed, or have clearly documented exceptions, because smells like the the sort of thing that bites you down the road when new code or an unexpected use case comes along.

argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
    SetupChainParamsBaseOptions(argsman);
    argsman.AddArg("-acceptnonstdtxn", strprintf("Relay and mine \"non-standard\" transactions (%sdefault: %u)", "testnetregtest only; ", !testnetChainParams->RequireStandard()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-incrementalrelayfee=<amt>", strprintf("Fee rate (in %skvB) used to define cost of relay, used for mempool limiting and replacement policy. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_INCREMENTAL_RELAY_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-dustrelayfee=<amt>", strprintf("Fee rate (in %skvB) used to define dust, the value of an output such that it will cost more than its value in fees at this fee rate to spend it. (default: %s)", CURRENCY_UNIT, FormatMoney(DUST_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-bytespersigop", strprintf("Equivalent bytes per sigop in transactions for relay and mining (default: %u)", DEFAULT_BYTES_PER_SIGOP), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-datacarrier", strprintf("Relay and mine data carrier transactions (default: %u)", DEFAULT_ACCEPT_DATACARRIER), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-datacarriersize", strprintf("Maximum size of data in data carrier transactions we relay and mine (default: %u)", MAX_OP_RETURN_RELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-mempoolfullrbf", strprintf("Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %skvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
        CURRENCY_UNIT, FormatMoney(DEFAULT_MIN_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-whitelistforcerelay", strprintf("Add 'forcerelay' permission to whitelisted inbound peers with default permissions. This will relay transactions even if the transactions were already in the mempool. (default: %d)", DEFAULT_WHITELISTFORCERELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-whitelistrelay", strprintf("Add 'relay' permission to whitelisted inbound peers with default permissions. This will accept relayed transactions even when not relaying transactions (default: %d)", DEFAULT_WHITELISTRELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
    argsman.AddArg("-blockmaxweight=<n>", strprintf("Set maximum BIP141 block weight (default: %d)", DEFAULT_BLOCK_MAX_WEIGHT), ArgsManager::ALLOW_ANY, OptionsCategory::BLOCK_CREATION);
    argsman.AddArg("-blockmintxfee=<amt>", strprintf("Set lowest fee rate (in %skvB) for transactions to be included in block creation. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_BLOCK_MIN_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::BLOCK_CREATION);
    argsman.AddArg("-blockversion=<n>", "Override block version to test forking scenarios", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::BLOCK_CREATION);
    argsman.AddArg("-rest", strprintf("Accept public REST requests (default: %u)", DEFAULT_REST_ENABLE), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
    argsman.AddArg("-rpcallowip=<ip>", "Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a networknetmask (e.g. 1.2.3.4255.255.255.0) or a networkCIDR (e.g. 1.2.3.424). This option can be specified multiple times", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
    argsman.AddArg("-rpcauth=<userpw>", "Username and HMAC-SHA-256 hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in sharerpcauth. The client then connects normally using the rpcuser=<USERNAME>rpcpassword=<PASSWORD> pair of arguments. This option can be specified multiple times", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
    argsman.AddArg("-rpcbind=<addr>[:port]", "Bind to given address to listen for JSON-RPC connections. Do not expose the RPC server to untrusted networks such as the public internet! This option is ignored unless -rpcallowip is also passed. Port is optional and overrides -rpcport. Use [host]:port notation for IPv6. This option can be specified multiple times (default: 127.0.0.1 and ::1 i.e., localhost)", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
    argsman.AddArg("-rpcdoccheck", strprintf("Throw a non-fatal error at runtime if the documentation for an RPC is incorrect (default: %u)", DEFAULT_RPC_DOC_CHECK), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
    argsman.AddArg("-rpccookiefile=<loc>", "Location of the auth cookie. Relative paths will be prefixed by a net-specific datadir location. (default: data dir)", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
    argsman.AddArg("-rpcpassword=<pw>", "Password for JSON-RPC connections", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
    argsman.AddArg("-rpcport=<port>", strprintf("Listen for JSON-RPC connections on <port> (default: %u, testnet: %u, signet: %u, regtest: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort(), signetBaseParams->RPCPort(), regtestBaseParams->RPCPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::RPC);
    argsman.AddArg("-rpcserialversion", strprintf("Sets the serialization of raw transaction or block hex returned in non-verbose mode, non-segwit(0) or segwit(1) (default: %d)", DEFAULT_RPC_SERIALIZE_VERSION), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
    argsman.AddArg("-rpcservertimeout=<n>", strprintf("Timeout during HTTP requests (default: %d)", DEFAULT_HTTP_SERVER_TIMEOUT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
    argsman.AddArg("-rpcthreads=<n>", strprintf("Set the number of threads to service RPC calls (default: %d)", DEFAULT_HTTP_THREADS), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
    argsman.AddArg("-rpcuser=<user>", "Username for JSON-RPC connections", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
    argsman.AddArg("-rpcwhitelist=<whitelist>", "Set a whitelist to filter incoming RPC calls for a specific user. The field <whitelist> comes in the format: <USERNAME>:<rpc 1>,<rpc 2>,...,<rpc n>. If multiple whitelists are set for a given user, they are set-intersected. See -rpcwhitelistdefault documentation for information on default whitelist behavior.", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
    argsman.AddArg("-rpcwhitelistdefault", "Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault is set to 0, if any -rpcwhitelist is set, the rpc server acts as if all rpc users are subject to empty-unless-otherwise-specified whitelists. If rpcwhitelistdefault is set to 1 and no -rpcwhitelist is set, rpc server acts as if all rpc users are subject to empty whitelists.", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);