Вопрос: Как пустить часть трафика через VPN?

Лучший ответ:
Есть два подхода. В обоих случаях тебе нужен список заблокированных IP, его можно взять на антизапрете, например.
Дальше вопрос, как пускать трафик.
1. На хабре был материал про динамическую подгрузку маршрутов через BGP. Плюс - работает с любыми протоколами, и не требует дополнительной настройки со стороны проксируемого ПО. Минусы - ощутимо сложнее в понимании, на мой взгляд, да и с кроссплатформенностью могут быть проблемы. В статье приведена реализация на роутере Mikrotik.
2. Использовать файл proxy.pac. Его можно сгенерировать скриптом типа такого:
#!/bin/bash#!/bin/bash
DNS_SERVER=8.8.8.8
BLACKLIST_URL="http://antizapret.prostovpn.org/iplist.txt"
#куда класть файл proxy.pac
PACDIR=/var/www/html
TMPLIST=/tmp/iplist.txt
#домены, которые нужно пускать через прокси независимо от содержимого iplist.txt
DOMAINS=(\
rutracker.org \
facebook.com \
facebook.net \
fbcdn.net \
twitter.com \
twitter.co \
t.co \
twimg.com \
twitpic.com \
periscope.tv \
pscp.tv \
)
#качаем чёрный список
wget -q --tries=10 -O "$TMPLIST" "$BLACKLIST_URL"
# вытаскиваем IP наших прописанных доменов
declare -a EXTRAIPS=()
for domain in "${DOMAINS[@]}"
do
        dig A "$domain" +short @$DNS_SERVER | grep -v '\.$' >>"$TMPLIST"
done
#в чёрном списке есть отдельные IP и есть подсети
#также чёрный список очень длинный, поэтому кодируем его более компактно.
IPLIST=`grep -Ex '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' "$TMPLIST" | awk '/^[0-9]+/ {split($1,b,/\./); printf("0x%02x%02x%02x%02x,", b[1],b[2],b[3],b[4]);}'`
SUBNETLIST=`awk '/[0-9.]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+/ {split($1,p,/\//); printf("[\"%s\", %s], ", p[1], p[2]);}' <"$TMPLIST"`
#генерируем proxy.pac по шаблону
#он проверяет домен на вхождение в фиксированные домены, а потом IP по списку.
function templatePAC {
        NAME=$1
        shift
        DMNLIST=("$@")
        cat >"$PACDIR/$NAME" <<EOF
function FindProxyForURL(url, host) {
  var domainblacklist = [
EOF
        for d in "${DMNLIST[@]}"
        do
                echo "  '$d'," >>"$PACDIR/$NAME"
        done
        cat >>"$PACDIR/$NAME" <<EOF
  ];
  var ipblacklist = [ $IPLIST ];
  var subnetblacklist = [ $SUBNETLIST ];

  function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
  }
  function numberToMask(n) {
    var m=[0,128,192,224,240,248,252,254,255];
    var r=[];
    for (var i=0; i<4; i++) {
      var p = (n > 8) ? 8 : n;
      r[i] = m[p];
      n -= p;
    }
    return r.join(".");
  }
  function maskMatch(ip, mask) {
    var m = numberToMask(mask[1]);
    return isInNet(ip, mask[0], m);
  }

  var blocked = false;
  for (var i=0; !blocked && (i<domainblacklist.length); i++)
    blocked = blocked || ((host == domainblacklist[i]) || endsWith(host, '.'+domainblacklist[i]));
  if (!blocked) {
    var ip = dnsResolve(host);
    for (var i=0; !blocked && (i<subnetblacklist.length); i++)
      blocked = blocked || maskMatch(ip, subnetblacklist[i]);
    blocked = blocked || (ipblacklist.indexOf(convert_addr(ip)) != -1);
  }
  if (blocked)
    return "PROXY ТУТ_ТВОЙ_ПРОКСИ:ПОРТ";
  else
    return "DIRECT";
}
EOF
}
# генерируем файл
templatePAC proxy.pac "${DOMAINS[@]}"

rm -f "$TMPLIST"
Тогда можно отдавать этот proxy.pac любым веб-сервером (но лучше внутри VPN - если VPN не работает, то смысл в файле?), и настроить браузер на его использование.
Минусы: работает только с браузерами, требует наличия вебсервера и полноценного прокси-сервера внутри VPN-сети (т.е. просто арендованный VPN не подойдёт, нужен VPS). Но мне показалось это проще в понимании, чем возня с BGP, да и требуется только наличие современного браузера и VPN клиента, без привязки к роутеру. Можно хоть на ноуте настроить, как я сделал.

Худший ответ:
Копать в сторону маршрутов до нужных ресурсов. Но вообще впн для такого не предназначен, на уровне HTTP работают прокси.