iptables para bloquear o tráfego VPN, se não através do tun0

2

Eu tenho um servidor Web dedicado rodando Debian 6 e algumas coisas sobre Apache, Tomcat, Asterisk e Mail. Agora precisamos adicionar suporte VPN para um programa especial. Instalamos o OpenVPN e registramos com um provedor de VPN. A conexão funciona bem e nós temos uma interface tun0 virtual para tunelamento.

Para arquivar o objetivo de apenas tunelamento de um único programa através de VPN, iniciamos o programa com

sudo -u username -g groupname command

e adicionou uma regra iptables para marcar todo o tráfego proveniente de groupname

iptables -t mangle -A OUTPUT -m owner --gid-owner groupname -j MARK --set-mark 42

Depois disso, informamos ao iptables para algum SNAT e informamos ao ip route para usar uma tabela de roteamento especial para pacotes de tráfego marcados.

Problema: se a VPN falhar, há uma chance de que o programa especial a ser tunelado se comunique através da interface normal eth0.

Solução desejada: todo o tráfego marcado não deve passar diretamente pela eth0, ele precisa passar pelo tun0 primeiro.

Eu tentei os seguintes comandos que não funcionaram:

iptables -A OUTPUT -m owner --gid-owner groupname ! -o tun0 -j REJECT

iptables -A OUTPUT -m owner --gid-owner groupname -o eth0 -j REJECT

Pode ser o problema, que as regras de iptable acima não funcionaram devido ao facto de os pacotes serem primeiro marcados, depois colocados em tun0 e depois transmitidos por eth0 enquanto ainda estão marcados. Não sei como demarcá-los depois no tun0 ou para dizer iptables, que todo o pacote marcado pode passar a eth0, se eles estiverem em tun0 antes ou se eles vão para o gateway do meu provedor de VPN.

Alguém tem alguma ideia de uma solução?

Algumas informações de configuração:

iptables -nL -v --line-numbers -t mangle

Chain OUTPUT (policy ACCEPT 11M packets, 9798M bytes) 
num   pkts  bytes target     prot opt in     out     source       destination 
1     591K   50M   MARK       all  --  *      *       0.0.0.0/0    0.0.0.0/0   owner GID match 1005 MARK set 0x2a 
2    82812 6938K CONNMARK   all  --  *      *         0.0.0.0/0    0.0.0.0/0   owner GID match 1005 CONNMARK save

iptables -nL -v --line-numbers -t nat

Chain POSTROUTING (policy ACCEPT 393 packets, 23908 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       15  1052 SNAT       all  --  *      tun0    0.0.0.0/0            0.0.0.0/0           mark match 0x2a to:VPN_IP

ip rule add from all fwmark 42 lookup 42

ip route show table 42

default via VPN_IP dev tun0

    
por mr.simonski 07.11.2013 / 16:37

1 resposta

0

Basta adicionar a rota de baixa prioridade padrão para os pacotes marcados

ip rule add fwmark 42 table no.out
ip route add blackhole 0.0.0.0 metric 100 table no.out

e, estabelecendo nova conexão vpn deve configurar rota para a mesma marca, mas usando menor métrica.

    
por 09.12.2013 / 18:57