Sua tabela de roteamento não está sendo ignorada, exatamente. Está sendo anulada por uma tabela de roteamento de prioridade mais alta.
O que está acontecendo
A tabela de roteamento que você vê quando digita ip route show
não é a única tabela de roteamento usada pelo kernel. Na verdade, há três tabelas de roteamento por padrão e elas são pesquisadas na ordem mostrada pelo comando ip rule
:
# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
A tabela com a qual você está mais familiarizado é main
, mas a tabela de roteamento de maior prioridade é local
. Esta tabela é gerenciada pelo kernel para rastrear rotas locais e de broadcast: em outras palavras, a tabela local
informa ao kernel como rotear para os endereços de suas próprias interfaces. Parece algo assim:
# 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.1.0 dev eth0 proto kernel scope link src 192.168.1.2
local 192.168.1.1 dev tun0 proto kernel scope host src 192.168.1.1
local 192.168.1.2 dev eth0 proto kernel scope host src 192.168.1.2
broadcast 192.168.1.255 dev eth0 proto kernel scope link src 192.168.1.2
Confira essa linha fazendo referência a tun0
. Isso é o que está causando seus resultados estranhos de route get
. Ele diz que 192.168.1.1 é um endereço local, o que significa que, se quisermos enviar uma resposta ARP para 192.168.1.1, é fácil; nós enviamos para nós mesmos. E como encontramos uma rota na tabela local
, paramos de procurar uma rota e não nos preocupamos em verificar as tabelas main
ou default
.
Por que várias tabelas?
No mínimo, é bom poder digitar ip route
e não ver todas essas rotas "óbvias" atravancando a exibição (tente digitar route print
em uma máquina Windows). Ele também pode servir como proteção mínima contra configuração incorreta: mesmo se a tabela de roteamento principal estiver confusa, o kernel ainda sabe como falar consigo mesmo.
(Por que manter as rotas locais em primeiro lugar? Assim, o kernel pode usar o mesmo código de pesquisa para endereços locais, como faz para todo o resto. Isso torna as coisas mais simples internamente.)
Existem outras coisas interessantes que você pode fazer com este esquema de múltiplas tabelas. Em particular, você pode adicionar suas próprias tabelas e especificar regras para quando elas forem pesquisadas. Isso é chamado de "roteamento de políticas", e se você já quis rotear um pacote com base no seu endereço source , é assim que é feito no Linux.
Se você estiver fazendo coisas especialmente complicadas ou experimentais, adicione ou remova local
de rotas, especificando table local
no comando ip route
. A menos que você saiba o que está fazendo, é provável que confunda o kernel. E, claro, o kernel ainda continuará adicionando e removendo suas próprias rotas, então você tem que assistir para ter certeza que o seu não seja sobrescrito.
Finalmente, se você quiser ver todas as tabelas de roteamento de uma só vez:
# ip route show table all
Para mais informações, confira a página do manual ip-rule(8)
ou os iproute2 docs . Você também pode tentar o HOWTO de controle avançado de tráfego e roteamento para obter alguns exemplos do que você pode fazer.