Eu tenho um roteador. Possui algumas interfaces. Uma delas é a VPN chamada vpn0, uma é a rota padrão para a interface física, chamada out0 e uma interface de entrada in0.
Pacotes de in0 com porta de destino 993 nunca devem ser colocados em out0. Eu faço isso marcando os pacotes assim:
iptables -t mangle -A PREROUTING -i in0 -p tcp --dport 993 -j MASK --set-mark 100
iptables -t mangle -A PREROUTING -i in0 -p tcp --dport 993 -j CONNMARK --save-mark
e para desabilitar o encaminhamento em out0 eu faço o seguinte:
iptables -A FORWARD -i in0 ! -o vpn0 --match-mark 100 -j DROP -m conntrack --ctstate NEW
O problema que estou tendo é com pacotes de saída vindos do host. Para desfigurar pacotes vpn0, tenho estas regras:
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump MARK --set-mark 100
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump CONNMARK --save-mark
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump RETURN
O que funciona muito bem. Isso ocorre apenas quando o vpn0 não está funcionando. Tentei adicionar a regra:
iptables -A OUTPUT --protocol tcp --dport 993 -o out0 --match mark --mark 100 --jump DROP -m conntrack --ctstate NEW
Mas isso descarta pacotes que sairiam da VPN. Eu verifiquei isso alterando DROP para LOG e a interface de saída é out0, não vpn0.
O que da?