ip rule
tem uma opção priority
. A opção de prioridade é a primeira maneira pela qual a tabela de roteamento é escolhida. Uma regra com um valor priority
mais baixo será usada antes de uma mais alta. Chamando ip rule show
você verá as regras impressas com prioridade no lado esquerdo.
[priority]: [rule]
Por questões de integridade, uma citação de man ip-rule
:
priority PREFERENCE
the priority of this rule. PREFERENCE is an unsigned integer value, higher number means lower priority, and rules get processed in order of increasing number. Each rule should have an explicitly set unique priority value. The options preference and order are synonyms with priority.
Ênfase minha.
Então, antes de mais nada, é melhor usar uma prioridade única para cada regra, então não pode haver ambiguidade. No caso de regras com a mesma prioridade, elas serão avaliadas na ordem em que foram adicionadas. Se as regras forem mutuamente exclusivas, isso não é um grande risco (como duas regras que correspondem a diferentes IPs de origem de outros hosts). Se suas regras forem adicionadas automaticamente, isso provavelmente significa que o arquivo de regras que está em ordem alfabética primeiro será usado, o que não é uma ótima maneira de determinar o roteamento.
Como cheguei à conclusão de que as primeiras regras adicionadas são usadas:
- VM criada (vm1) com duas interfaces na mesma rede (192.168.0.1/24 e 192.168.0.2/24).
- Criada outra VM (vm2) na rede (192.168.0.3/24)
- Criadas duas tabelas de roteamento,
table1
etable2
na vm1
ip route add default dev eth0 table table1
ip route add default dev eth1 table table2
- Criado duas regras com prioridades diferentes
ip rule add to 192.168.0.3 table table1 priority 10
ip rule add to 192.168.0.3 table table2 priority 11
- ping vm2 da vm1
-
tcpdump -i eth0 host 192.168.0.3
mostra o ping -
tcpdump -i eth1 host 192.168.0.3
não
Este é o comportamento esperado de priority
- Adicione novamente a regra table2 com prioridade 10, o ping ainda aparece apenas em
eth0
.ip rule show
listastable1
regra antes detable2
regra. - Excluir a regra table1, o ping aparece na eth1.
- Adicionar novamente a regra table1, pingar ainda em eth1.
ip rule show
listastable2
regra antes detable1
.