Eu tenho um Firewall / Router baseado em Linux rodando iptables e SNAT para o tráfego que passa através dele para a Internet através de um único uplink - Isso está funcionando bem. Há também um pequeno número de aplicativos em execução neste servidor que também funcionam bem.
Eu também tenho um cliente OpenVPN rodando neste roteador, e estou querendo rotear o tráfego de um determinado usuário local por este túnel.
Eu tenho o túnel instalado e funcionando, o que criou uma interface tun_v.
Eu criei uma nova tabela de roteamento (/ etc / iproute2 / rt_tables) v.tunnel e estou adicionando uma única rota padrão nesta tabela no túnel.
Eu criei uma regra de IP para usar esta tabela para o tráfego marcado com 1
Marcar o tráfego do meu usuário com 1.
ip route add default via 172.25.26.61 dev tun_v table v.tunnel
ip rule add fwmark 1 table v.tunnel
iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-xmark 0x1/0xffffffff
Também estou mascarando o tráfego no roteador:
iptables -t nat -A POSTROUTING -o wan -j MASQUERADE #this is normal NAT to the Internet
iptables -t nat -A POSTROUTING -o tun_v -j MASQUERADE #For the tunnel
O firewall também desativa as cadeias de entrada (e encaminhamento), portanto, permito que haja uma relação:
iptables -A INPUT -i wan -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun_v -m state --state RELATED,ESTABLISHED -j ACCEPT (there are some other firewall rules but not related to this)
Se eu gerar tráfego deste usuário (com o uid 1002) e tcpdump a interface tun_v, eu posso ver meu pacote apagado e a resposta voltar. No entanto, nunca vejo o pacote chegar ao meu aplicativo. ping não mostra nenhuma resposta, tentando estabelecer uma conexão TCP Eu vejo o SYN sair, o SYNACK volta e então uma retransmissão TCP do SYN sai.
Se eu adicionar uma rota "normal" que use este túnel, por exemplo,
ip route add a.b.c.d via 172.25.26.61
então eu posso (de qualquer usuário) fazer o ping no servidor especificado.
Tenho certeza de que há algo mais que estou perdendo, mas não consigo ver o que. Pelo que entendi, a rota que funciona para todos os usuários para a.b.c.d (tabela principal) significa que o túnel e todas as regras do iptables estão corretas. A marcação do tráfego está funcionando e aplicando a regra correta também está funcionando, porque eu posso ver o pacote deixar a interface correta, e uma resposta voltar.
Parece que existe uma regra de firewall em algum lugar que causa o problema, mas como mencionado acima, a regra de teste no túnel para a.b.c.d funciona.
Se eu apagar a MARK do iptables, então todo o tráfego do UID 1002 funciona (através da interface wan normal).
Qualquer ajuda ou sugestão seria recebida com gratidão!