Tunnels/Connecting to a VPN before Tor
Connecting to a VPN before Tor
|Before combining Tor with other tunnels, make sure you read and understand the introduction!|
User -> VPN -> Tor -> Internet
- 1 Connecting to a VPN before Tor (User -> VPN -> Tor -> Internet)
- 1.1 Introduction
- 1.2 Separate VPN-Gateway
- 1.3 On the Host
- 1.4 Inside Whonix-Gateway
- 1.4.1 VPN Client Choice
- 1.4.2 Whonix TUNNEL_FIREWALL vs standalone VPN-Firewall
- 1.4.3 Setup Time
- 1.4.4 Preparation
- 1.4.5 Firewall Settings
- 1.4.6 Reload Firewall
- 1.4.7 sudoers configuration
- 1.4.8 VPN Setup
- 1.4.9 systemd setup
- 1.4.10 Enable Tor
- 1.4.11 Troubleshooting
- 220.127.116.11 ip_unpriv vs ip-unpriv
- 18.104.22.168 50_openvpn_unpriv.conf vs 50_openvpn-unpriv.conf
- 22.214.171.124 Cannot ioctl TUNSETIFF
- 126.96.36.199 Dev tun missmatch
- 188.8.131.52 /run/openvpn/openvpn.status Permission denied
- 184.108.40.206 debug start
- 220.127.116.11 Linux ip link set failed
- 18.104.22.168 DNS Configuration
- 22.214.171.124 Terminology for Support Requests
- 1.4.12 Additional Tweaks / Recommendations / Troubleshooting
- 2 Footnotes
Connecting to a VPN before Tor (User -> VPN -> Tor -> Internet)
- Qubes-Whonix users have the option to use a #Separate VPN-Gateway but could also install the VPN software #Inside Whonix-Gateway.
- Non-Qubes-Whonix users could install the VPN software #On the Host or #Inside Whonix-Gateway.
What's the difference of installing a VPN on the host versus installing on Whonix-Gateway?
|If the VPN is installed on the host||If the VPN is installed on Whonix-Gateway||If a VPN is installed on the host and another VPN on Whonix-Gateway|
|all Whonix traffic goes||user -> host's VPN -> Tor -> Internet||user -> gateway's VPN -> Tor -> Internet||user -> host's VPN -> gateway's VPN -> Tor -> Internet|
|all host traffic goes||user -> host's VPN -> Internet||user -> Internet||user -> host's VPN -> Internet|
|When Whonix-Gateway ever gets compromised||left with protections by the host's VPN||left without any protections||left with protections by the host's VPN|
When making the decision, you must ask yourself...
What do you want to hide from your ISP? All traffic? Then install the VPN on the host.
What should your VPN provider be able to see? All traffic? Then install the VPN on the host.
Should your VPN provider only be able to see Tor traffic but not your clearnet traffic? Then install the VPN on Whonix-Gateway.
A separate VPN-Gateway between Whonix-Gateway and sys-firewall, i.e. Whonix-Workstation -> Whonix-Gateway -> VPN-Gateway -> sys-firewall -> sys-net.
User -> VPN -> Tor -> Internet
These "Separate VPN-Gateway" instructions are new. You might be one of the first users. You might run into minor issues. Please test and report how it went.
Create a new ProxyVM called for example sys-vpn.
Set the NetVM of Whonix-Gateway (commonly called sys-whonix) to sys-vpn.
Both, the VPN software either using TCP and UDP should work.
VPN Client Choice:
- Use OpenVPN.
- Using bitmask with Qubes is not yet documented.
- Other VPN clients are unsupported. We are not aware of any sane VPN client choices besides OpenVPN.
Setup the VPN-Gateway as per Qubes VPN documentation for ProxyVMs. It is also highly recommended to setup the iptables firewall rules as described in Qubes VPN documentation to prevent clearnet traffic when the VPN breaks down. (In that cases, Whonix-Gateway (commonly called sys-whonix traffic would only go user -> Tor -> Internet as opposed to user -> VPN -> Tor -> Internet, which is what you want if you are reading this documentation chapter.
Check, that your VPN-Gateway is fully functional. Test connectivity from inside the VPN-Gateway.
No DNS configuration for Whonix-Gateway required. 
For troubleshooting, see footnote. 
On the Host
Non-Qubes-Whonix only! (Because in Qubes, the host is non-networked by default. Qubes-Whonix users have the option to use a #Separate VPN-Gateway but could also install the VPN software #Inside Whonix-Gateway.)
User -> VPN -> Tor -> Internet
When using a Whonix-Gateway virtual machine, connect to a VPN using software on the host operating system (and not on the Whonix-Workstation nor Whonix-Gateway).
Using software inside the host operating system may be more convenient if your more familiar with the host operating system than Whonix. Additionally, your VPN provider might provide custom software with tools for connecting to their servers. However, there are issues that you must consider:
- A VPN on the host operating system will route all traffic originating from the host through the VPN, as well as Whonix's traffic. It is up to your preferences, if you like this or not.
- Your VPN software may not be designed or configured to "fail closed". That is, if your VPN session suddenly disconnects, your Tor connection will be automatically sent through your ISP without going through your VPN service.
How to add the VPN in Host OS
Use the host operating system's built-in tools connect to your VPN or use the software provided by your VPN service.
Use a Fail Closed Mechanism
A general problem with VPNs is that during a connection, they often fail to remain open. This means the VPN connection is closed and the user is now directly connected to the Internet without first tunneling through the VPN. This is not a Whonix-specific problem. VPN servers and software can occasionally fail without prior notice. Therefore, if the VPN is unreachable or the connection breaks down for whatever reason, in most cases you will continue to connect to the internet without the VPN.
One of the key benefits of Whonix is that when a VPN connection fails, you will still have the protections provided by Tor. In this instance, the Whonix-Workstation will seamlessly continue to make "direct" connections through Tor. Failure of the VPN tunnel may be inconsequential if you are only using a VPN to circumvent Tor censorship. On the other hand, if you believe a VPN improves your security, then you should make sure that if/when the VPN connection fails, all connections with the outside world and your computer cease.
If you want to enforce, that the VPN always gets used, try VPN-Firewall.
(Or if that works for you, install the VPN on the gateway instead, because it comes with an integrated TUNNEL_FIREWALL feature, i.e. stay away from the standalone VPN-Firewall when you set up a VPN on the gateway.)
Whonix-Gateway can be configured to connect to a VPN server before Tor, as well as "fail closed", blocking all Tor traffic if the VPN disconnects.
User -> VPN -> Tor -> Internet
VPN Client Choice
Using bitmask inside Whonix-Gateway for this use case is unsupported. And discouraged. Because bitmask modifies the firewall. Perhaps that can be configured or is safe. Reaching that and documenting bitmask is TODO, help welcome!
Other VPN clients are unsupported. We are not aware of any sane VPN client choices besides OpenVPN.
Whonix TUNNEL_FIREWALL vs standalone VPN-Firewall
When applying VPN instructions inside Whonix VMs, do not use and forget about standalone VPN-Firewall. It is incompatible and not required because below it is documented how to use the integrated Whonix TUNNEL_FIREWALL feature.
If you are interested in Hide Tor and Whonix from your ISP (read that page first)... After installing Whonix-Gateway, do the following steps before activating Tor in .
Since setting up OpenVPN on Whonix including a secure, leak preventing Fail Closed Mechanism is challenging, it is highly recommend to learn how to set up OpenVPN on Debian stable (currently: jessie). Get a Debian stable VM. Install the Debian openvpn package. (sudo apt-get install openvpn) Figure out how to set up your VPN using OpenVPN in the command line. Only proceed if you succeeded setting that up. Do not post support requests regarding these instructions before you succeeded with that basic exercise. You find some help with general VPN setup in the #VPN Setup chapter or on the TestVPN page. There however are ways to get help from various sources for that basic exercise, also your VPN provider may be of assistance.
Whonix 12 users may remember variable VPN_SERVERS. Don't wonder. That variable was abolished for better security. 
Modify Whonix User Firewall Settings
Add the following settings. You can skip comments (starting with  Likely you do not need to either uncomment (removing the in front) or modify / .). Don't use for comments.
## Make sure Tor always connects through the VPN. ## Enable: 1 ## Disable: 0 ## DISABELD BY DEFAULT, because it requires a VPN provider. VPN_FIREWALL=1 ## For OpenVPN. #VPN_INTERFACE=tun0 ## Destinations you don not want routed through the VPN. ## 10.0.2.2-10.0.2.24: VirtualBox DHCP # LOCAL_NET="\ # 127.0.0.0-127.0.0.24 \ # 192.168.0.0-192.168.0.24 \ # 192.168.1.0-192.168.1.24 \ # 10.152.152.0-10.152.152.24 \ # 10.0.2.2-10.0.2.24 \ # "
Reload Whonix-Gateway Firewall.
Open /etc/sudoers.d/tunnel_unpriv in an editor with root rights.
Comment in. (Remove the single hashes (# in front of all lines, but do not remove the double hashes (##). So it looks like this.
tunnel ALL=(ALL) NOPASSWD: /bin/ip tunnel ALL=(ALL) NOPASSWD: /usr/sbin/openvpn * Defaults:tunnel !requiretty
In the following example we are using the free Riseup VPN, because it is known to support TCP, UDP, SSL. You can use any VPN you like.
Update: Riseup "legacy" VPN may have been discontinued. It did not work anymore for the author of these instructions. The riseup replacement service bitmask has not been tested.
Get VPN Certificate
TODO: Documentation bug fix required. Won't work without Tor being enabled. You need to get the certificate elsewhere and then File Transfer it into Whonix-Gateway.
scurl https://help.riseup.net/security/network-security/riseup-ca/RiseupCA.pem | sudo tee /etc/openvpn/RiseupCA.pem
You need a riseup.net account. You need to know your riseup account name. Go to https://user.riseup.net/users/riseupusername/vpn to obtain your VPN secret. (VPN password) (Replace "riseupusername" with your actual riseup user name.) (Or just got to https://user.riseup.net, login and click on "VPN".)
Open /etc/openvpn/auth.txt in an editor with root rights.
Add. (Add your actual user name and password.)
VPN IP Address
Note, you must use IP addresses. You cannot use DNS hostnames. For example, you could not use vpn.riseup.net. You have to use IP addresses such as for example 126.96.36.199. You find out the IP from your provider or by using nslookup on the host. Example. (You need to use your actual DNS hostname, not vpn.riseup.net.)
VPN Configuration File
Open /etc/openvpn/openvpn.conf in an editor with root rights.
Note: make sure to adjust thevariable in your config (unless you are using as your VPN service). Replace the IP ( ) and port ( ) to match your VPN service.
############################## ## VPN provider specific settings ## ############################## auth-user-pass auth.txt ## using nyc.vpn.riseup.net 80 remote 188.8.131.52 80 ca RiseupCA.pem remote-cert-tls server #################################### ## TUNNEL_FIREWALL specific settings ## #################################### client dev tun0 persist-tun persist-key script-security 2 #up "/etc/openvpn/update-resolv-conf script_type=up dev=tun0" #down "/etc/openvpn/update-resolv-conf script_type=down dev=tun0" user tunnel iproute /usr/bin/ip_unpriv
Do not worry about TCP mode on Whonix-Gateway. Using the VPN in TCP mode may be possible depending the services provides by your VPN provider, but is not required on Whonix-Gateway. The VPN in UDP mode should work just fine.  Your pick.
DNS configuration, resolvconf, update-resolv-conf or similar is not required for Whonix-Gateway. 
Configuration Folder Permissions
Since we will be running OpenVPN under user tunnel, that user requires read access to folder /etc/openvpn.
sudo chown -R tunnel:tunnel /etc/openvpn
sudo chown -R tunnel:tunnel /var/run/openvpn
Create the OpenVPN systemd service file.
sudo cp /lib/systemd/system/openvpn@.service /email@example.com
Enable the OpenVPN systemd service file.
sudo systemctl enable openvpn@openvpn
Start the OpenVPN systemd service.
sudo service openvpn@openvpn start
Check the OpenVPN systemd service status.
sudo service openvpn@openvpn status
Enable Tor using Whonix Setup Wizard.
You can skip this troubleshooting chapter unless you notice any issues.
ip_unpriv vs ip-unpriv
There are two similar distinct projects. Standalone VPN-FIREWALL and Whonix TUNNEL_FIREWALL. They share a lot similarities, but one difference that you might stumble upon. In chapter #VPN Configuration File there is a difference.
- Whonix TUNNEL_FIREWALL uses ip_unpriv (underscore)
- Standalone VPN-FIREWALL uses ip-unpriv (hyphen)
So make sure you are using the right version of ip unpriv according to the project you are using, VPN-FIREWALL and Whonix TUNNEL_FIREWALL.
50_openvpn_unpriv.conf vs 50_openvpn-unpriv.conf
Similar to above...
- Whonix TUNNEL_FIREWALL uses /usr/lib/tmpfiles.d/50_openvpn_unpriv.conf ip_unpriv (underscore)
- Standalone VPN-FIREWALL uses /usr/lib/tmpfiles.d/50_openvpn-unpriv.conf ip-unpriv (hyphen)
Cannot ioctl TUNSETIFF
ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)
In openvpn.conf do not use.
Dev tun missmatch
In openvpn.conf do not use.
/run/openvpn/openvpn.status Permission denied
Options error: --status fails with '/run/openvpn/openvpn.status': Permission denied
Do not start openvpn as root. Do not use "sudo openvpn". This would lead to permission issues. Files in /run/openvpn folder owned by root. So they cannot be overwritten by user tunnel.
Debug start in command line.
sudo /usr/sbin/openvpn --rmtun --dev tun0 sudo /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel cd /etc/openvpn/ sudo -u tunnel openvpn /etc/openvpn/openvpn.conf
Linux ip link set failed: external program exited with error status: 2
Use ip_unpriv as documented above.
If you are using resolvconf only...
You may need to manually change permissions on two directories if they are not automatically applied. Check to see if changes are necessary by running the following command:
ls -al /run/resolvconf
If the output lists tunnel as having read/write/execute permissions for both /run/resolvconf and /run/resolvconf/interface then you will not need to modify anything. If tunnel is not listed as group for one or both of these directories then you will need to change the permissions, like so:
sudo chown --recursive root:tunnel /run/resolvconf
then you will need to set the permissions bits
sudo chmod --recursive 775 /run/resolvconf
In /run/resolvconf, resolv.conf may or may not be owned by tunnel depending on whether the systemd service has started already or not. There is no need to modify permissions on this file, as its permissions will change when the service starts.
Terminology for Support Requests
Phrases such as "over Tor" are ambiguous. Please do not prevent your own coining of words. That leads to people talking past each other. Please use the same terms that are consistently used in documentation such as.
- How to connect to a VPN before Tor (User -> VPN -> Tor -> Internet)
- How to connect to Tor before a VPN (User -> Tor -> VPN -> Internet)
Always refer to the connection scheme, User -> VPN -> Tor -> Internet or User -> Tor -> VPN -> Internet etc.
Additional Tweaks / Recommendations / Troubleshooting
If having problems with the connection / Tor is not fully bootstrapped, please press on expand on the right.
You have may have to manually restart Tor. This is because the VPN may not be ready when Tor is attempting to connect, because the VPN connection initialization takes too long. Due to a bug in Tor, it won't keep trying to connect. To fix this, you may have to manually restart Tor after boot, if whonixcheck reports that Tor is not fully bootstrapped. The same may be necessary if your VPN software or connection temporarily broke down.
To Manually restart Tor:
When you shut down the VPN, neither Tor, nor Whonix-Gateway's whonixcheck/apt-get/etc. nor Whonix-Workstation should be able to connect anywhere anymore.
Force Tor to wait for OpenVPN
Create a folder /etc/systemd/system/tor.service.d.
sudo mkdir /etc/systemd/system/tor.service.d
Create a file /etc/systemd/system/tor.service.d/50_user.conf.
Open /etc/systemd/system/tor.service.d/50_user.conf in an editor with root rights.
Add the following content.
At next boot, the Tor daemon will be started after the OpenVPN daemon.
- Only tested with OpenVPN. Most other VPN's have deficiencies anyway.
- DNS (IP address) of VPN server has to be manually resolved. There is technically no way to automatically resolve DNS without making the setup much more complex. The VPN server's IP address should not be resolved over Tor, because that's what you wanted to hide in the first place. Since outside observers will know, that you are connecting to the VPN IP anyway, it is probably save to resolve the DNS over clearnet or by asking the VPN provider if they don't already document their IPs on their website anyway.
- No support for IPv6 yet.
Troubleshooting VPN -> Tor
- If not connecting, see above to manually restart Tor
- Check your VPN software's logs.
- Test if you are able to connect using your VPN
1. Login as user.
sudo su clearnet
2. Try connecting to check.tpo. Note, at time of writing, it looked like usaip free trial is probably blocking SSL, therefore it might not work.
UWT_DEV_PASSTHROUGH=1 curl --silent --tlsv1.2 --proto =https -H 'Host: check.torproject.org' -k https://184.108.40.206 | grep IP
Should show something along: Your IP address appears to be: xxx.xxx.xxx.xxx
3. Get back to normal user.
- All traffic generated by the host. All applications running on the host. Firefox, NTP, anything. This also includes traffic generated by Whonix.
- Because Whonix-Gateway does not require any clearnet DNS anyhow.
- Check, that your VPN-Gateway is fully functional. Test connectivity from inside the VPN-Gateway.
- Add a non-Whonix VM behind your VPN-Gateway. For example, add a debian based AppVM behind your VPN-Gateway. Figure out if the VPN-Gateway works at all before involving Whonix.
- That config file is a bash fragment.
- The Tor software cannot transport UDP yet, but it does not have to in this case. (Reference: Tor#UDP.) Since the VPN connects over clearnet, UDP should just work as usual. Once the VPN is functional, Tor will have no issue to connect using it (without "knowing" it is over a VPN).
- The /usr/bin/ip_unpriv wrapper script is being provided by the usabilty-misc package. The /etc/sudoers.d/tunnel_unpriv wrapper script is being provided by the usabilty-misc package. The /firstname.lastname@example.org/50_unpriv.conf wrapper script is being provided by the usabilty-misc package.
- We must run OpenVPN as user 'tunnel', because that is the only user besides user clearnet that will be allowed to establish external connections when using Whonix Firewall setting VPN_FIREWALL=1.
- Because Whonix-Gateway by default has no and needs no system DNS for its own traffic. See Whonix-Gateway System DNS if you would like to read an explanation why that is so.
sudo systemctl daemon-reloadCheck Tor service status.
sudo service tor statusIt should list the drop-in file /etc/systemd/system/tor.service.d/50_user.conf.
Impressum | Datenschutz | Haftungsausschluss
Conditions for Contributions to Whonix, then Edit! IP addresses are scrubbed, but editing over Tor is recommended. Edits are held for moderation. Whonix (g+) is a licensee of the Open Invention Network. Unless otherwise noted above, the content of this page is copyrighted and licensed under the same Free (as in speech) license as Whonix itself.