A tabela de roteamento é usada na ordem da mais específica para a menos específica.
No entanto, no linux é um pouco mais complicado do que você poderia esperar. Em primeiro lugar, há mais de uma tabela de roteamento e quando a tabela de roteamento é usada depende de várias regras.
Para obter uma imagem completa:
$ ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
$ ip route show table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev eth0 proto kernel scope link src 192.168.1.27
local 192.168.1.27 dev eth0 proto kernel scope host src 192.168.1.27
broadcast 192.168.1.255 dev eth0 proto kernel scope link src 192.168.1.27
$ ip route show table main
default via 192.168.1.254 dev eth0
192.168.0.0/23 dev eth0 proto kernel scope link src 192.168.1.27
$ ip route show table default
$
A tabela local
é a tabela de roteamento especial que contém rotas de controle de alta prioridade para endereços locais e de broadcast.
A tabela main
é a tabela de roteamento normal que contém todas as rotas que não são de política. Esta é também a tabela que você consegue ver se simplesmente executa ip route show
(ou ip ro
para abreviar). Eu recomendo não usar mais o antigo comando route
, pois ele mostra apenas a tabela main
e seu formato de saída é um tanto arcaico.
A tabela default
está vazia e reservada para o pós-processamento, se as regras padrão anteriores não selecionassem o pacote.
Você pode adicionar suas próprias tabelas e adicionar regras para usá-las em casos específicos. Um exemplo é se você tem duas conexões com a Internet, mas um host ou sub-rede deve sempre ser roteado através de uma conexão com a Internet.
O livro Roteamento de políticas com o Linux explica tudo isso com detalhes excelentes.