Setting up Deluge with VPN

  1. Linux
    1. Route all traffic from a specific user
  2. FreeBSD
    1. Multiple routing tables
  3. Handling IP changes on VPN interface

There are two basic options when using VPN.

  1. Use the VPN as the primary connection with default routing passing through the VPN. This way all the traffic from the host uses the VPN.
  2. Use the VPN connection only for specific traffic. All network traffic passes through the default interface except for the traffic you specifically want to route through the VPN interface.

Routing only specific traffic through the VPN interface can be useful, but is also the most tricky to configure.

Linux

Directing only some traffic through the VPN interface can be achieved using iptables. There are two different solutions:

  1. Route all traffic from a specific user (i.e. traffic from all processes owned by a specific user) through the VPN interface.
  2. Route all traffic that matches specific ports or protocols

Route all traffic from a specific user

By marking all packets produced by processes owned by a specific user, it is not necessary to add filters on the type of traffic that should be routed.

Scripts for a basic setup can be found at the deluge-vpn repo.

FreeBSD

Multiple routing tables

FreeBSD supports multiple routing tables in the kernel, which enables a process to be started with a custom default routing table. This requires recompiling the kernel with this option enabled (See this blog post for details).

With an alternate routing table already set up (on -1) you can start Deluge daemon with:

 $ setfib -1 /path/to/deluged -l /var/log/deluged/deluged.log  -L info -i <insert-VPN-IP>

Using openvpn you can set up the alternate routing table automatically:

  1. Create /usr/local/etc/openvpn/link-up.sh with the following content:
    #!/bin/sh
    IP=`/sbin/ifconfig $1 | grep "inet " | cut -d" " -f4`
    echo "LINK-UP - SETTING AS DEFAULT GATEWAY FOR ROUTING TABLE 1: $IP"
    /usr/sbin/setfib -1 /sbin/route add default $IP
    
  1. Add the following line to the vpn config file
    up "/usr/local/etc/openvpn/link-up.sh tun0"
    
    where tun0 is the VPN interface.

When starting openvpn the alternate routing table should be set up

$ /usr/local/etc/rc.d/openvpn start

To test that it works, you can use traceroute:

$ setfib -1 traceroute www.google.com

Handling IP changes on VPN interface

Whenever the IP on the VPN interface changes (for whatever reason), it is necessary to update the routing table with the new IP. However, if deluge is setup to listen on a specific IP, it is also necessary to update deluge with the new IP. Instead of manually setting the new IP in the preferences, the plugin IfaceWatch can be used to do this automatically based on the network interface name.

Last modified 15 months ago Last modified on 10/24/2015 10:32:58 PM