Qubes TorVM (qubes-tor)
Qubes TorVM is a deprecated ProxyVM service that provides torified networking to all its clients. If you are interested in TorVM, you will find the Whonix implementation in Qubes a more usable and robust solution for creating a torifying traffic proxy.
By default, any AppVM using the TorVM as its NetVM will be fully torified, so even applications that are not Tor aware will be unable to access the outside network directly.
Moreover, AppVMs running behind a TorVM are not able to access globally identifying information (IP address and MAC address).
Due to the nature of the Tor network, only IPv4 TCP and DNS traffic is allowed. All non-DNS UDP and IPv6 traffic is silently dropped.
See this article for a description of the concept, architecture, and the original implementation.
Warning + Disclaimer
Qubes TorVM is produced independently from the Tor(R) anonymity software and carries no guarantee from The Tor Project about quality, suitability or anything else.
Qubes TorVM is not a magic anonymizing solution. Protecting your identity requires a change in behavior. Read the “Protecting Anonymity” section below.
Traffic originating from the TorVM itself IS NOT routed through Tor. This includes system updates to the TorVM. Only traffic from VMs using TorVM as their NetVM is torified.
(Optional) If you want to use a separate vm template for your TorVM
qvm-clone fedora-23 fedora-23-tor
In dom0, create a proxy vm and disable unnecessary services and enable qubes-tor
qvm-create -p torvm qvm-service torvm -d qubes-netwatcher qvm-service torvm -d qubes-firewall qvm-service torvm -e qubes-tor # if you created a new template in the previous step qvm-prefs torvm -s template fedora-23-tor
From your TemplateVM, install the torproject Fedora repo
sudo yum install qubes-tor-repo
Then, in the template, install the TorVM init scripts
sudo yum install qubes-tor
Configure an AppVM to use TorVM as its NetVM (for example a vm named anon-web)
qvm-prefs -s anon-web netvm torvm ... repeat for any other AppVMs you want torified...
- Shutdown the TemplateVM.
Set the prefs of your TorVM to use the default sys-net or sys-firewall as its NetVM
qvm-prefs -s torvm netvm sys-net
- Start the TorVM and any AppVM you have configured to be route through the TorVM
- From the AppVMs, verify torified connectivity, e.g. by visiting
Check if the qubes-tor service is running (on the torvm)
[user@torvm] $ sudo service qubes-tor status
Tor logs to syslog, so to view messages use
[user@torvm] $ sudo grep Tor /var/log/messages
Restart the qubes-tor service (and repeat 1-2)
[user@torvm] $ sudo service qubes-tor restart
You may need to manually create the private data directory and set its permissions:
[user@torvm] $ sudo mkdir /rw/usrlocal/lib/qubes-tor [user@torvm] $ sudo chown user:user /rw/usrlocal/lib/qubes-tor
Applications should “just work” behind a TorVM, however there are some steps you can take to protect anonymity and increase performance.
The TorVM only purports to prevent the leaking of two identifiers:
- WAN IP Address
- NIC MAC Address
This is accomplished through transparent TCP and transparent DNS proxying by the TorVM.
The TorVM cannot anonymize information stored or transmitted from your AppVMs behind the TorVM.
Non-comprehensive list of identifiers TorVM does not protect:
- Time zone
- User names and real name
- Name+version of any client (e.g. IRC leaks name+version through CTCP)
- Metadata in files (e.g., exif data in images, author name in PDFs)
- License keys of non-free software
How to use Tor Browser behind TorVM
- In a clean VM, download Tor Browser from the Tor Project.
- Verify the PGP signature.
- Copy/move the Tor Browser archive into your AnonVM (i.e., the AppVM which has your TorVM as its netvm).
- Unpack the Tor Browser archive into your home directory.
- In dom0, right click the KDE Application Launcher Menu (AKA “Start Menu”) and left click “Edit Applications…”
- In the KDE Menu Editor, find your AnonVM’s group and create a new item (or make a copy of an existing item).
- Edit the following fields on the “General” tab:
my-new-anonvm: Tor Browser
qvm-run -q --tray -a my-new-anonvm 'TOR_SKIP_LAUNCH=1 TOR_SKIP_CONTROLPORTTEST=1 TOR_SOCKS_PORT=9050 TOR_SOCKS_HOST=184.108.40.206 ./tor-browser_en-US/Browser/start-tor-browser'
my-new-anonvmwith the name of your AnonVM.
220.127.116.11with your TorVM’s internal Qubes IP address, which can be viewed in Qubes VM Manager by clicking “View” –> “IP” or by running
qvm-ls -nin dom0.
en-USwith your locale ID, if different.
- Click “Save” in the KDE Menu Editor.
Tor Browser should now work correctly in your AnonVM when launched via the shortcut you just created.
Note: If you want to use Tor Browser in a DispVM, the steps are the same as above, except you should copy the Tor Browser directory into your DVM template, regenerate the DVM template, then use the following command in your KDE menu entry:
sh -c 'echo TOR_SKIP_LAUNCH=1 TOR_SKIP_CONTROLPORTTEST=1 TOR_SOCKS_PORT=9050 TOR_SOCKS_HOST=18.104.22.168 ./tor-browser_en-US/Browser/start-tor-browser | /usr/lib/qubes/qfile-daemon-dvm qubes.VMShell dom0 DEFAULT red'
en-US as indicated above.)
In order to mitigate identity correlation TorVM makes use of Tor’s new stream isolation feature. Read “Threat Model” below for more information.
Additionally, you might have some apps that you want to ensure always share a Tor circuit or always get their own.
For these reasons TorVM ships with two open SOCKS5 ports that provide Tor access with different stream isolation settings:
- Port 9050 - Isolates by SOCKS Auth and client address only
Each AppVM gets its own circuit, and each app using a unique SOCKS user/pass gets its own circuit
- Port 9049 - Isolates client + destination port, address, and by SOCKS Auth Same as default settings listed above, but additionally traffic is isolated based on destination port and destination address.
Custom Tor Configuration
Default tor settings are found in the following file and are the same across all TorVMs.
You can override these settings in your TorVM, or provide your own custom settings by appending them to:
For information on tor configuration settings
TorVM assumes the same Adversary Model as TorBrowser, but does not, by itself, have the same security and privacy requirements.
The primary security requirement of TorVM is Proxy Obedience.
Client AppVMs MUST NOT bypass the Tor network and access the local physical network, internal Qubes network, or the external physical network.
Proxy Obedience is assured through the following:
- All TCP traffic from client VMs is routed through Tor
- All DNS traffic from client VMs is routed through Tor
- All non-DNS UDP traffic from client VMs is dropped
- Reliance on the Qubes OS network model to enforce isolation
Mitigate Identity Correlation
TorVM SHOULD prevent identity correlation among network services.
Without stream isolation, all traffic from different activities or “identities” in different applications (e.g., web browser, IRC, email) end up being routed through the same tor circuit. An adversary could correlate this activity to a single pseudonym.
TorVM uses the default stream isolation settings for transparently torified traffic. While more paranoid options are available, they are not enabled by default because they decrease performance and in most cases don’t help anonymity (see this tor-talk thread)
By default TorVM does not use the most paranoid stream isolation settings for
transparently torified traffic due to performance concerns. By default TorVM
ensures that each AppVM will use a separate tor circuit (
For more paranoid use cases the SOCKS proxy port 9049 is provided that has all stream isolation options enabled. User applications will require manual configuration to use this socks port.
- Integrate Vidalia
- Create Tor Browser packages w/out bundled tor
- Use local DNS cache to speedup queries (pdnsd)
- Support arbitrary DNS queries
- Fix Tor’s openssl complaint
- Support custom firewall rules (to support running a relay)
Qubes TorVM is inspired by much of the previous work done in this area of transparent torified solutions. Notably the following: