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 .