rota de fallback para descartar pacotes se a interface de saída que é NATed ficar inativa?

3

Histórico:

Eu estabeleço uma conexão com pacotes VPN e NAT de terceiros marcados como parte de um cgroup específico (para executar seletivamente processos através da VPN ou não) ao dispositivo tun da VPN de terceiros (tun2 neste exemplo) e usando um script de roteamento definiu o gateway padrão como sendo o da VPN para uma tabela de rotas separada chamada 'vpn'. Que tudo funciona com o seguinte (alguns detalhes menores são omitidos).

executado na inicialização:

iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o tun2 -j MASQUERADE
ip rule add fwmark 11 table vpn

contido no openvpn client.conf:

route-noexec
route-up /etc/openvpn/3rdparty/routeup.sh

e routeup.sh para definir o gateway padrão para a vpn da tabela de rotas

#!/bin/bash

/sbin/ip route replace default via $route_vpn_gateway dev $dev table vpn

Problema: Se a interface da VPN de terceiros (tun2) cair (por exemplo, falhas de openvpn), não há mais uma rota padrão na tabela de roteamento 'vpn' e todo o tráfego (mesmo o que é executado em meu cgroup separado) é roteado através do principal tabela e através da interface eth0 padrão. Então, eu preciso definir uma rota de fallback no iptables ou na tabela de rotas 'vpn' separada. Se eu usar algo parecido,

iptables -A OUTPUT -m cgroup --cgroup 0x00110011 -o eth0 -j REJECT

ele acaba perdendo todos os pacotes, então é claramente processado antes da entrada nat. Da mesma forma, não consigo encontrar uma maneira de usar 'ip route' para alterar a tabela de rotas para 'vpn', de modo que, uma vez que a entrada do gateway padrão seja removida após a interface tun2 ser descartada, bloqueie todo o tráfego. Em vez disso, não há nenhuma entrada e parece que todo o tráfego vai para a próxima tabela de roteamento, que deve ser principal.

UPDATE: Eu agora tenho uma solução completa para o problema de executar seletivamente o processo através de uma VPN.

link

    
por onlinespending 27.03.2016 / 08:05

1 resposta

3

Consegui fazer isso funcionar usando o parâmetro de métrica com iproute2. Então, meu roteiro de roteamento foi modificado para o seguinte

#!/bin/bash

/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn

e também incluo uma entrada de blackback substituto com um valor de métrica mais alto (valores mais baixos têm prioridade) para bloquear todo o tráfego. Isso pode ser executado na inicialização com as outras linhas listadas na minha pergunta.

ip route add blackhole default metric 2 table vpn

Isso funciona muito bem

    
por 27.03.2016 / 17:53