Como contornar o OpenVPN por aplicativo

2

Eu tenho uma máquina linux que roteia todo o seu tráfego de internet através de uma conexão openVPN. Foi explicitamente configurado para funcionar dessa maneira.

No entanto, a máquina tem alguns aplicativos que não devem usar a conexão VPN (tun +) e passar pela conexão aberta (eth0).

Como não é um roteamento baseado no ip de destino, meu primeiro passo foi criar um proxy socks5 local onde os aplicativos devem usar para evitar o canal openVPN. No entanto, minhas tentativas de fazer isso com ssh -D ou outro sw) falharam (provavelmente minha culpa) e agora estou me perguntando se existe uma solução diferente e melhor para isso.

    
por roymreelee 17.02.2015 / 23:42

1 resposta

2

Eu postei recentemente outra resposta que aborda essa situação específica, mas as perguntas não são duplicadas, pois essa questão é mais específica do OpenVPN. Como algumas pessoas gostam de recusar links para respostas em vez de colocar a resposta diretamente na pergunta, eu copio / colo aqui.

Eu tenho lutado muitíssimo com isso, então aqui está uma solução COMPLETA. Ele funciona no Ubuntu 15. Você pode usá-lo especialmente com o OpenVPN para rotear certos aplicativos fora da interface do túnel da VPN.

A solução completa "cgroup"

Como isso funciona?

  • O kernel do Linux colocará o aplicativo em um grupo de controle . O tráfego de rede dos aplicativos neste cgroup será identificado por seu ID de classe no nível do controlador de rede.
  • iptables marcará esse tráfego e o obrigará a sair com o IP correto
  • O
  • ip route processará o tráfego marcado em uma tabela de roteamento diferente, com uma rota padrão para qualquer IP de gateway desejado.

Solução

Primeiro, instale o suporte e as ferramentas do cgroup:

sudo apt-get install cgroup-lite cgmanager cgroup-tools

Reinicie.

Você precisa do iptables 1.6 .0+. Obtenha a fonte de lançamento do iptables 1.6.0 , extraia-a e execute-a ( --disable-nftables flag evitará erros ) do diretório de origem do iptables:

sudo apt-get install dh-autoreconf bison flex
./configure --prefix=/usr      \
            --sbindir=/sbin    \
            --disable-nftables \
            --enable-libipq    \
            --with-xtlibdir=/lib/xtables
make
sudo make install
iptables --version

Agora, a configuração real. Defina um grupo de controle denominado novpn . Processos neste cgroup terão um classid de 0x00110011 (11:11).

sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid

Agora, suponhamos que a interface que você deseja usar para o aplicativo específico seja eth0 com um IP de gateway de 10.0.0.1 . Substitua por aquilo que você realmente deseja (obtenha as informações de ip route ). Execute ainda como root:

# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11

# Force the packets to exit through eth0 with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE

# Define a new "novpn" routing table
# DO THIS JUST ONCE !
echo 11 novpn >> /etc/iproute2/rt_tables

# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn

# Novpn has a default gateway to the interface you want to use
ip route add default via 10.0.0.1 table novpn

# Unset reverse path filtering for all interfaces, or at least for "eth0" and "all"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

Por fim, execute seu aplicativo na interface específica:

exit
sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn
cgexec -g net_cls:novpn traceroute www.google.com
cgexec -g net_cls:novpn firefox

Ou se você quiser mover um processo já em execução para o cgroup, bem ... você não pode! Isso parece ser devido à função NAT (masquerade): iptables -nvL -t nat doesn não combina quando o cgroup é alterado, mas iptables -nvL -t mangle corresponde.

# Get PID of the process (we'll then suppose it's 1234)
pidof firefox
# Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result.
sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks
# Remove - but this works...
sudo echo 1234 > /sys/fs/cgroup/net_cls

Créditos: Nenhuma resposta estava funcionando como esperado, mas uma mistura deles fez: chripell answer evolware article Por processo de roteamento take 2: usando cgroups, iptables e política de roteamento , , Mude para o OpenVPN com base no iptables

    
por 05.03.2016 / 11:55