echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 prio 1
ip route add default via <gateway_IP> dev <interface> table isp2
Lo anterior no requiere ninguna marca de paquete con ipfilter. Funciona porque los paquetes salientes (respuesta) tendrán la dirección IP que se usó originalmente para conectarse a la segunda interfaz como dirección de origen (de) en el paquete saliente.
Los siguientes comandos crean una tabla de enrutamiento alternativa a través de eth1
para paquetes que tienen la marca 1 (excepto paquetes a localhost). El ip
El comando es de la suite iproute2 (Ubuntu:iproute Install iproute http://bit.ly/software-small, iproute-doc Install iproute-doc http://bit.ly/software-small).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1
La otra mitad del trabajo es reconocer paquetes que deben obtener la marca 1; luego usa iptables -t mangle -A OUTPUT … -j MARK --set-mark 1
en estos paquetes para enrutarlos a través de la tabla de enrutamiento 1. Creo que lo siguiente debería hacerlo (reemplazar 1.2.3.4 por la dirección de la interfaz de ruta no predeterminada):
iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1
No estoy seguro de si eso es suficiente, tal vez se necesite otra regla en los paquetes entrantes para decirle al módulo de control que los rastree.
Tuve problemas con los paquetes generados localmente con la solución sugerida por Peter, descubrí que lo siguiente corrige eso:
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2
ip rule add iif <interface> table isp2 priority 1000