A resposta da mefat me ajudou muito, mas em vez de uma cópia única de todas as regras da tabela principal nas duas tabelas ISP, uma abordagem melhor pode ser usar o prio da regra para adicionar as regras padrão depois da tabela principal.
Configure / etc / iproute2 / rt_tables como normal:
...
10 ISP1
20 ISP2
...
Observe que
ip rule show
Mostra as regras 0-> local, 32766-> principal e 32767-> padrão. Veja man ip
para mais detalhes.
Crucialmente, o processo de roteamento funcionará das regras de baixo prio a alto prio ... mas 32767 não é a regra mais alta #. Portanto, se a tabela de roteamento principal não tiver uma rota padrão (mas pode conter todos os tipos de rotas dinamicamente alteradas para vpns etc.), se uma correspondência não for feita, ela retornará ao padrão (normalmente vazio) e procurará regras mais altas.
Veja a seção 'throw' aqui: http://linux-ip.net/html/routing-tables.html
Então agora configure
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
e para garantir que eles sejam vistos depois da tabela principal:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
Usar
ip rule show
novamente para verificar se essas regras são superiores às principais
Em seguida, use CONNMARK mangling como mefat disse:
# 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
O que deve ser observado: o pppd precisa, nodefaultroute
caso contrário, ele será configurado no main; Quando um dispositivo reinicia, as tabelas ISP1 / ISP2 são limpas e, portanto, precisam ser restauradas usando um script.
Eu uso um script em /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
Isso é balanceamento de carga baseado em conexão, por isso vou usar o load para monitorar e substituir a regra de estatísticas: iptables -t mangle -R PREROUTING <n>
no espaço do usuário. Portanto, se houver um download de uma execução demorada em uma conexão e a outra estiver levemente carregada, devemos preferir a conexão levemente carregada.