Tengo un enrutador. Tiene algunas interfaces. Una de ellas es la VPN llamada vpn0, otra es la ruta predeterminada a la interfaz física, llamada out0 y una interfaz de entrada in0.
Los paquetes de in0 con el puerto de destino 993 nunca deben colocarse en out0. Hago esto marcando los paquetes así:
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
y para desactivar el reenvío en out0 hago lo siguiente:
iptables -A FORWARD -i in0 ! -o vpn0 --match-mark 100 -j DROP -m conntrack --ctstate NEW
El problema que tengo es con los paquetes de salida que provienen del host. Para destrozar paquetes vpn0 tengo estas reglas:
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
Lo cual funciona bastante bien. Lo único ocurre cuando vpn0 no funciona. Intenté agregar la regla:
iptables -A OUTPUT --protocol tcp --dport 993 -o out0 --match mark --mark 100 --jump DROP -m conntrack --ctstate NEW
Pero esto arroja paquetes que saldrían de la VPN. Verifiqué esto cambiando DROP a LOG y la interfaz de salida es out0, no vpn0.
¿Lo que da?