Eu resolvi e documentei aqui: link
Isso fará com que o kernel rotule permanentemente os pacotes, habilite várias rotas e até mesmo redes não atestadas na máquina:
nano /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done
Isto irá inicializar o iptables e, em particular, mangle e nat, que são necessários para marcar o tráfego:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
adicione a edição de rotas alternativas:
nano /etc/iproute2/rt_tables
Adicionar (nomes são suas referências):
1 tunnel0
2 tunnel1
adicione rotas e regras, usamos IDs de tabelas em vez de nomes mais imediatos. Como você pode notar, o gateway é irrelevante, especialmente para túneis que podem ter gateways dinâmicos:
ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2
adicione regras para marcar o tráfego e vincular-se à tabela correspondente:
ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache
verifique se você gosta:
ip route show table 1
ip route show table 2
ip rule show
Se você perder alguma coisa, pode excluir desta forma:
ip rule del table 1
ip route flush table 1
AGORA A PARTE AUSENTE: ISSO NÃO VAI TRABALHAR:
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1
ESTE VAI:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save
Você precisa selecionar tráfego e enviá-lo simultaneamente em um dispositivo / túnel? Não tem problema, eu resolvi isso também:
iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80
NAT obrigatório para resposta
iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE
iptables-save