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!
Hi, I respect that you’ve put so much work into this, I might have done the some time ago, but you render a vpn useless. Why not buy a premium proxy instead when all you want is a proxy? Also did you know that your local proxy server most likely is even slower than apache, which is already a slow fat beast? Don’t believe? Benchmark using ab/weighttp.
Now the real interesting part isn’t your setup, but iptables rules.
Why don’t you protect yourself from vpn-disconnects using iptables instead, that happen quite often with relakks? You heard right, ipredator IS relakks, which is know to log and drop connections in the midst of downloads revealing your real ip.
I’ve bought it yesterday out of boredom, should have bought an mp3 player instead, however that’s my findings after a day.
Thank you for taking the time to reply, it is appreciated. 🙂
I no longer use iPredator/relakks and I did improve the setup slightly but never updated the blog – maybe I should have.
Indeed. However this is only a small part of what my setup involved, I had additional routing configured such that any client using that server as a gateway would also route out over the VPN. I wasn’t using this simply just as a HTTP proxy (that was more a quick FoxyProxy thing for any other machine wanting ‘temporary privacy’).
Plus I also like using a local proxy to be sure what headers are stripped from the HTTP requests and I most certainly do not doubt your benchmark claims.
Now that was always on my “TODO” list, but I didn’t use it much as a HTTP proxy really and the NAT routing (which was my primary use-case) would fail if the VPN dropped so it got left at the wayside. (Good spot though!)
🙂