La respuesta de mefat me ayudó mucho, pero en lugar de una copia única de todas las reglas de la tabla principal en las dos tablas de ISP, un mejor enfoque podría ser usar el prio de regla para agregar las reglas predeterminadas después de la tabla principal.
Configure / etc / iproute2 / rt_tables como de costumbre:
...
10 ISP1
20 ISP2
...
Tenga en cuenta que
ip rule show
Muestra las reglas 0-> local, 32766-> main y 32767-> default. Ver man ip
para más detalles.
Crucialmente, el proceso de enrutamiento funcionará desde las reglas de prio bajo a las de prio alto ... pero 32767 no es la regla más alta #. Entonces, si la tabla de enrutamiento principal no tiene una ruta predeterminada (pero puede contener todo tipo de rutas que cambian dinámicamente para vpns, etc.), si no se realiza una coincidencia, se convierte en predeterminada (normalmente vacía) y luego busca reglas de prio más altas.
Vea la sección 'tirar' aquí: http://linux-ip.net/html/routing-tables.html
Así que ahora configura
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
y para asegurarse de que se vean después de la mesa principal:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
Utilizar
ip rule show
nuevamente para verificar que estas reglas son más altas que las principales
Luego use CONNMARK destrozando como mefat dijo:
# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
Cosas a tener en cuenta: pppd necesita lo nodefaultroute
contrario, se configura en main; cuando un dispositivo se reinicia, las tablas ISP1 / ISP2 se limpian, por lo que deben restaurarse mediante un script.
Yo uso un script en /etc/ppp/ip-{up,down}.d/dual-routing
# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1
RULENUM=4
set_balance() {
iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}
# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2
Este es un equilibrio de carga basado en la conexión, así que voy a ver el uso de la carga para monitorear y reemplazar la regla de estadísticas: iptables -t mangle -R PREROUTING <n>
desde el espacio del usuario. Entonces, si hay una descarga de larga duración en una conexión y la otra conexión está ligeramente cargada, deberíamos preferir la conexión con poca carga.