Forçar certos aplicativos a usar VPN

3

Por alguns dias, tenho tentado forçar apenas alguns aplicativos a usar uma VPN. Até agora achei muito simples forçar todos os aplicativos a usá-lo, ou nenhum aplicativo para usá-lo.

Eu não estou no script nem nada. Eu só quero que isso funcione. Qualquer um dos itens a seguir é aceitável:

  • Forçar aplicativos de um determinado usuário a usar a interface tun0
  • Forçar certas portas a usar a interface tun0
  • Forçar processos específicos para usar a interface tun0 (essa foi a minha intenção original, mas entendo que essa funcionalidade não existe no iptables há algum tempo)

Também não estou usando rotas / firewalls para a solução, mas a maioria das informações que consegui encontrar parece indicar que esse é o caminho a seguir.

Estou executando o Fedora e usando o OpenVPN.

Eu tenho trabalhado com este script:

#!/bin/sh

DEV1=wlp0s20u2
IP1=192.168.0.200
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2='ifconfig | egrep -o '192.168.179.[0-9]{1,3}' | head -n1'
GW2='ifconfig | egrep -o '192.168.179.[0-9]{1,3}' | tail -n1'

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
# Error "RTNETLINK answers: File exists" at below line
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo "2" > /proc/sys/net/ipv4/conf/tun0/rp_filter

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

# ADD PORTS HERE!
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
#iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw $GW1 $DEV1

alterado ligeiramente de um encontrado aqui .

Isso não funciona. Ele recebe tráfego para minha internet sem fio por padrão, mas não redireciona o tráfego da porta 80 para a VPN. A única dica que recebo é o misterioso

RTNETLINK answers: File exists

O ponto em que ocorre é marcado no script. Não tenho certeza do que isso significa. Posso impedi-lo removendo o loop pouco antes de o erro ocorrer, mas o script não funciona de repente se eu o fizer.

Ajuda? Eu sei um pouco sobre redes / firewalls, mas isso é caminho além das minhas capacidades, e eu sinceramente nem sei o que sobre um terço desse script mesmo faz .

    
por Dylan 02.09.2013 / 03:45

2 respostas

1

Você pode normalmente vincular um aplicativo de rede a um IP: Port em seu arquivo .conf. Você poderia adicionar diferentes IPs a cada interface em seu PC e então ligar cada aplicativo com um IP diferente, por exemplo, você poderia ter um servidor de correio ligado ao IP 192.168.7.100 na placa NIC e alguns outros aplicativos ligados a 192.168.7.101 no interface tun0.

    
por 02.09.2013 / 05:07
0

Ainda qualquer aplicativo que usa uma rede está vinculado a uma interface / ip, não importa se é um serviço de rede ou um aplicativo cliente gráfico se você pode definir a interface que vai usar você resolveu o seu problema, se não os pacotes passarão pela interface predeterminada.

    
por 02.09.2013 / 06:02