Filtering traffic through a VPN
Having recently purchased a subscription to iPredator I wanted to filter only certain traffic over the VPN and the rest, by default, over my normal ADSL account. My solution was to setup a SOCKS5 and HTTP proxy that went out over the VPN leaving the rest of the traffic to follow the default route as normal.
Please note this guide works for me on Ubuntu 9.10 (Karmic), your mileage may vary!
Step 1: Setting up the PPTP connection to iPredator
Firstly install the required packages:-
$ sudo apt-get install pptp-linux ppp
Obviously the first step is to actually get the VPN setup, so I created the peers file: /etc/ppp/peers/ipredator
pty "pptp vpn.ipredator.se --nolaunchpppd --nobuffer --loglevel 0" name YOUR-USERNAME-HERE remotename ipredator file /etc/ppp/options.pptp ipparam ipredator nodefaultroute persist
Next you have to populate your chap-secrets file with your password: /etc/ppp/chap-secrets:-
YOUR-USERNAME-HERE ipredator YOUR-PASSWORD-HERE *
Finally edit the /etc/ppp/options.pptp file and uncomment the require-mppe-128 line. Now if you run “pon ipredator” and tail the syslog you should find that the VPN comes up although at the moment no traffic will route over it so go ahead and and run “poff ipredator”.
Step two: Setup the SOCKS5 server
Now we need to setup the SOCKS5 server, danted. First go ahead and install it:-
$ sudo apt-get install dante-server
Next edit the config file /etc/danted.conf and make it look something like this, changing 192.168.1.0/24 to your local subnet:-
logoutput: syslog internal: eth0 port = 1080 external: ppp0 method: none clientmethod: none user.privileged: proxy user.notprivileged: proxy user.libwrap: proxy client pass { from: 192.168.1.0/24 port 1-65535 to: 0.0.0.0/0 } client pass { from: 127.0.0.1/32 port 1-65535 to: 0.0.0.0/0 } client block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error } block { from: 0.0.0.0/0 to: 127.0.0.0/8 log: connect error } pass { from: 192.168.1.0/24 to: 0.0.0.0/0 protocol: tcp udp } pass { from: 127.0.0.1/32 to: 0.0.0.0/0 protocol: tcp udp } block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error }
Finally since we will be controlling when this process starts we need to prevent it from starting at boot by running the following:-
$ sudo update-rc.d -f danted remove $ sudo service danted stop
Step three: Setting up the HTTP Proxy
Firstly install the HTTP proxy (polipo):-
$ sudo apt-get install polipo
Now make your config file /etc/polipo/config look something like this, changing as appropriate:-
proxyAddress = "192.168.1.1" # IPv4 only proxyPort = 3128 allowedClients = 192.168.1.0/24 allowedPorts = 1-65535 socksParentProxy = "192.168.1.1:1080" socksProxyType = socks5 chunkHighMark = 50331648 diskCacheRoot = "" disableIndexing = true disableServersList = true dnsUseGethostbyname = yes disableVia=true censoredHeaders = from,accept-language,x-pad,link censorReferer = maybe maxConnectionAge = 5m maxConnectionRequests = 120 serverMaxSlots = 8 serverSlots = 2 tunnelAllowedPorts = 1-65535
Finally since we’ll be controlling when this service starts, prevent it from starting on boot:-
$ sudo update-rc.d -f polipo remove $ sudo service polipo stop
Step four: Setting up the VPN routes
Now that our services are configured we need to add the magic glue that makes their requests route out via the VPN – this will be done using an ip-up.d script and an ip-down.d script.
NB: Both these scripts assume that your proxy user has user id 13, please change accordingly if this is not the case.
Create the /etc/ppp/ip.up.d/ipredator script as follows (changing 192.168.1.0/24 as appropriate):-
#!/bin/bash # Check for the iPredator VPN. [ "$6" == "ipredator" ] || exit 0 # Setup the extra routing table for iPredator. ip route add table 200 via $5 ip route add 192.168.1.0/24 dev eth0 table 200 ip rule add fwmark 0x50 table 200 # Mark all packets owned by the proxy user to go through iPredator. iptables -t mangle -A OUTPUT --match owner --uid-owner 13 -j MARK --set-mark 80 # Start the daemons we use for this VPN. service danted start service polipo start
Next create the /etc/ppp/ip-down.d/ipredator similarly:-
#!/bin/bash # Check for the iPredator VPN. [ "$6" == "ipredator" ] || exit 0 # Stop the daemons we use for this VPN. service danted stop service polipo stop # Remove the packet mangling rule. iptables -t mangle -D OUTPUT --match owner --uid-owner 13 -j MARK --set-mark 80 # Remove the extra routing table for iPredator. ip rule del fwmark 0x50 table 200 ip route del 192.168.1.0/24 dev eth0 table 200 ip route del table 200 via $5
Ensure both scripts are executable.
Step five: Testing the services.
To test firstly bring up the VPN by running “pon ipredator”, you should see the VPN come up and both polipo and danted should be started.
Check, by default, you get your ADSL IP:-
$ wget -q -O - http://www.whatismyip.com/automation/n09230945.asp
Next check that when routing via the proxy you get a different (VPN) IP:-
$ export http_proxy=192.168.1.1:3128 $ wget -q -O - http://www.whatismyip.com/automation/n09230945.asp
If it all works congratulations, you now have a http and socks5 proxy routing traffic over your VPN while all other traffic routes out via your normal connection.
IF it fails, I’m afraid you’re stuck going through the logs etc… Sorry!