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